feed.py
134 lines
| 4.9 KiB
| text/x-python
|
PythonLexer
r861 | # -*- coding: utf-8 -*- | |||
""" | ||||
rhodecode.controllers.feed | ||||
~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
Feed controller for rhodecode | ||||
r1203 | ||||
r861 | :created_on: Apr 23, 2010 | |||
:author: marcink | ||||
r1824 | :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com> | |||
r861 | :license: GPLv3, see COPYING for more details. | |||
""" | ||||
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. | ||||
r1203 | # | |||
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. | ||||
r1203 | # | |||
r547 | # You should have received a copy of the GNU General Public License | |||
r1206 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
r861 | ||||
import logging | ||||
r1045 | from pylons import url, response, tmpl_context as c | |||
r1038 | from pylons.i18n.translation import _ | |||
r862 | ||||
r2385 | from webhelpers.feedgenerator import Atom1Feed, Rss201rev2Feed | |||
from rhodecode.lib import helpers as h | ||||
r862 | from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator | |||
r1045 | from rhodecode.lib.base import BaseRepoController | |||
r2385 | from rhodecode.lib.diffs import DiffProcessor | |||
r861 | ||||
r547 | log = logging.getLogger(__name__) | |||
r1212 | ||||
r1045 | class FeedController(BaseRepoController): | |||
r861 | ||||
r1120 | @LoginRequired(api_access=True) | |||
r862 | @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', | |||
'repository.admin') | ||||
r547 | def __before__(self): | |||
super(FeedController, self).__before__() | ||||
#common values for feeds | ||||
r1038 | self.description = _('Changes on %s repository') | |||
r1088 | self.title = self.title = _('%s %s feed') % (c.rhodecode_name, '%s') | |||
r547 | self.language = 'en-us' | |||
self.ttl = "5" | ||||
r2385 | self.feed_nr = 20 | |||
r547 | ||||
r1897 | def _get_title(self, cs): | |||
r2385 | return "%s" % ( | |||
h.shorter(cs.message, 160) | ||||
r1897 | ) | |||
r1162 | def __changes(self, cs): | |||
r1359 | changes = [] | |||
r2783 | _diff = cs.diff() | |||
# we need to protect from parsing huge diffs here other way | ||||
# we can kill the server, 32*1024 chars is a reasonable limit | ||||
HUGE_DIFF = 32 * 1024 | ||||
if len(_diff) > HUGE_DIFF: | ||||
changes = ['\n ' + _('Changeset was too big and was cut off...')] | ||||
return changes | ||||
diffprocessor = DiffProcessor(_diff) | ||||
r2385 | stats = diffprocessor.prepare(inline_diff=False) | |||
for st in stats: | ||||
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) | ||||
return changes | ||||
r1162 | ||||
r2385 | def __get_desc(self, cs): | |||
desc_msg = [] | ||||
desc_msg.append('%s %s %s:<br/>' % (cs.author, _('commited on'), | ||||
Vincent Duvert
|
r2419 | h.fmt_date(cs.date))) | ||
r2385 | desc_msg.append('<pre>') | |||
desc_msg.append(cs.message) | ||||
desc_msg.append('\n') | ||||
desc_msg.extend(self.__changes(cs)) | ||||
desc_msg.append('</pre>') | ||||
return desc_msg | ||||
r1162 | ||||
r547 | def atom(self, repo_name): | |||
"""Produce an atom-1.0 feed via feedgenerator module""" | ||||
r1897 | 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 | ||||
) | ||||
r1162 | for cs in reversed(list(c.rhodecode_repo[-self.feed_nr:])): | |||
r1897 | feed.add_item(title=self._get_title(cs), | |||
r547 | link=url('changeset_home', repo_name=repo_name, | |||
r636 | revision=cs.raw_id, qualified=True), | |||
r1162 | author_name=cs.author, | |||
r2385 | description=''.join(self.__get_desc(cs)), | |||
pubdate=cs.date, | ||||
) | ||||
r861 | ||||
r547 | response.content_type = feed.mime_type | |||
return feed.writeString('utf-8') | ||||
def rss(self, repo_name): | ||||
"""Produce an rss2 feed via feedgenerator module""" | ||||
r1897 | 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 | ||||
) | ||||
r1162 | for cs in reversed(list(c.rhodecode_repo[-self.feed_nr:])): | |||
r1897 | feed.add_item(title=self._get_title(cs), | |||
r547 | link=url('changeset_home', repo_name=repo_name, | |||
r636 | revision=cs.raw_id, qualified=True), | |||
r1162 | author_name=cs.author, | |||
r2385 | description=''.join(self.__get_desc(cs)), | |||
pubdate=cs.date, | ||||
r1162 | ) | |||
r861 | ||||
r547 | response.content_type = feed.mime_type | |||
return feed.writeString('utf-8') | ||||