changeset 2433:74f2910f7ad9 codereview

Added pull requests filter into notification inbox. - Mark all read now also marks only filtered results
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 10 Jun 2012 00:08:29 +0200
parents d3ac7491a5c8
children f29469677319
files rhodecode/controllers/admin/notifications.py rhodecode/model/notification.py rhodecode/templates/admin/notifications/notifications.html
diffstat 3 files changed, 44 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/admin/notifications.py	Sat Jun 09 20:23:48 2012 +0200
+++ b/rhodecode/controllers/admin/notifications.py	Sun Jun 10 00:08:29 2012 +0200
@@ -60,19 +60,23 @@
         """GET /_admin/notifications: All items in the collection"""
         # url('notifications')
         c.user = self.rhodecode_user
-        notif = NotificationModel().get_for_user(self.rhodecode_user.user_id)
+        notif = NotificationModel().get_for_user(self.rhodecode_user.user_id,
+                                                 filter_=request.GET)
         p = int(request.params.get('page', 1))
         c.notifications = Page(notif, page=p, items_per_page=10)
+        c.pull_request_type = Notification.TYPE_PULL_REQUEST
         return render('admin/notifications/notifications.html')
 
     def mark_all_read(self):
         if request.environ.get('HTTP_X_PARTIAL_XHR'):
             nm = NotificationModel()
             # mark all read
-            nm.mark_all_read_for_user(self.rhodecode_user.user_id)
+            nm.mark_all_read_for_user(self.rhodecode_user.user_id,
+                                      filter_=request.GET)
             Session.commit()
             c.user = self.rhodecode_user
-            notif = nm.get_for_user(self.rhodecode_user.user_id)
+            notif = nm.get_for_user(self.rhodecode_user.user_id,
+                                    filter_=request.GET)
             c.notifications = Page(notif, page=1, items_per_page=10)
             return render('admin/notifications/notifications_data.html')
 
--- a/rhodecode/model/notification.py	Sat Jun 09 20:23:48 2012 +0200
+++ b/rhodecode/model/notification.py	Sun Jun 10 00:08:29 2012 +0200
@@ -36,6 +36,7 @@
 from rhodecode.lib import helpers as h
 from rhodecode.model import BaseModel
 from rhodecode.model.db import Notification, User, UserNotification
+from sqlalchemy.orm import joinedload
 
 log = logging.getLogger(__name__)
 
@@ -136,15 +137,41 @@
             log.error(traceback.format_exc())
             raise
 
-    def get_for_user(self, user):
+    def get_for_user(self, user, filter_=None):
+        """
+        Get mentions for given user, filter them if filter dict is given
+
+        :param user:
+        :type user:
+        :param filter:
+        """
         user = self._get_user(user)
-        return user.notifications
+
+        q = UserNotification.query()\
+            .filter(UserNotification.user == user)\
+            .join((Notification, UserNotification.notification_id ==
+                                 Notification.notification_id))
+
+        if filter_:
+            q = q.filter(Notification.type_ == filter_.get('type'))
 
-    def mark_all_read_for_user(self, user):
+        return q.all()
+
+    def mark_all_read_for_user(self, user, filter_=None):
         user = self._get_user(user)
-        UserNotification.query()\
+        q = UserNotification.query()\
+            .filter(UserNotification.user == user)\
             .filter(UserNotification.read == False)\
-            .update({'read': True})
+            .join((Notification, UserNotification.notification_id ==
+                                 Notification.notification_id))
+        if filter_:
+            q = q.filter(Notification.type_ == filter_.get('type'))
+
+        # this is a little inefficient but sqlalchemy doesn't support
+        # update on joined tables :(
+        for obj in q.all():
+            obj.read = True
+            self.sa.add(obj)
 
     def get_unread_cnt_for_user(self, user):
         user = self._get_user(user)
@@ -176,7 +203,8 @@
             notification.TYPE_CHANGESET_COMMENT: _('commented on commit'),
             notification.TYPE_MESSAGE: _('sent message'),
             notification.TYPE_MENTION: _('mentioned you'),
-            notification.TYPE_REGISTRATION: _('registered in RhodeCode')
+            notification.TYPE_REGISTRATION: _('registered in RhodeCode'),
+            notification.TYPE_PULL_REQUEST: _('opened new pull request')
         }
 
         tmpl = "%(user)s %(action)s %(when)s"
--- a/rhodecode/templates/admin/notifications/notifications.html	Sat Jun 09 20:23:48 2012 +0200
+++ b/rhodecode/templates/admin/notifications/notifications.html	Sun Jun 10 00:08:29 2012 +0200
@@ -26,8 +26,8 @@
     </div>
     %if c.notifications:
       <div style="padding:14px 18px;text-align: right;float:left">
-      <span id='all' class="ui-btn">${_('All')}</span>
-      <span id='pull_request' class="ui-btn">${_('Pull requests')}</span>
+      <span id='all' class="ui-btn"><a href="${h.url.current()}">${_('All')}</a></span>
+      <span id='pull_request' class="ui-btn"><a href="${h.url.current(type=c.pull_request_type)}">${_('Pull requests')}</a></span>
       </div>
       <div style="padding:14px 18px;text-align: right;float:right">
       <span id='mark_all_read' class="ui-btn">${_('Mark all read')}</span>
@@ -44,7 +44,7 @@
  deleteNotification(url_del,notification_id)
 })
 YUE.on('mark_all_read','click',function(e){
-    var url = "${h.url('notifications_mark_all_read')}";
+    var url = "${h.url('notifications_mark_all_read', **request.GET)}";
     ypjax(url,'notification_data',function(){
     	var notification_counter = YUD.get('notification_counter');
     	if(notification_counter){