From 66e9199befc0b0dffa3005bc51a1b807e873010a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20=C3=81lvarez?= Date: Tue, 31 Mar 2015 11:32:13 -0300 Subject: [PATCH] Mergin issues/665 and issues/610 This commit: * Adds the javascript required for manually updating the popit in "Fetch new data now" button * Fixes the tests for UpdateStatusOfPopitWriteItRelation to use RequestFactory * Adds a migration for periodicity. --- ...popitinstancerecord_autosync__add_field.py | 284 ++++++++++++++++++ nuntium/subdomain_urls.py | 2 + .../writeitinstance_and_popit_relations.html | 15 +- nuntium/tests/popit_writeit_relation_tests.py | 45 ++- nuntium/user_section/views.py | 5 +- 5 files changed, 333 insertions(+), 18 deletions(-) create mode 100644 nuntium/migrations/0061_auto__del_field_writeitinstancepopitinstancerecord_autosync__add_field.py diff --git a/nuntium/migrations/0061_auto__del_field_writeitinstancepopitinstancerecord_autosync__add_field.py b/nuntium/migrations/0061_auto__del_field_writeitinstancepopitinstancerecord_autosync__add_field.py new file mode 100644 index 00000000..8bc07327 --- /dev/null +++ b/nuntium/migrations/0061_auto__del_field_writeitinstancepopitinstancerecord_autosync__add_field.py @@ -0,0 +1,284 @@ +# -*- 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 'WriteitInstancePopitInstanceRecord.autosync' + db.delete_column(u'nuntium_writeitinstancepopitinstancerecord', 'autosync') + + # Adding field 'WriteitInstancePopitInstanceRecord.periodicity' + db.add_column(u'nuntium_writeitinstancepopitinstancerecord', 'periodicity', + self.gf('django.db.models.fields.CharField')(default='1W', max_length='1'), + keep_default=False) + + + def backwards(self, orm): + # Adding field 'WriteitInstancePopitInstanceRecord.autosync' + db.add_column(u'nuntium_writeitinstancepopitinstancerecord', 'autosync', + self.gf('django.db.models.fields.BooleanField')(default=True), + keep_default=False) + + # Deleting field 'WriteitInstancePopitInstanceRecord.periodicity' + db.delete_column(u'nuntium_writeitinstancepopitinstancerecord', 'periodicity') + + + 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', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + 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', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contactos.contact': { + 'Meta': {'object_name': 'Contact'}, + 'contact_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contactos.ContactType']"}), + 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_bounced': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contacts'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['popit.Person']"}), + 'popit_identifier': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True'}), + 'value': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'writeitinstance': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contacts'", 'null': 'True', 'to': u"orm['nuntium.WriteItInstance']"}) + }, + u'contactos.contacttype': { + 'Meta': {'object_name': 'ContactType'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 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'djangoplugins.plugin': { + 'Meta': {'ordering': "(u'_order',)", 'unique_together': "(('point', 'name'),)", 'object_name': 'Plugin'}, + '_order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'index': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'point': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['djangoplugins.PluginPoint']"}), + 'pythonpath': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), + 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}) + }, + u'djangoplugins.pluginpoint': { + 'Meta': {'object_name': 'PluginPoint'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'pythonpath': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'nuntium.answer': { + 'Meta': {'object_name': 'Answer'}, + 'content': ('django.db.models.fields.TextField', [], {}), + 'content_html': ('django.db.models.fields.TextField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'message': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answers'", 'to': u"orm['nuntium.Message']"}), + 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['popit.Person']"}) + }, + u'nuntium.answerattachment': { + 'Meta': {'object_name': 'AnswerAttachment'}, + 'answer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attachments'", 'to': u"orm['nuntium.Answer']"}), + 'content': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '512'}) + }, + u'nuntium.answerwebhook': { + 'Meta': {'object_name': 'AnswerWebHook'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '255'}), + 'writeitinstance': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'answer_webhooks'", 'to': u"orm['nuntium.WriteItInstance']"}) + }, + u'nuntium.confirmation': { + 'Meta': {'object_name': 'Confirmation'}, + 'confirmated_at': ('django.db.models.fields.DateField', [], {'default': 'None', 'null': 'True'}), + 'created': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2015, 3, 31, 0, 0)'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}), + 'message': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['nuntium.Message']", 'unique': 'True'}) + }, + u'nuntium.confirmationtemplate': { + 'Meta': {'object_name': 'ConfirmationTemplate'}, + 'content_html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'content_text': ('django.db.models.fields.TextField', [], {'default': "u'Hello {author_name}\\n\\n\\nYou just submitted a message to\\n\\n{recipients}\\n\\nvia {writeit_name}.\\n\\n\\nPlease visit the following link to confirm you want to send this message\\n\\n{confirmation_url}\\n\\n(If you can\\u2019t click the link, try copying and pasting it into your\\nbrowser\\u2019s address bar)\\n\\n\\nOnce you have confirmed the message, you can access it by going to\\n\\n{message_url}\\n\\n\\n**IMPORTANT** Once confirmed, this message, will be sent to\\n\\n{recipients}.\\n\\nIt will also be published on {writeit_name},\\nwhere your name, your message, and any replies, will be public and\\nonline for anyone to read, and will also probably appear in search\\nengine results.\\n\\n\\nIf this message didn\\u2019t come from you (or you\\u2019ve changed your mind and\\ndon\\u2019t want to send it after all) please just ignore this email.\\n\\n\\nThanks for using {writeit_name}, and\\nhere is a copy of your message for your records:\\n\\n\\nTo: {recipients}\\nSubject: {subject}\\n\\n{content}\\n'"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'subject': ('django.db.models.fields.CharField', [], {'default': "u'Please confirm your WriteIt message to {recipients}\\n'", 'max_length': '512'}), + 'writeitinstance': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['nuntium.WriteItInstance']", 'unique': 'True'}) + }, + u'nuntium.membership': { + 'Meta': {'object_name': 'Membership'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['popit.Person']"}), + 'writeitinstance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['nuntium.WriteItInstance']"}) + }, + u'nuntium.message': { + 'Meta': {'ordering': "['-created']", 'object_name': 'Message'}, + 'author_email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), + 'author_name': ('django.db.models.fields.CharField', [], {'max_length': '512'}), + 'confirmated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'moderated': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), + 'subject': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), + 'writeitinstance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['nuntium.WriteItInstance']"}) + }, + u'nuntium.messagerecord': { + 'Meta': {'object_name': 'MessageRecord'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + 'datetime': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2015, 3, 31, 0, 0)'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'nuntium.moderation': { + 'Meta': {'object_name': 'Moderation'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'message': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'moderation'", 'unique': 'True', 'to': u"orm['nuntium.Message']"}) + }, + u'nuntium.newanswernotificationtemplate': { + 'Meta': {'object_name': 'NewAnswerNotificationTemplate'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'subject_template': ('django.db.models.fields.CharField', [], {'default': "u'{person} has replied to your message {subject}\\n'", 'max_length': '255'}), + 'template_html': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'template_text': ('django.db.models.fields.TextField', [], {'default': 'u\'Dear {author_name}\\n\\n{person} has replied to your {writeit_name}\\nmessage with subject\\n\\n"{subject}"\\n\\n\\nYou can see their response at\\n\\n{message_url}\\n\\n\\n{person} said:\\n\\n{content}\\n\\n-- \\n\\nThanks for using {writeit_name}\\n\''}), + 'writeitinstance': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'new_answer_notification_template'", 'unique': 'True', 'to': u"orm['nuntium.WriteItInstance']"}) + }, + u'nuntium.nocontactom': { + 'Meta': {'object_name': 'NoContactOM'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'message': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['nuntium.Message']"}), + 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['popit.Person']"}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': "'10'"}) + }, + u'nuntium.outboundmessage': { + 'Meta': {'object_name': 'OutboundMessage'}, + 'contact': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contactos.Contact']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'message': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['nuntium.Message']"}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'new'", 'max_length': "'10'"}) + }, + u'nuntium.outboundmessageidentifier': { + 'Meta': {'object_name': 'OutboundMessageIdentifier'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'outbound_message': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['nuntium.OutboundMessage']", 'unique': 'True'}) + }, + u'nuntium.outboundmessagepluginrecord': { + 'Meta': {'object_name': 'OutboundMessagePluginRecord'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'number_of_attempts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'outbound_message': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['nuntium.OutboundMessage']"}), + 'plugin': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['djangoplugins.Plugin']"}), + 'sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'try_again': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + u'nuntium.ratelimiter': { + 'Meta': {'object_name': 'RateLimiter'}, + 'count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'day': ('django.db.models.fields.DateField', [], {}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'writeitinstance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['nuntium.WriteItInstance']"}) + }, + u'nuntium.subscriber': { + 'Meta': {'object_name': 'Subscriber'}, + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'message': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subscribers'", 'to': u"orm['nuntium.Message']"}) + }, + u'nuntium.writeitinstance': { + 'Meta': {'object_name': 'WriteItInstance'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'writeitinstances'", 'to': u"orm['auth.User']"}), + 'persons': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'writeit_instances'", 'symmetrical': 'False', 'through': u"orm['nuntium.Membership']", 'to': u"orm['popit.Person']"}), + 'slug': ('autoslug.fields.AutoSlugField', [], {'unique': 'True', 'max_length': '50', 'populate_from': "'name'", 'unique_with': '()'}) + }, + u'nuntium.writeitinstanceconfig': { + 'Meta': {'object_name': 'WriteItInstanceConfig'}, + 'allow_messages_using_form': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'autoconfirm_api_messages': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'can_create_answer': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'custom_from_domain': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), + 'email_host': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), + 'email_host_password': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), + 'email_host_user': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), + 'email_port': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'email_use_ssl': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'email_use_tls': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'maximum_recipients': ('django.db.models.fields.PositiveIntegerField', [], {'default': '5'}), + 'moderation_needed_in_all_messages': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'notify_owner_when_new_answer': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'rate_limiter': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'testing_mode': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'writeitinstance': ('annoying.fields.AutoOneToOneField', [], {'related_name': "'config'", 'unique': 'True', 'to': u"orm['nuntium.WriteItInstance']"}) + }, + u'nuntium.writeitinstancepopitinstancerecord': { + 'Meta': {'object_name': 'WriteitInstancePopitInstanceRecord'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'periodicity': ('django.db.models.fields.CharField', [], {'default': "'1W'", 'max_length': "'1'"}), + 'popitapiinstance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['popit.ApiInstance']"}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'nothing'", 'max_length': "'20'"}), + 'status_explanation': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'writeitinstance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['nuntium.WriteItInstance']"}) + }, + u'popit.apiinstance': { + 'Meta': {'object_name': 'ApiInstance'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'url': ('popit.fields.ApiInstanceURLField', [], {'unique': 'True', 'max_length': '200'}) + }, + u'popit.person': { + 'Meta': {'object_name': 'Person'}, + 'api_instance': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['popit.ApiInstance']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'popit_id': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}), + 'popit_url': ('popit.fields.PopItURLField', [], {'default': "''", 'max_length': '200', 'unique': 'True', 'null': 'True', 'blank': 'True'}), + 'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}) + } + } + + complete_apps = ['nuntium'] \ No newline at end of file diff --git a/nuntium/subdomain_urls.py b/nuntium/subdomain_urls.py index 2f56ed1a..d68df9e6 100644 --- a/nuntium/subdomain_urls.py +++ b/nuntium/subdomain_urls.py @@ -32,6 +32,7 @@ WriteItInstanceTemplateUpdateView, WriteItInstanceUpdateView, WriteitPopitRelatingView, + ReSyncFromPopit, ) from nuntium.user_section.stats import StatsView @@ -45,6 +46,7 @@ url(r'^settings/$', WriteItInstanceAdvancedUpdateView.as_view(), name='writeitinstance_advanced_update'), url(r'^settings/api/$', WriteItInstanceApiDocsView.as_view(), name='writeitinstance_api_docs'), url(r'^settings/sources/$', WriteitPopitRelatingView.as_view(), name='relate-writeit-popit'), + url(r'^settings/sources/resync/(?P[-\d]+)/$', ReSyncFromPopit.as_view(), name='resync-from-popit'), url(r'^settings/templates/$', WriteItInstanceTemplateUpdateView.as_view(), name='writeitinstance_template_update'), url(r'^settings/templates/new_answer_notification/$', NewAnswerNotificationTemplateUpdateView.as_view(), name='edit_new_answer_notification_template'), url(r'^settings/templates/confirmation_template/$', ConfirmationTemplateUpdateView.as_view(), name='edit_confirmation_template'), diff --git a/nuntium/templates/nuntium/profiles/writeitinstance_and_popit_relations.html b/nuntium/templates/nuntium/profiles/writeitinstance_and_popit_relations.html index cbbf4cb0..5a9b184a 100644 --- a/nuntium/templates/nuntium/profiles/writeitinstance_and_popit_relations.html +++ b/nuntium/templates/nuntium/profiles/writeitinstance_and_popit_relations.html @@ -60,7 +60,7 @@

{% trans 'Polling interval' %}

- +
@@ -85,4 +85,17 @@

{% trans "Add a new data source" %}

+ + {% endblock content %} diff --git a/nuntium/tests/popit_writeit_relation_tests.py b/nuntium/tests/popit_writeit_relation_tests.py index ed8efc45..ab1a03d9 100644 --- a/nuntium/tests/popit_writeit_relation_tests.py +++ b/nuntium/tests/popit_writeit_relation_tests.py @@ -11,8 +11,12 @@ from django.utils import timezone from mock import patch, call from django.utils.translation import ugettext_lazy as _ -from django.core.urlresolvers import reverse +from subdomains.utils import reverse from nuntium.user_section.forms import WriteItPopitUpdateForm +from django.test import RequestFactory +from nuntium.user_section.views import ReSyncFromPopit +from django.contrib.auth.models import AnonymousUser +from django.http import Http404 class PopitWriteitRelationRecord(TestCase): @@ -251,16 +255,19 @@ class UpdateStatusOfPopitWriteItRelation(WriteItPopitTestCase): ''' def setUp(self): super(UpdateStatusOfPopitWriteItRelation, self).setUp() + self.request_factory = RequestFactory() def test_post_to_the_url_for_manual_resync(self): '''Resyncing can be done by posting to a url''' # This is just a symbolism but it is to show how this popit api is empty self.assertFalse(self.popit_api_instance.person_set.all()) - - url = reverse('resync-from-popit', kwargs={'slug': self.writeitinstance.slug, + url = reverse('resync-from-popit', subdomain=self.writeitinstance.slug, kwargs={ 'popit_api_pk': self.popit_api_instance.pk}) - self.client.login(username=self.owner.username, password="feroz") - response = self.client.post(url) + request = self.request_factory.post(url) + request.subdomain = self.writeitinstance.slug + request.user = self.owner + response = ReSyncFromPopit.as_view()(request, popit_api_pk=self.popit_api_instance.pk) + self.assertEquals(response.status_code, 200) # It should have been updated self.assertTrue(self.popit_api_instance.person_set.all()) @@ -274,23 +281,31 @@ def test_doesnt_add_another_relation_w_p(self): self.assertNotIn(another_popit_api_instance, self.writeitinstance.writeitinstancepopitinstancerecord_set.all()) - url = reverse('resync-from-popit', kwargs={'slug': self.writeitinstance.slug, + url = reverse('resync-from-popit', subdomain=self.writeitinstance.slug, kwargs={ 'popit_api_pk': another_popit_api_instance.pk}) - self.client.login(username=self.owner.username, password="feroz") - response = self.client.post(url) - self.assertEquals(response.status_code, 404) + request = self.request_factory.post(url) + request.subdomain = self.writeitinstance.slug + request.user = self.owner + with self.assertRaises(Http404): + ReSyncFromPopit.as_view()(request, popit_api_pk=another_popit_api_instance.pk) def test_post_has_to_be_the_owner_of_the_instance(self): '''Only the owner of an instance can resync''' - url = reverse('resync-from-popit', kwargs={'slug': self.writeitinstance.slug, + url = reverse('resync-from-popit', subdomain=self.writeitinstance.slug, kwargs={ 'popit_api_pk': self.popit_api_instance.pk}) - response = self.client.post(url) - self.assertEquals(response.status_code, 404) + request = self.request_factory.post(url) + request.subdomain = self.writeitinstance.slug + request.user = AnonymousUser() + with self.assertRaises(Http404): + ReSyncFromPopit.as_view()(request, popit_api_pk=self.popit_api_instance.pk) other_user = User.objects.create_user(username="other_user", password="s3cr3t0") - self.client.login(username=other_user.username, password='s3cr3t0') - response = self.client.post(url) - self.assertEquals(response.status_code, 404) + + request = self.request_factory.post(url) + request.subdomain = self.writeitinstance.slug + request.user = other_user + with self.assertRaises(Http404): + ReSyncFromPopit.as_view()(request, popit_api_pk=self.popit_api_instance.pk) class UpdateRecordFormTestCase(WriteItPopitTestCase): diff --git a/nuntium/user_section/views.py b/nuntium/user_section/views.py index 9c346a32..fc3ecb7d 100644 --- a/nuntium/user_section/views.py +++ b/nuntium/user_section/views.py @@ -382,11 +382,12 @@ def dispatch(self, *args, **kwargs): def post(self, request, *args, **kwargs): writeitinstance = get_object_or_404(WriteItInstance, - slug=self.kwargs['slug'], + slug=self.request.subdomain, owner=self.request.user) popits_previously_related = PopitApiInstance.objects.filter( writeitinstancepopitinstancerecord__writeitinstance=writeitinstance) - popit_api_instance = get_object_or_404(popits_previously_related, pk=self.kwargs['popit_api_pk']) + + popit_api_instance = get_object_or_404(popits_previously_related, pk=kwargs['popit_api_pk']) pull_from_popit.delay(writeitinstance, popit_api_instance) return HttpResponse()