##// END OF EJS Templates
follow Python conventions for boolean values...
follow Python conventions for boolean values True and False might be singletons and the "default" values for "boolean" expressions, but "all" values in Python has a boolean value and should be evaluated as such. Checking with 'is True' and 'is False' is thus confusing, error prone and unnessarily complex. If we anywhere rely and nullable boolean fields from the database layer and don't want the null value to be treated as False then we should check explicitly for null with 'is None'.

File last commit:

r3625:260a7a01 beta
r3625:260a7a01 beta
Show More
notifications.py
173 lines | 6.8 KiB | text/x-python | PythonLexer
2012 copyrights
r1824 # -*- coding: utf-8 -*-
"""
rhodecode.controllers.admin.notifications
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
notifications controller for RhodeCode
:created_on: Nov 23, 2010
:author: marcink
:copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
:license: GPLv3, see COPYING for more details.
"""
# 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.
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
Notification system improvements...
r1712 import logging
Tests updates, Session refactoring
r1713 import traceback
Notification system improvements...
r1712
mark all read button for notifications
r1791 from pylons import request
Tests updates, Session refactoring
r1713 from pylons import tmpl_context as c, url
fix to strict permission check on notification messages
r3428 from pylons.controllers.util import redirect, abort
Notification system improvements...
r1712
notification inbox improvements...
r2190 from webhelpers.paginate import Page
Notification system improvements...
r1712 from rhodecode.lib.base import BaseController, render
from rhodecode.model.db import Notification
from rhodecode.model.notification import NotificationModel
forbid notifications view for anonymous users
r1739 from rhodecode.lib.auth import LoginRequired, NotAnonymous
Notification system improvements...
r1712 from rhodecode.lib import helpers as h
Tests updates, Session refactoring
r1713 from rhodecode.model.meta import Session
failsafe the GET `page` argument
r2845 from rhodecode.lib.utils2 import safe_int
- refactoring to overcome poor usage of global pylons config...
r1723
Notification system improvements...
r1712
log = logging.getLogger(__name__)
mark all read button for notifications
r1791
Notification system improvements...
r1712 class NotificationsController(BaseController):
"""REST Controller styled on the Atom Publishing Protocol"""
# To properly map this controller, ensure your config/routing.py
# file has a resource setup:
auto white-space removal
r1818 # map.resource('notification', 'notifications', controller='_admin/notifications',
Notification system improvements...
r1712 # path_prefix='/_admin', name_prefix='_admin_')
@LoginRequired()
forbid notifications view for anonymous users
r1739 @NotAnonymous()
Notification system improvements...
r1712 def __before__(self):
super(NotificationsController, self).__before__()
def index(self, format='html'):
"""GET /_admin/notifications: All items in the collection"""
# url('notifications')
c.user = self.rhodecode_user
Added pull requests filter into notification inbox....
r2433 notif = NotificationModel().get_for_user(self.rhodecode_user.user_id,
Added filtering on inbox by comments
r2503 filter_=request.GET.getall('type'))
failsafe the GET `page` argument
r2845
p = safe_int(request.params.get('page', 1), 1)
notification inbox improvements...
r2190 c.notifications = Page(notif, page=p, items_per_page=10)
Added pull requests filter into notification inbox....
r2433 c.pull_request_type = Notification.TYPE_PULL_REQUEST
Added filtering on inbox by comments
r2503 c.comment_type = [Notification.TYPE_CHANGESET_COMMENT,
Notification.TYPE_PULL_REQUEST_COMMENT]
add highlight of current filter in notifications
r2519
_current_filter = request.GET.getall('type')
c.current_filter = 'all'
if _current_filter == [c.pull_request_type]:
c.current_filter = 'pull_request'
elif _current_filter == c.comment_type:
c.current_filter = 'comment'
Notification system improvements...
r1712 return render('admin/notifications/notifications.html')
mark all read button for notifications
r1791 def mark_all_read(self):
if request.environ.get('HTTP_X_PARTIAL_XHR'):
nm = NotificationModel()
# mark all read
Added pull requests filter into notification inbox....
r2433 nm.mark_all_read_for_user(self.rhodecode_user.user_id,
Added filtering on inbox by comments
r2503 filter_=request.GET.getall('type'))
sqlalchemy sessions cleanup in admin...
r2662 Session().commit()
mark all read button for notifications
r1791 c.user = self.rhodecode_user
Added pull requests filter into notification inbox....
r2433 notif = nm.get_for_user(self.rhodecode_user.user_id,
Added filtering on inbox by comments
r2503 filter_=request.GET.getall('type'))
notification inbox improvements...
r2190 c.notifications = Page(notif, page=1, items_per_page=10)
mark all read button for notifications
r1791 return render('admin/notifications/notifications_data.html')
Notification system improvements...
r1712 def create(self):
"""POST /_admin/notifications: Create a new item"""
# url('notifications')
def new(self, format='html'):
"""GET /_admin/notifications/new: Form to create a new item"""
# url('new_notification')
def update(self, notification_id):
"""PUT /_admin/notifications/id: Update an existing item"""
# Forms posted to this method should contain a hidden field:
# <input type="hidden" name="_method" value="PUT" />
# Or using helpers:
# h.form(url('notification', notification_id=ID),
# method='put')
# url('notification', notification_id=ID)
added mark as read for single notifications
r2610 try:
no = Notification.get(notification_id)
Mads Kiilerich
access control: fix owner checks - they were always true...
r3141 owner = all(un.user.user_id == c.rhodecode_user.user_id
for un in no.notifications_to_users)
added mark as read for single notifications
r2610 if h.HasPermissionAny('hg.admin')() or owner:
NotificationModel().mark_read(c.rhodecode_user.user_id, no)
sqlalchemy sessions cleanup in admin...
r2662 Session().commit()
added mark as read for single notifications
r2610 return 'ok'
except Exception:
fix to strict permission check on notification messages
r3428 Session().rollback()
added mark as read for single notifications
r2610 log.error(traceback.format_exc())
return 'fail'
Notification system improvements...
r1712
def delete(self, notification_id):
"""DELETE /_admin/notifications/id: Delete an existing item"""
# Forms posted to this method should contain a hidden field:
# <input type="hidden" name="_method" value="DELETE" />
# Or using helpers:
# h.form(url('notification', notification_id=ID),
# method='delete')
# url('notification', notification_id=ID)
Tests updates, Session refactoring
r1713 try:
no = Notification.get(notification_id)
Mads Kiilerich
access control: fix owner checks - they were always true...
r3141 owner = all(un.user.user_id == c.rhodecode_user.user_id
for un in no.notifications_to_users)
added mark as read for single notifications
r2610 if h.HasPermissionAny('hg.admin')() or owner:
Tests updates, Session refactoring
r1713 NotificationModel().delete(c.rhodecode_user.user_id, no)
sqlalchemy sessions cleanup in admin...
r2662 Session().commit()
Tests updates, Session refactoring
r1713 return 'ok'
except Exception:
fix to strict permission check on notification messages
r3428 Session().rollback()
Tests updates, Session refactoring
r1713 log.error(traceback.format_exc())
Notification system improvements...
r1712 return 'fail'
def show(self, notification_id, format='html'):
"""GET /_admin/notifications/id: Show a specific item"""
# url('notification', notification_id=ID)
c.user = self.rhodecode_user
Tests updates, Session refactoring
r1713 no = Notification.get(notification_id)
fix to strict permission check on notification messages
r3428 owner = any(un.user.user_id == c.rhodecode_user.user_id
Mads Kiilerich
access control: fix owner checks - they were always true...
r3141 for un in no.notifications_to_users)
fix to strict permission check on notification messages
r3428
Tests updates, Session refactoring
r1713 if no and (h.HasPermissionAny('hg.admin', 'repository.admin')() or owner):
unotification = NotificationModel()\
.get_user_notification(c.user.user_id, no)
Notification system improvements...
r1712
Tests updates, Session refactoring
r1713 # if this association to user is not valid, we don't want to show
# this message
if unotification:
Mads Kiilerich
follow Python conventions for boolean values...
r3625 if not unotification.read:
Tests updates, Session refactoring
r1713 unotification.mark_as_read()
sqlalchemy sessions cleanup in admin...
r2662 Session().commit()
Tests updates, Session refactoring
r1713 c.notification = no
Notification system improvements...
r1712
Tests updates, Session refactoring
r1713 return render('admin/notifications/show_notification.html')
Notification system improvements...
r1712
fix to strict permission check on notification messages
r3428 return abort(403)
Notification system improvements...
r1712
def edit(self, notification_id, format='html'):
"""GET /_admin/notifications/id/edit: Form to edit an existing item"""
# url('edit_notification', notification_id=ID)