##// END OF EJS Templates
current revision will show workdir state, not the latest revision
current revision will show workdir state, not the latest revision

File last commit:

r3773:8e2cd46f beta
r3796:2b5f94fc beta
Show More
feed.py
179 lines | 7.0 KiB | text/x-python | PythonLexer
updated docs on every controller
r861 # -*- coding: utf-8 -*-
"""
rhodecode.controllers.feed
~~~~~~~~~~~~~~~~~~~~~~~~~~
Feed controller for rhodecode
source code cleanup: remove trailing white space, normalize file endings
r1203
updated docs on every controller
r861 :created_on: Apr 23, 2010
:author: marcink
2012 copyrights
r1824 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
updated docs on every controller
r861 :license: GPLv3, see COPYING for more details.
"""
fixed license issue #149
r1206 # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
source code cleanup: remove trailing white space, normalize file endings
r1203 #
renamed project to rhodecode
r547 # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
source code cleanup: remove trailing white space, normalize file endings
r1203 #
renamed project to rhodecode
r547 # You should have received a copy of the GNU General Public License
fixed license issue #149
r1206 # along with this program. If not, see <http://www.gnu.org/licenses/>.
updated docs on every controller
r861
import logging
another major codes rewrite:...
r1045 from pylons import url, response, tmpl_context as c
another major code rafactor, reimplemented (almost from scratch)...
r1038 from pylons.i18n.translation import _
security bugfix: protected feeds, from unauthorized access, even without this, the feeds would crash and were unreadable, But proper way of securing it is with the secure decarators.
r862
added caching layer into RSS/ATOM feeds...
r3018 from beaker.cache import cache_region, region_invalidate
Improved RSS/ATOM feeds...
r2385 from webhelpers.feedgenerator import Atom1Feed, Rss201rev2Feed
from rhodecode.lib import helpers as h
security bugfix: protected feeds, from unauthorized access, even without this, the feeds would crash and were unreadable, But proper way of securing it is with the secure decarators.
r862 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
another major codes rewrite:...
r1045 from rhodecode.lib.base import BaseRepoController
added caching layer into RSS/ATOM feeds...
r3018 from rhodecode.lib.diffs import DiffProcessor, LimitedDiffContainer
from rhodecode.model.db import CacheInvalidation
fixed #746 unicodeDedode errors on feed controllers
r3292 from rhodecode.lib.utils2 import safe_int, str2bool, safe_unicode
updated docs on every controller
r861
renamed project to rhodecode
r547 log = logging.getLogger(__name__)
pep8ify
r1212
another major codes rewrite:...
r1045 class FeedController(BaseRepoController):
updated docs on every controller
r861
fixed some bugs in api key auth, added access by api key into rss/atom feeds in global journal...
r1120 @LoginRequired(api_access=True)
security bugfix: protected feeds, from unauthorized access, even without this, the feeds would crash and were unreadable, But proper way of securing it is with the secure decarators.
r862 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
'repository.admin')
renamed project to rhodecode
r547 def __before__(self):
super(FeedController, self).__before__()
#common values for feeds
another major code rafactor, reimplemented (almost from scratch)...
r1038 self.description = _('Changes on %s repository')
made simple global rss and atom feed
r1088 self.title = self.title = _('%s %s feed') % (c.rhodecode_name, '%s')
renamed project to rhodecode
r547 self.language = 'en-us'
self.ttl = "5"
Implemented #661 Add option to include diff in RSS feed...
r3028 import rhodecode
CONF = rhodecode.CONFIG
self.include_diff = str2bool(CONF.get('rss_include_diff', False))
self.feed_nr = safe_int(CONF.get('rss_items_per_page', 20))
added caching layer into RSS/ATOM feeds...
r3018 # we need to protect from parsing huge diffs here other way
Implemented #661 Add option to include diff in RSS feed...
r3028 # we can kill the server
fix safe_int default arg
r3030 self.feed_diff_limit = safe_int(CONF.get('rss_cut_off_limit', 32 * 1024))
renamed project to rhodecode
r547
added short_id to feeds, and made it more compact
r1897 def _get_title(self, cs):
Improved RSS/ATOM feeds...
r2385 return "%s" % (
h.shorter(cs.message, 160)
added short_id to feeds, and made it more compact
r1897 )
fixed wrong order of changes in feeds...
r1162 def __changes(self, cs):
Removed all string concat for exchange of ''.join()
r1359 changes = []
added caching layer into RSS/ATOM feeds...
r3018 diff_processor = DiffProcessor(cs.diff(),
diff_limit=self.feed_diff_limit)
_parsed = diff_processor.prepare(inline_diff=False)
limited_diff = False
if isinstance(_parsed, LimitedDiffContainer):
limited_diff = True
for st in _parsed:
Improved RSS/ATOM feeds...
r2385 st.update({'added': st['stats'][0],
'removed': st['stats'][1]})
changes.append('\n %(operation)s %(filename)s '
'(%(added)s lines added, %(removed)s lines removed)'
% st)
added caching layer into RSS/ATOM feeds...
r3018 if limited_diff:
changes = changes + ['\n ' +
_('Changeset was too big and was cut off...')]
Implemented #661 Add option to include diff in RSS feed...
r3028 return diff_processor, changes
fixed wrong order of changes in feeds...
r1162
Improved RSS/ATOM feeds...
r2385 def __get_desc(self, cs):
desc_msg = []
Mads Kiilerich
Fix a lot of casings - use standard casing in most places
r3654 desc_msg.append((_('%s committed on %s')
% (h.person(cs.author), h.fmt_date(cs.date))) + '<br/>')
implements #632,...
r2980 #branches, tags, bookmarks
if cs.branch:
desc_msg.append('branch: %s<br/>' % cs.branch)
if h.is_hg(c.rhodecode_repo):
for book in cs.bookmarks:
desc_msg.append('bookmark: %s<br/>' % book)
for tag in cs.tags:
desc_msg.append('tag: %s<br/>' % tag)
Implemented #661 Add option to include diff in RSS feed...
r3028 diff_processor, changes = self.__changes(cs)
implements #632,...
r2980 # rev link
_url = url('changeset_home', repo_name=cs.repository.name,
revision=cs.raw_id, qualified=True)
Mads Kiilerich
Fix a lot of casings - use standard casing in most places
r3654 desc_msg.append('changeset: <a href="%s">%s</a>' % (_url, cs.raw_id[:8]))
implements #632,...
r2980
Improved RSS/ATOM feeds...
r2385 desc_msg.append('<pre>')
desc_msg.append(cs.message)
desc_msg.append('\n')
Implemented #661 Add option to include diff in RSS feed...
r3028 desc_msg.extend(changes)
if self.include_diff:
desc_msg.append('\n\n')
desc_msg.append(diff_processor.as_raw())
Improved RSS/ATOM feeds...
r2385 desc_msg.append('</pre>')
fixed #746 unicodeDedode errors on feed controllers
r3292 return map(safe_unicode, desc_msg)
fixed wrong order of changes in feeds...
r1162
renamed project to rhodecode
r547 def atom(self, repo_name):
"""Produce an atom-1.0 feed via feedgenerator module"""
added caching layer into RSS/ATOM feeds...
r3018
@cache_region('long_term')
Mads Kiilerich
invalidate: encapsulate how key is generated from repo_name and kind
r3773 def _get_feed_from_cache(key, kind):
added caching layer into RSS/ATOM feeds...
r3018 feed = Atom1Feed(
title=self.title % repo_name,
link=url('summary_home', repo_name=repo_name,
qualified=True),
description=self.description % repo_name,
language=self.language,
ttl=self.ttl
)
added short_id to feeds, and made it more compact
r1897
added caching layer into RSS/ATOM feeds...
r3018 for cs in reversed(list(c.rhodecode_repo[-self.feed_nr:])):
feed.add_item(title=self._get_title(cs),
link=url('changeset_home', repo_name=repo_name,
revision=cs.raw_id, qualified=True),
author_name=cs.author,
description=''.join(self.__get_desc(cs)),
pubdate=cs.date,
)
updated docs on every controller
r861
added caching layer into RSS/ATOM feeds...
r3018 response.content_type = feed.mime_type
return feed.writeString('utf-8')
Mads Kiilerich
invalidate: encapsulate how key is generated from repo_name and kind
r3773 kind = 'ATOM'
valid = CacheInvalidation.test_and_set_valid(repo_name, kind)
Mads Kiilerich
invalidation: merge .invalidate and .set_valid as .test_and_set_valid...
r3772 if not valid:
Mads Kiilerich
invalidate: encapsulate how key is generated from repo_name and kind
r3773 region_invalidate(_get_feed_from_cache, None, repo_name, kind)
return _get_feed_from_cache(repo_name, kind)
renamed project to rhodecode
r547
def rss(self, repo_name):
"""Produce an rss2 feed via feedgenerator module"""
added caching layer into RSS/ATOM feeds...
r3018
@cache_region('long_term')
Mads Kiilerich
invalidate: encapsulate how key is generated from repo_name and kind
r3773 def _get_feed_from_cache(key, kind):
added caching layer into RSS/ATOM feeds...
r3018 feed = Rss201rev2Feed(
title=self.title % repo_name,
link=url('summary_home', repo_name=repo_name,
qualified=True),
description=self.description % repo_name,
language=self.language,
ttl=self.ttl
)
added short_id to feeds, and made it more compact
r1897
added caching layer into RSS/ATOM feeds...
r3018 for cs in reversed(list(c.rhodecode_repo[-self.feed_nr:])):
feed.add_item(title=self._get_title(cs),
link=url('changeset_home', repo_name=repo_name,
revision=cs.raw_id, qualified=True),
author_name=cs.author,
description=''.join(self.__get_desc(cs)),
pubdate=cs.date,
)
updated docs on every controller
r861
added caching layer into RSS/ATOM feeds...
r3018 response.content_type = feed.mime_type
return feed.writeString('utf-8')
Mads Kiilerich
invalidate: encapsulate how key is generated from repo_name and kind
r3773 kind = 'RSS'
valid = CacheInvalidation.test_and_set_valid(repo_name, kind)
Mads Kiilerich
invalidation: merge .invalidate and .set_valid as .test_and_set_valid...
r3772 if not valid:
Mads Kiilerich
invalidate: encapsulate how key is generated from repo_name and kind
r3773 region_invalidate(_get_feed_from_cache, None, repo_name, kind)
return _get_feed_from_cache(repo_name, kind)