diff --git a/com/models.py b/com/models.py index 9d7f2314..df904cd9 100644 --- a/com/models.py +++ b/com/models.py @@ -24,13 +24,15 @@ from django.shortcuts import render from django.db import models, transaction +from django.db.models import Q from django.utils.translation import ugettext_lazy as _ +from django.utils import timezone from django.core.urlresolvers import reverse from django.conf import settings from django.contrib.staticfiles.templatetags.staticfiles import static from django.core.mail import EmailMultiAlternatives -from core.models import User, Preferences +from core.models import User, Preferences, RealGroup, Notification from club.models import Club @@ -82,6 +84,23 @@ class News(models.Model): def __str__(self): return "%s: %s" % (self.type, self.title) + def save(self, *args, **kwargs): + super(News, self).save(*args, **kwargs) + for u in RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID).first().users.all(): + Notification(user=u, url=reverse("com:news_admin_list"), + type="NEWS_MODERATION", param="1").save() + +def news_notification_callback(notif): + count = News.objects.filter( + Q(dates__start_date__gt=timezone.now(), is_moderated=False) | + Q(type="NOTICE", is_moderated=False) + ).distinct().count() + if count: + notif.viewed = False + notif.param = "%s" % count + notif.date = timezone.now() + else: + notif.viewed = True class NewsDate(models.Model): """ diff --git a/core/migrations/0024_auto_20170906_1317.py b/core/migrations/0024_auto_20170906_1317.py new file mode 100644 index 00000000..a226d268 --- /dev/null +++ b/core/migrations/0024_auto_20170906_1317.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0023_auto_20170902_1226'), + ] + + operations = [ + migrations.AlterField( + model_name='notification', + name='type', + field=models.CharField(choices=[('MAILING_MODERATION', 'A new mailing list needs to be moderated'), ('NEWS_MODERATION', 'There are %s fresh news to be moderated'), ('FILE_MODERATION', 'New files to be moderated'), ('SAS_MODERATION', 'New pictures/album to be moderated in the SAS'), ('NEW_PICTURES', "You've been identified on some pictures"), ('REFILLING', 'You just refilled of %s €'), ('SELLING', 'You just bought %s'), ('GENERIC', 'You have a notification')], verbose_name='type', default='GENERIC', max_length=32), + ), + ] diff --git a/core/models.py b/core/models.py index 6b9506c3..b3bd10de 100644 --- a/core/models.py +++ b/core/models.py @@ -21,6 +21,7 @@ # Place - Suite 330, Boston, MA 02111-1307, USA. # # +import importlib from django.db import models from django.core.mail import send_mail @@ -1063,3 +1064,14 @@ class Notification(models.Model): if self.param: return self.get_type_display() % self.param return self.get_type_display() + + def save(self, *args, **kwargs): + if not self.id and self.type in settings.SITH_PERMANENT_NOTIFICATIONS: + old_notif = self.user.notifications.filter(type=self.type).last() + if old_notif: + mod_name, func_name = settings.SITH_PERMANENT_NOTIFICATIONS[self.type].rsplit('.',1) + mod = importlib.import_module(mod_name) + getattr(mod, func_name)(old_notif) + old_notif.save() + return + super(Notification, self).save(*args, **kwargs) diff --git a/core/views/site.py b/core/views/site.py index e4070bc6..a367a821 100644 --- a/core/views/site.py +++ b/core/views/site.py @@ -27,6 +27,7 @@ from django.http import JsonResponse from django.core import serializers from django.contrib.auth.decorators import login_required from django.views.generic import ListView, TemplateView +from django.conf import settings import json @@ -50,15 +51,18 @@ class NotificationList(ListView): def get_queryset(self): if 'see_all' in self.request.GET.keys(): - self.request.user.notifications.update(viewed=True) + for n in self.request.user.notifications.all(): + n.viewed = True + n.save() return self.request.user.notifications.order_by('-date')[:20] def notification(request, notif_id): notif = Notification.objects.filter(id=notif_id).first() if notif: - notif.viewed = True - notif.save() + if notif.type not in settings.SITH_PERMANENT_NOTIFICATIONS: + notif.viewed = True + notif.save() return redirect(notif.url) return redirect("/") diff --git a/sith/settings.py b/sith/settings.py index b7151144..3f2576c9 100644 --- a/sith/settings.py +++ b/sith/settings.py @@ -551,7 +551,7 @@ SITH_LAUNDERETTE_PRICES = { SITH_NOTIFICATIONS = [ ('MAILING_MODERATION', _("A new mailing list needs to be moderated")), - ('NEWS_MODERATION', _("A fresh new to be moderated")), + ('NEWS_MODERATION', _("There are %s fresh news to be moderated")), ('FILE_MODERATION', _("New files to be moderated")), ('SAS_MODERATION', _("New pictures/album to be moderated in the SAS")), ('NEW_PICTURES', _("You've been identified on some pictures")), @@ -560,6 +560,13 @@ SITH_NOTIFICATIONS = [ ('GENERIC', _("You have a notification")), ] +# The keys are the notification names as found in SITH_NOTIFICATIONS, and the +# values are the callback function to update the notifs. +# The callback must take the notif object as first and single argument. +SITH_PERMANENT_NOTIFICATIONS = { + 'NEWS_MODERATION': 'com.models.news_notification_callback', +} + SITH_QUICK_NOTIF = { 'qn_success': _("Success!"), 'qn_fail': _("Fail!"),