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
......
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Deleting field 'ArticleSubscription.subscription_ptr'
db.delete_column(u'notifications_articlesubscription', u'subscription_ptr')
try:
db.delete_column(u'notifications_articlesubscription', u'subscription_ptr_id')
except Exception:
# Don't care if it doesn't exist but it may on migrations from
# before 0.0.24
pass
# Changing field 'ArticleSubscription.subscription'
db.alter_column(u'notifications_articlesubscription', 'subscription_id', self.gf('django.db.models.fields.related.OneToOneField')(default=1, to=orm['django_nyt.Subscription'], unique=True))
# Adding unique constraint on 'ArticleSubscription', fields ['subscription', u'articleplugin_ptr']
db.create_unique(u'notifications_articlesubscription', ['subscription_id', u'articleplugin_ptr_id'])
def backwards(self, orm):
# Removing unique constraint on 'ArticleSubscription', fields ['subscription', u'articleplugin_ptr']
db.delete_unique(u'notifications_articlesubscription', ['subscription_id', u'articleplugin_ptr_id'])
# Adding field 'ArticleSubscription.subscription_ptr'
db.add_column(u'notifications_articlesubscription', 'subscription_ptr',
self.gf('django.db.models.fields.related.OneToOneField')(default=1, related_name=u'deprecated_subscriptions', unique=True, db_column=u'subscription_ptr', to=orm['django_nyt.Subscription']),
keep_default=False)
# Changing field 'ArticleSubscription.subscription'
db.alter_column(u'notifications_articlesubscription', 'subscription_id', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['django_nyt.Subscription'], unique=True, null=True))
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'django_nyt.notification': {
'Meta': {'ordering': "('-id',)", 'object_name': 'Notification', 'db_table': "'nyt_notification'"},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_emailed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_viewed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'message': ('django.db.models.fields.TextField', [], {}),
'occurrences': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
'subscription': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['django_nyt.Subscription']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'url': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
u'django_nyt.notificationtype': {
'Meta': {'object_name': 'NotificationType', 'db_table': "'nyt_notificationtype'"},
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}),
'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128', 'primary_key': 'True'}),
'label': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'})
},
u'django_nyt.settings': {
'Meta': {'object_name': 'Settings', 'db_table': "'nyt_settings'"},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'interval': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
},
u'django_nyt.subscription': {
'Meta': {'object_name': 'Subscription', 'db_table': "'nyt_subscription'"},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'latest': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'latest_for'", 'null': 'True', 'to': u"orm['django_nyt.Notification']"}),
'notification_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['django_nyt.NotificationType']"}),
'object_id': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}),
'send_emails': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'settings': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['django_nyt.Settings']"})
},
'notifications.articlesubscription': {
'Meta': {'unique_together': "((u'subscription', u'articleplugin_ptr'),)", 'object_name': 'ArticleSubscription', '_ormbases': ['wiki.ArticlePlugin']},
u'articleplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['wiki.ArticlePlugin']", 'unique': 'True', 'primary_key': 'True'}),
'subscription': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['django_nyt.Subscription']", 'unique': 'True'})
},
'wiki.article': {
'Meta': {'object_name': 'Article'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'current_revision': ('django.db.models.fields.related.OneToOneField', [], {'blank': 'True', 'related_name': "u'current_set'", 'unique': 'True', 'null': 'True', 'to': "orm['wiki.ArticleRevision']"}),
'group': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.Group']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'group_read': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'group_write': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'other_read': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'other_write': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'owned_articles'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"})
},
'wiki.articleplugin': {
'Meta': {'object_name': 'ArticlePlugin'},
'article': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['wiki.Article']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'wiki.articlerevision': {
'Meta': {'ordering': "(u'created',)", 'unique_together': "((u'article', u'revision_number'),)", 'object_name': 'ArticleRevision'},
'article': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['wiki.Article']"}),
'automatic_log': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'content': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
'locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'previous_revision': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['wiki.ArticleRevision']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'revision_number': ('django.db.models.fields.IntegerField', [], {}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'user_message': ('django.db.models.fields.TextField', [], {'blank': 'True'})
}
}
complete_apps = ['notifications']
\ No newline at end of file
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