changeset 1791:2aee0dc1784e beta

mark all read button for notifications
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 19 Dec 2011 02:31:22 +0200
parents f551007ce085
children 2afa6b8c2ade
files rhodecode/config/routing.py rhodecode/controllers/admin/notifications.py rhodecode/model/notification.py rhodecode/templates/admin/notifications/notifications.html rhodecode/templates/admin/notifications/notifications_data.html rhodecode/templates/base/base.html
diffstat 6 files changed, 65 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/config/routing.py	Mon Dec 19 00:12:50 2011 +0200
+++ b/rhodecode/config/routing.py	Mon Dec 19 02:31:22 2011 +0200
@@ -26,7 +26,7 @@
     def check_repo(environ, match_dict):
         """
         check for valid repository for proper 404 handling
-        
+
         :param environ:
         :param match_dict:
         """
@@ -37,7 +37,7 @@
     def check_group(environ, match_dict):
         """
         check for valid repositories group for proper 404 handling
-        
+
         :param environ:
         :param match_dict:
         """
@@ -45,7 +45,6 @@
 
         return is_valid_repos_group(repos_group_name, config['base_path'])
 
-
     def check_int(environ, match_dict):
         return match_dict.get('id').isdigit()
 
@@ -274,7 +273,6 @@
         m.connect("admin_settings_create_repository", "/create_repository",
                   action="create_repository", conditions=dict(method=["GET"]))
 
-
     #NOTIFICATION REST ROUTES
     with rmap.submapper(path_prefix=ADMIN_PREFIX,
                         controller='admin/notifications') as m:
@@ -282,6 +280,8 @@
                   action="create", conditions=dict(method=["POST"]))
         m.connect("notifications", "/notifications",
                   action="index", conditions=dict(method=["GET"]))
+        m.connect("notifications_mark_all_read", "/notifications/mark_all_read",
+                  action="mark_all_read", conditions=dict(method=["GET"]))
         m.connect("formatted_notifications", "/notifications.{format}",
                   action="index", conditions=dict(method=["GET"]))
         m.connect("new_notification", "/notifications/new",
--- a/rhodecode/controllers/admin/notifications.py	Mon Dec 19 00:12:50 2011 +0200
+++ b/rhodecode/controllers/admin/notifications.py	Mon Dec 19 02:31:22 2011 +0200
@@ -1,6 +1,7 @@
 import logging
 import traceback
 
+from pylons import request
 from pylons import tmpl_context as c, url
 from pylons.controllers.util import redirect
 
@@ -15,6 +16,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class NotificationsController(BaseController):
     """REST Controller styled on the Atom Publishing Protocol"""
     # To properly map this controller, ensure your config/routing.py
@@ -27,7 +29,6 @@
     def __before__(self):
         super(NotificationsController, self).__before__()
 
-
     def index(self, format='html'):
         """GET /_admin/notifications: All items in the collection"""
         # url('notifications')
@@ -36,6 +37,16 @@
                             .get_for_user(self.rhodecode_user.user_id)
         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)
+            Session.commit()
+            c.user = self.rhodecode_user
+            c.notifications = nm.get_for_user(self.rhodecode_user.user_id)
+            return render('admin/notifications/notifications_data.html')
+
     def create(self):
         """POST /_admin/notifications: Create a new item"""
         # url('notifications')
--- a/rhodecode/model/notification.py	Mon Dec 19 00:12:50 2011 +0200
+++ b/rhodecode/model/notification.py	Mon Dec 19 02:31:22 2011 +0200
@@ -134,6 +134,12 @@
         user = self.__get_user(user)
         return user.notifications
 
+    def mark_all_read_for_user(self, user):
+        user = self.__get_user(user)
+        UserNotification.query()\
+            .filter(UserNotification.read==False)\
+            .update({'read': True})
+
     def get_unread_cnt_for_user(self, user):
         user = self.__get_user(user)
         return UserNotification.query()\
--- a/rhodecode/templates/admin/notifications/notifications.html	Mon Dec 19 00:12:50 2011 +0200
+++ b/rhodecode/templates/admin/notifications/notifications.html	Mon Dec 19 02:31:22 2011 +0200
@@ -24,39 +24,22 @@
             </li>          
         </ul>            
     </div>
-    % if c.notifications:
-    <%
-    unread = lambda n:{False:'unread'}.get(n)
-    %>
-    <div class="table">
-      <div class="notification-list">
-      %for notification in c.notifications:
-        <div id="notification_${notification.notification.notification_id}" class="container ${unread(notification.read)}">
-          <div class="notification-header">
-            <div class="gravatar">
-                <img alt="gravatar" src="${h.gravatar_url(h.email(notification.notification.created_by_user.email),24)}"/>
-            </div>
-            <div class="desc ${unread(notification.read)}">
-            <a href="${url('notification', notification_id=notification.notification.notification_id)}">${notification.notification.description}</a>
-            </div>
-            <div class="delete-notifications">
-              <span id="${notification.notification.notification_id}" class="delete-notification delete_icon action"></span>
-            </div>
-          </div>
-          <div class="notification-subject">${h.literal(notification.notification.subject)}</div>
-        </div>
-      %endfor
-      </div>
-    </div>
-    %else:
-        <div class="table">${_('No notifications here yet')}</div>
-    %endif
+      <div style="padding:10px 15px;text-align: right">
+      <span id='mark_all_read' class="ui-btn">${_('Mark all read')}</span>
+  </div>
+  <div id='notification_data'>
+    <%include file='notifications_data.html'/>
+  </div>
 </div>
 <script type="text/javascript">
 var url = "${url('notification', notification_id='__NOTIFICATION_ID__')}";
-   YUE.on(YUQ('.delete-notification'),'click',function(e){
-	   var notification_id = e.currentTarget.id;
-	   deleteNotification(url,notification_id)
-   })
+YUE.on(YUQ('.delete-notification'),'click',function(e){
+ var notification_id = e.currentTarget.id;
+ deleteNotification(url,notification_id)
+})
+ YUE.on('mark_all_read','click',function(e){
+	    var url = "${h.url('notifications_mark_all_read')}";
+	    ypjax(url,'notification_data',function(){YUD.get('notification_counter').innerHTML=0});
+ })
 </script>
 </%def>  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/templates/admin/notifications/notifications_data.html	Mon Dec 19 02:31:22 2011 +0200
@@ -0,0 +1,28 @@
+
+% if c.notifications:
+<%
+unread = lambda n:{False:'unread'}.get(n)
+%>
+<div class="table">
+  <div class="notification-list">
+  %for notification in c.notifications:
+    <div id="notification_${notification.notification.notification_id}" class="container ${unread(notification.read)}">
+      <div class="notification-header">
+        <div class="gravatar">
+            <img alt="gravatar" src="${h.gravatar_url(h.email(notification.notification.created_by_user.email),24)}"/>
+        </div>
+        <div class="desc ${unread(notification.read)}">
+        <a href="${url('notification', notification_id=notification.notification.notification_id)}">${notification.notification.description}</a>
+        </div>
+        <div class="delete-notifications">
+          <span id="${notification.notification.notification_id}" class="delete-notification delete_icon action"></span>
+        </div>
+      </div>
+      <div class="notification-subject">${h.literal(notification.notification.subject)}</div>
+    </div>
+  %endfor
+  </div>
+</div>
+%else:
+    <div class="table">${_('No notifications here yet')}</div>
+%endif
\ No newline at end of file
--- a/rhodecode/templates/base/base.html	Mon Dec 19 00:12:50 2011 +0200
+++ b/rhodecode/templates/base/base.html	Mon Dec 19 02:31:22 2011 +0200
@@ -53,7 +53,7 @@
             ${h.link_to(c.rhodecode_user.username,h.url('admin_settings_my_account'),title='%s %s'%(c.rhodecode_user.name,c.rhodecode_user.lastname))}
             </div>
             <div class="notifications">
-            <a href="${h.url('notifications')}">${c.unread_notifications}</a>
+            <a id="notification_counter" href="${h.url('notifications')}">${c.unread_notifications}</a>
             </div>
           %endif
           </div>