Commit eea0c43d by benjaoming

notifications plugin form to use django-nyt and management command to recreate notifications

parent 6f13af4d
...@@ -3,7 +3,7 @@ from django import forms ...@@ -3,7 +3,7 @@ from django import forms
from django.forms.models import modelformset_factory, BaseModelFormSet from django.forms.models import modelformset_factory, BaseModelFormSet
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django_nyt.models import Settings, NotificationType from django_nyt.models import Settings, NotificationType, Subscription
from django_nyt import settings as notify_settings from django_nyt import settings as notify_settings
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
...@@ -131,18 +131,19 @@ class SubscriptionForm(PluginSettingsFormMixin, forms.Form): ...@@ -131,18 +131,19 @@ class SubscriptionForm(PluginSettingsFormMixin, forms.Form):
)[0] )[0]
self.edit_notifications = models.ArticleSubscription.objects.filter( self.edit_notifications = models.ArticleSubscription.objects.filter(
article=article, article=article,
notification_type=self.notification_type subscription__notification_type=self.notification_type,
subscription__settings__user=self.user,
) )
self.default_settings = Settings.objects.get_or_create( self.default_settings = Settings.objects.get_or_create(
user=request.user, user=request.user,
interval=notify_settings.INTERVALS_DEFAULT interval=notify_settings.INTERVALS_DEFAULT
)[0] )[0]
if self.edit_notifications: if self.edit_notifications:
self.default_settings = self.edit_notifications[0].settings self.default_settings = self.edit_notifications[0].subscription.settings
if not initial: if not initial:
initial = { initial = {
'edit': bool(self.edit_notifications), 'edit': bool(self.edit_notifications),
'edit_email': bool(self.edit_notifications.filter(send_emails=True)), 'edit_email': bool(self.edit_notifications.filter(subscription__send_emails=True)),
'settings': self.default_settings, 'settings': self.default_settings,
} }
kwargs['initial'] = initial kwargs['initial'] = initial
...@@ -163,13 +164,26 @@ class SubscriptionForm(PluginSettingsFormMixin, forms.Form): ...@@ -163,13 +164,26 @@ class SubscriptionForm(PluginSettingsFormMixin, forms.Form):
if not self.changed_data: if not self.changed_data:
return return
if cd['edit']: if cd['edit']:
edit_notification = models.ArticleSubscription.objects.get_or_create( try:
article=self.article, edit_notification = models.ArticleSubscription.objects.get(
notification_type=self.notification_type, subscription__notification_type=self.notification_type,
settings=cd['settings'], article=self.article,
)[0] subscription__settings=cd['settings'],
edit_notification.settings = cd['settings'] )
edit_notification.send_emails = cd['edit_email'] edit_notification.subscription.send_emails = cd['edit_email']
edit_notification.save() edit_notification.subscription.save()
except models.ArticleSubscription.DoesNotExist:
subscription, __ = Subscription.objects.get_or_create(
settings=cd['settings'],
notification_type=self.notification_type,
object_id=self.article.id,
)
edit_notification = models.ArticleSubscription.objects.create(
subscription=subscription,
article=self.article,
)
subscription.send_emails = cd['edit_email']
subscription.save()
else: else:
self.edit_notifications.delete() self.edit_notifications.delete()
from django.contrib.contenttypes.models import ContentType
from django.core.management.base import BaseCommand
from wiki.plugins.notifications.settings import ARTICLE_EDIT
from wiki.plugins.notifications.models import ArticleSubscription
from wiki.models import ArticleRevision, Article
from django_nyt.utils import subscribe
from django_nyt.models import Settings
class Command(BaseCommand):
# @ReservedAssignment
help = 'Creates notifications for all article revision authors'
def handle(self, *args, **options):
user_settings = {}
content_type = ContentType.objects.get_for_model(Article)
for revision in ArticleRevision.objects.filter(deleted=False).exclude(user=None):
if not revision.user in user_settings:
user_settings[revision.user], __ = Settings.objects.get_or_create(user=revision.user)
subscription = subscribe(
user_settings[revision.user],
ARTICLE_EDIT,
content_type=content_type,
)
ArticleSubscription.objects.get_or_create(
subscription=subscription,
article=revision.article
)
...@@ -17,11 +17,7 @@ from wiki.plugins.notifications.util import get_title ...@@ -17,11 +17,7 @@ from wiki.plugins.notifications.util import get_title
class ArticleSubscription(ArticlePlugin): class ArticleSubscription(ArticlePlugin):
subscription_ptr = models.OneToOneField( subscription = models.OneToOneField(Subscription)
Subscription, related_name='deprecated_subscriptions',
db_column='subscription_ptr'
)
subscription = models.OneToOneField(Subscription, null=True)
def __unicode__(self): def __unicode__(self):
title = (_("%(user)s subscribing to %(article)s (%(type)s)") % title = (_("%(user)s subscribing to %(article)s (%(type)s)") %
...@@ -31,6 +27,7 @@ class ArticleSubscription(ArticlePlugin): ...@@ -31,6 +27,7 @@ class ArticleSubscription(ArticlePlugin):
return unicode(title) return unicode(title)
class Meta: class Meta:
unique_together = ('subscription', 'articleplugin_ptr')
if settings.APP_LABEL: if settings.APP_LABEL:
app_label = settings.APP_LABEL app_label = settings.APP_LABEL
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment