1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-01 15:09:14 +00:00

update user notifications

1. use cache to store user unseen notifications count
1. add UNREAD_NOTIFICATIONS_REQUEST_INTERVAL
This commit is contained in:
lian
2017-07-07 11:05:53 +08:00
parent 94b7d8f9d5
commit 96e2340a81
6 changed files with 44 additions and 5 deletions

View File

@@ -6,10 +6,14 @@ from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from django.core.cache import cache
from seahub.api2.authentication import TokenAuthentication from seahub.api2.authentication import TokenAuthentication
from seahub.api2.throttling import UserRateThrottle from seahub.api2.throttling import UserRateThrottle
from seahub.notifications.models import UserNotification from seahub.notifications.models import UserNotification
from seahub.notifications.models import get_cache_key_of_unseen_notifications
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
json_content_type = 'application/json; charset=utf-8' json_content_type = 'application/json; charset=utf-8'
@@ -26,10 +30,22 @@ class NotificationsView(APIView):
1. login user. 1. login user.
""" """
username = request.user.username
unseen_count = UserNotification.objects.count_unseen_user_notifications(username)
result = {} result = {}
result['unseen_count'] = unseen_count
username = request.user.username
cache_key = get_cache_key_of_unseen_notifications(username)
count_from_cache = cache.get(cache_key, None)
# for case of count value is `0`
if count_from_cache is not None:
result['unseen_count'] = count_from_cache
else:
count_from_db = UserNotification.objects.count_unseen_user_notifications(username)
result['unseen_count'] = count_from_db
# set cache
cache.set(cache_key, count_from_db)
return Response(result) return Response(result)
@@ -47,6 +63,9 @@ class NotificationsView(APIView):
notice.seen = True notice.seen = True
notice.save() notice.save()
cache_key = get_cache_key_of_unseen_notifications(username)
cache.delete(cache_key)
return Response({'success': True}) return Response({'success': True})
class NotificationView(APIView): class NotificationView(APIView):
@@ -74,4 +93,8 @@ class NotificationView(APIView):
notice.seen = True notice.seen = True
notice.save() notice.save()
username = request.user.username
cache_key = get_cache_key_of_unseen_notifications(username)
cache.delete(cache_key)
return Response({'success': True}) return Response({'success': True})

View File

@@ -9,6 +9,7 @@ from django.db import models
from django.forms import ModelForm, Textarea from django.forms import ModelForm, Textarea
from django.utils.html import escape from django.utils.html import escape
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.core.cache import cache
import seaserv import seaserv
from seaserv import seafile_api, ccnet_api from seaserv import seafile_api, ccnet_api
@@ -20,6 +21,7 @@ from seahub.utils.repo import get_repo_shared_users
# Get an instance of a logger # Get an instance of a logger
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
########## system notification ########## system notification
class Notification(models.Model): class Notification(models.Model):
message = models.CharField(max_length=512) message = models.CharField(max_length=512)
@@ -79,6 +81,10 @@ def file_comment_msg_to_json(repo_id, file_path, author, comment):
'author': author, 'author': author,
'comment': comment}) 'comment': comment})
def get_cache_key_of_unseen_notifications(username):
return "%s_unseen_notifications_count" % username
class UserNotificationManager(models.Manager): class UserNotificationManager(models.Manager):
def _add_user_notification(self, to_user, msg_type, detail): def _add_user_notification(self, to_user, msg_type, detail):
@@ -92,6 +98,10 @@ class UserNotificationManager(models.Manager):
n = super(UserNotificationManager, self).create( n = super(UserNotificationManager, self).create(
to_user=to_user, msg_type=msg_type, detail=detail) to_user=to_user, msg_type=msg_type, detail=detail)
n.save() n.save()
cache_key = get_cache_key_of_unseen_notifications(to_user)
cache.delete(cache_key)
return n return n
def get_all_notifications(self, seen=None, time_since=None): def get_all_notifications(self, seen=None, time_since=None):

View File

@@ -313,6 +313,9 @@ DISABLE_SYNC_WITH_ANY_FOLDER = False
ENABLE_TERMS_AND_CONDITIONS = False ENABLE_TERMS_AND_CONDITIONS = False
# interval for request unread notifications
UNREAD_NOTIFICATIONS_REQUEST_INTERVAL = 3 * 60 # seconds
# File preview # File preview
FILE_PREVIEW_MAX_SIZE = 30 * 1024 * 1024 FILE_PREVIEW_MAX_SIZE = 30 * 1024 * 1024
OFFICE_PREVIEW_MAX_SIZE = 2 * 1024 * 1024 OFFICE_PREVIEW_MAX_SIZE = 2 * 1024 * 1024

View File

@@ -289,6 +289,7 @@ app["pageOptions"] = {
folder_perm_enabled: {% if folder_perm_enabled %} true {% else %} false {% endif %}, folder_perm_enabled: {% if folder_perm_enabled %} true {% else %} false {% endif %},
is_pro: {% if is_pro %} true {% else %} false {% endif %}, is_pro: {% if is_pro %} true {% else %} false {% endif %},
file_audit_enabled: {% if file_audit_enabled %} true {% else %} false {% endif %}, file_audit_enabled: {% if file_audit_enabled %} true {% else %} false {% endif %},
unread_notifications_request_interval: {{ unread_notifications_request_interval }},
cur_note: {% if request.cur_note %} {'id': '{{ request.cur_note.id }}'} {% else %} null {% endif %} cur_note: {% if request.cur_note %} {'id': '{{ request.cur_note.id }}'} {% else %} null {% endif %}
}; };
app.ui = { app.ui = {

View File

@@ -50,7 +50,8 @@ from seahub.views.modules import MOD_PERSONAL_WIKI, enable_mod_for_user, \
disable_mod_for_user disable_mod_for_user
import seahub.settings as settings import seahub.settings as settings
from seahub.settings import AVATAR_FILE_STORAGE, \ from seahub.settings import AVATAR_FILE_STORAGE, \
ENABLE_SUB_LIBRARY, ENABLE_FOLDER_PERM ENABLE_SUB_LIBRARY, ENABLE_FOLDER_PERM, \
UNREAD_NOTIFICATIONS_REQUEST_INTERVAL
LIBRARY_TEMPLATES = getattr(settings, 'LIBRARY_TEMPLATES', {}) LIBRARY_TEMPLATES = getattr(settings, 'LIBRARY_TEMPLATES', {})
@@ -759,6 +760,7 @@ def libraries(request):
'file_audit_enabled': FILE_AUDIT_ENABLED, 'file_audit_enabled': FILE_AUDIT_ENABLED,
'can_add_pub_repo': can_add_pub_repo, 'can_add_pub_repo': can_add_pub_repo,
'joined_groups': joined_groups, 'joined_groups': joined_groups,
'unread_notifications_request_interval': UNREAD_NOTIFICATIONS_REQUEST_INTERVAL,
'library_templates': LIBRARY_TEMPLATES.keys() if \ 'library_templates': LIBRARY_TEMPLATES.keys() if \
isinstance(LIBRARY_TEMPLATES, dict) else [] isinstance(LIBRARY_TEMPLATES, dict) else []
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))

View File

@@ -72,7 +72,7 @@ define([
}; };
reqUnreadNum(); reqUnreadNum();
// request every 30s // request every 30s
var reqInterval = setInterval(reqUnreadNum, 30*1000); var reqInterval = setInterval(reqUnreadNum, app.pageOptions.unread_notifications_request_interval*1000);
$('#notice-icon').click(function() { $('#notice-icon').click(function() {
_this.toggle(); _this.toggle();