From 28282ac9e43507834c9ceba28f91e7568d8d1b68 Mon Sep 17 00:00:00 2001 From: Lisa Hewus Fresh Date: Tue, 27 Jan 2015 09:17:30 -0800 Subject: [PATCH] Bug 1097967 - Updates and migrations for linking regions to locations Replacing with a fresh copy to fix runserver errors Bug 1097967 - Updates for review - Add Regions Table Bug 1097967 - Add migration for Add Regions Table Bug 1097967 - Edits to region_edit.html Bug 1097967 - Updates for Add Region Table to DB Removing deprecated vendor-local directory small fix Bug 1097967 - Updates and fixes for previous pull request. Merge pull request #1 from peterbe/1097967_peter small fix Bug 1097967 - Fixes for models.py Bug 1097967 - Fixed Locations model Bug 1097967 - Added tests for Add Regions Table to DB Bug 1097967 - Updates/fixes to tests for Add Regions Table to DB --- .../main/migrations/0054_auto__add_region.py | 345 +++++++++++++++++ airmozilla/main/migrations/0055_auto.py | 346 +++++++++++++++++ airmozilla/main/migrations/0056_auto.py | 357 ++++++++++++++++++ airmozilla/main/models.py | 13 + airmozilla/manage/forms.py | 7 + .../manage/templates/manage/locations.html | 4 + .../manage/templates/manage/manage_base.html | 2 + .../manage/templates/manage/region_edit.html | 19 + .../manage/templates/manage/region_new.html | 9 + .../manage/templates/manage/regions.html | 54 +++ .../manage/tests/views/test_locations.py | 19 + airmozilla/manage/tests/views/test_regions.py | 72 ++++ airmozilla/manage/urls.py | 7 + airmozilla/manage/views/regions.py | 76 ++++ 14 files changed, 1330 insertions(+) create mode 100644 airmozilla/main/migrations/0054_auto__add_region.py create mode 100644 airmozilla/main/migrations/0055_auto.py create mode 100644 airmozilla/main/migrations/0056_auto.py create mode 100644 airmozilla/manage/templates/manage/region_edit.html create mode 100644 airmozilla/manage/templates/manage/region_new.html create mode 100644 airmozilla/manage/templates/manage/regions.html create mode 100644 airmozilla/manage/tests/views/test_regions.py create mode 100644 airmozilla/manage/views/regions.py diff --git a/airmozilla/main/migrations/0054_auto__add_region.py b/airmozilla/main/migrations/0054_auto__add_region.py new file mode 100644 index 00000000..1afd1c96 --- /dev/null +++ b/airmozilla/main/migrations/0054_auto__add_region.py @@ -0,0 +1,345 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Region' + db.create_table(u'main_region', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=300)), + ('is_active', self.gf('django.db.models.fields.BooleanField')(default=True)), + )) + db.send_create_signal(u'main', ['Region']) + + + def backwards(self, orm): + # Deleting model 'Region' + db.delete_table(u'main_region') + + + 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'main.approval': { + 'Meta': {'object_name': 'Approval'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.Group']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'processed': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + 'processed_time': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}) + }, + u'main.channel': { + 'Meta': {'ordering': "['name']", 'object_name': 'Channel'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'exclude_from_trending': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'image_is_banner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Channel']", 'null': 'True'}), + 'reverse_order': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + }, + u'main.curatedgroup': { + 'Meta': {'object_name': 'CuratedGroup'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}) + }, + u'main.event': { + 'Meta': {'object_name': 'Event'}, + 'additional_links': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'archive_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'call_info': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'channels': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Channel']", 'symmetrical': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'creator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'duration': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), + 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Location']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'modified_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'modified_user'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'mozillian': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}), + 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Participant']", 'symmetrical': 'False'}), + 'picture': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'event_picture'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['main.Picture']"}), + 'pin': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), + 'placeholder_img': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'popcorn_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'privacy': ('django.db.models.fields.CharField', [], {'default': "'public'", 'max_length': '40', 'db_index': 'True'}), + 'recruitmentmessage': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.RecruitmentMessage']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'remote_presenters': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'short_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '215', 'blank': 'True'}), + 'start_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'initiated'", 'max_length': '20', 'db_index': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Tag']", 'symmetrical': 'False', 'blank': 'True'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Template']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'template_environment': ('airmozilla.main.fields.EnvironmentField', [], {'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'transcript': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'upload': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'event_upload'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['uploads.Upload']"}) + }, + u'main.eventassignment': { + 'Meta': {'object_name': 'EventAssignment'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']", 'unique': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'locations': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Location']", 'symmetrical': 'False'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) + }, + u'main.eventhitstats': { + 'Meta': {'object_name': 'EventHitStats'}, + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']", 'unique': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + 'shortcode': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'total_hits': ('django.db.models.fields.IntegerField', [], {}) + }, + u'main.eventoldslug': { + 'Meta': {'object_name': 'EventOldSlug'}, + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '215'}) + }, + u'main.eventrevision': { + 'Meta': {'object_name': 'EventRevision'}, + 'additional_links': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'call_info': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'channels': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Channel']", 'symmetrical': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'picture': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Picture']", 'null': 'True', 'blank': 'True'}), + 'placeholder_img': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'recruitmentmessage': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.RecruitmentMessage']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'short_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Tag']", 'symmetrical': 'False', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True'}) + }, + u'main.eventtweet': { + 'Meta': {'object_name': 'EventTweet'}, + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'error': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'include_placeholder': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'send_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + 'sent_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '140'}), + 'tweet_id': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}) + }, + u'main.location': { + 'Meta': {'ordering': "['name']", 'object_name': 'Location'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'timezone': ('django.db.models.fields.CharField', [], {'max_length': '250'}) + }, + u'main.locationdefaultenvironment': { + 'Meta': {'unique_together': "(('location', 'privacy', 'template'),)", 'object_name': 'LocationDefaultEnvironment'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Location']"}), + 'privacy': ('django.db.models.fields.CharField', [], {'default': "'public'", 'max_length': '40'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Template']"}), + 'template_environment': ('airmozilla.main.fields.EnvironmentField', [], {}) + }, + u'main.participant': { + 'Meta': {'object_name': 'Participant'}, + 'blog_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'clear_token': ('django.db.models.fields.CharField', [], {'max_length': '36', 'blank': 'True'}), + 'cleared': ('django.db.models.fields.CharField', [], {'default': "'no'", 'max_length': '15', 'db_index': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'participant_creator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'department': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'irc': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'photo': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'role': ('django.db.models.fields.CharField', [], {'max_length': '25'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '65', 'blank': 'True'}), + 'team': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'topic_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'twitter': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'main.picture': { + 'Meta': {'object_name': 'Picture'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'picture_event'", 'null': 'True', 'to': u"orm['main.Event']"}), + 'file': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'height': ('django.db.models.fields.PositiveIntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)', 'auto_now': 'True', 'blank': 'True'}), + 'modified_user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'notes': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'size': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'width': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + u'main.recruitmentmessage': { + 'Meta': {'ordering': "['text']", 'object_name': 'RecruitmentMessage'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)', 'auto_now': 'True', 'blank': 'True'}), + 'modified_user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'notes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '250'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + u'main.region': { + 'Meta': {'ordering': "['name']", 'object_name': 'Region'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}) + }, + u'main.suggestedevent': { + 'Meta': {'object_name': 'SuggestedEvent'}, + 'accepted': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']", 'null': 'True', 'blank': 'True'}), + 'additional_links': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'call_info': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'channels': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Channel']", 'symmetrical': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'first_submitted': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Location']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Participant']", 'symmetrical': 'False'}), + 'picture': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Picture']", 'null': 'True', 'blank': 'True'}), + 'placeholder_img': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'popcorn_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'privacy': ('django.db.models.fields.CharField', [], {'default': "'public'", 'max_length': '40'}), + 'remote_presenters': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'review_comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'short_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '215', 'blank': 'True'}), + 'start_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'created'", 'max_length': '40'}), + 'submitted': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Tag']", 'symmetrical': 'False', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'upcoming': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'upload': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'upload'", 'null': 'True', 'to': u"orm['uploads.Upload']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + u'main.suggestedeventcomment': { + 'Meta': {'object_name': 'SuggestedEventComment'}, + 'comment': ('django.db.models.fields.TextField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'suggested_event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.SuggestedEvent']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}) + }, + u'main.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'main.template': { + 'Meta': {'ordering': "['name']", 'object_name': 'Template'}, + 'content': ('django.db.models.fields.TextField', [], {}), + 'default_archive_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'default_popcorn_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'main.urlmatch': { + 'Meta': {'object_name': 'URLMatch'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'string': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'use_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}) + }, + u'main.urltransform': { + 'Meta': {'object_name': 'URLTransform'}, + 'find': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'match': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.URLMatch']"}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'replace_with': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'main.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'contributor': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + u'main.vidlysubmission': { + 'Meta': {'object_name': 'VidlySubmission'}, + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + 'hd': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'submission_error': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'submission_time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 15, 0, 0)'}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'token_protection': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + u'uploads.upload': { + 'Meta': {'object_name': 'Upload'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'event'", 'null': 'True', 'to': u"orm['main.Event']"}), + 'file_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'size': ('django.db.models.fields.BigIntegerField', [], {}), + 'suggested_event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'suggested_event'", 'null': 'True', 'to': u"orm['main.SuggestedEvent']"}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '400'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + } + } + + complete_apps = ['main'] \ No newline at end of file diff --git a/airmozilla/main/migrations/0055_auto.py b/airmozilla/main/migrations/0055_auto.py new file mode 100644 index 00000000..97ba913b --- /dev/null +++ b/airmozilla/main/migrations/0055_auto.py @@ -0,0 +1,346 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding M2M table for field region on 'Location' + db.create_table(u'main_location_region', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('location', models.ForeignKey(orm[u'main.location'], null=False)), + ('region', models.ForeignKey(orm[u'main.region'], null=False)) + )) + db.create_unique(u'main_location_region', ['location_id', 'region_id']) + + + def backwards(self, orm): + # Removing M2M table for field region on 'Location' + db.delete_table('main_location_region') + + + 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'main.approval': { + 'Meta': {'object_name': 'Approval'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.Group']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'processed': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + 'processed_time': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}) + }, + u'main.channel': { + 'Meta': {'ordering': "['name']", 'object_name': 'Channel'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'exclude_from_trending': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'image_is_banner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Channel']", 'null': 'True'}), + 'reverse_order': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + }, + u'main.curatedgroup': { + 'Meta': {'object_name': 'CuratedGroup'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}) + }, + u'main.event': { + 'Meta': {'object_name': 'Event'}, + 'additional_links': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'archive_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'call_info': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'channels': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Channel']", 'symmetrical': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'creator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'duration': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), + 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Location']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'modified_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'modified_user'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'mozillian': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}), + 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Participant']", 'symmetrical': 'False'}), + 'picture': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'event_picture'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['main.Picture']"}), + 'pin': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), + 'placeholder_img': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'popcorn_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'privacy': ('django.db.models.fields.CharField', [], {'default': "'public'", 'max_length': '40', 'db_index': 'True'}), + 'recruitmentmessage': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.RecruitmentMessage']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'remote_presenters': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'short_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '215', 'blank': 'True'}), + 'start_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'initiated'", 'max_length': '20', 'db_index': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Tag']", 'symmetrical': 'False', 'blank': 'True'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Template']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'template_environment': ('airmozilla.main.fields.EnvironmentField', [], {'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'transcript': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'upload': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'event_upload'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['uploads.Upload']"}) + }, + u'main.eventassignment': { + 'Meta': {'object_name': 'EventAssignment'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']", 'unique': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'locations': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Location']", 'symmetrical': 'False'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) + }, + u'main.eventhitstats': { + 'Meta': {'object_name': 'EventHitStats'}, + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']", 'unique': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'shortcode': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'total_hits': ('django.db.models.fields.IntegerField', [], {}) + }, + u'main.eventoldslug': { + 'Meta': {'object_name': 'EventOldSlug'}, + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '215'}) + }, + u'main.eventrevision': { + 'Meta': {'object_name': 'EventRevision'}, + 'additional_links': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'call_info': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'channels': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Channel']", 'symmetrical': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'picture': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Picture']", 'null': 'True', 'blank': 'True'}), + 'placeholder_img': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'recruitmentmessage': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.RecruitmentMessage']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'short_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Tag']", 'symmetrical': 'False', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True'}) + }, + u'main.eventtweet': { + 'Meta': {'object_name': 'EventTweet'}, + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'error': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'include_placeholder': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'send_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'sent_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '140'}), + 'tweet_id': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}) + }, + u'main.location': { + 'Meta': {'ordering': "['name']", 'object_name': 'Location'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'region': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['main.Region']", 'null': 'True', 'blank': 'True'}), + 'timezone': ('django.db.models.fields.CharField', [], {'max_length': '250'}) + }, + u'main.locationdefaultenvironment': { + 'Meta': {'unique_together': "(('location', 'privacy', 'template'),)", 'object_name': 'LocationDefaultEnvironment'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Location']"}), + 'privacy': ('django.db.models.fields.CharField', [], {'default': "'public'", 'max_length': '40'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Template']"}), + 'template_environment': ('airmozilla.main.fields.EnvironmentField', [], {}) + }, + u'main.participant': { + 'Meta': {'object_name': 'Participant'}, + 'blog_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'clear_token': ('django.db.models.fields.CharField', [], {'max_length': '36', 'blank': 'True'}), + 'cleared': ('django.db.models.fields.CharField', [], {'default': "'no'", 'max_length': '15', 'db_index': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'participant_creator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'department': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'irc': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'photo': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'role': ('django.db.models.fields.CharField', [], {'max_length': '25'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '65', 'blank': 'True'}), + 'team': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'topic_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'twitter': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'main.picture': { + 'Meta': {'object_name': 'Picture'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'picture_event'", 'null': 'True', 'to': u"orm['main.Event']"}), + 'file': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'height': ('django.db.models.fields.PositiveIntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)', 'auto_now': 'True', 'blank': 'True'}), + 'modified_user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'notes': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'size': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'width': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + u'main.recruitmentmessage': { + 'Meta': {'ordering': "['text']", 'object_name': 'RecruitmentMessage'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)', 'auto_now': 'True', 'blank': 'True'}), + 'modified_user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'notes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '250'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + u'main.region': { + 'Meta': {'ordering': "['name']", 'object_name': 'Region'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}) + }, + u'main.suggestedevent': { + 'Meta': {'object_name': 'SuggestedEvent'}, + 'accepted': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']", 'null': 'True', 'blank': 'True'}), + 'additional_links': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'call_info': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'channels': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Channel']", 'symmetrical': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'first_submitted': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Location']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Participant']", 'symmetrical': 'False'}), + 'picture': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Picture']", 'null': 'True', 'blank': 'True'}), + 'placeholder_img': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'popcorn_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'privacy': ('django.db.models.fields.CharField', [], {'default': "'public'", 'max_length': '40'}), + 'remote_presenters': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'review_comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'short_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '215', 'blank': 'True'}), + 'start_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'created'", 'max_length': '40'}), + 'submitted': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Tag']", 'symmetrical': 'False', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'upcoming': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'upload': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'upload'", 'null': 'True', 'to': u"orm['uploads.Upload']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + u'main.suggestedeventcomment': { + 'Meta': {'object_name': 'SuggestedEventComment'}, + 'comment': ('django.db.models.fields.TextField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'suggested_event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.SuggestedEvent']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}) + }, + u'main.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'main.template': { + 'Meta': {'ordering': "['name']", 'object_name': 'Template'}, + 'content': ('django.db.models.fields.TextField', [], {}), + 'default_archive_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'default_popcorn_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'main.urlmatch': { + 'Meta': {'object_name': 'URLMatch'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'string': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'use_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}) + }, + u'main.urltransform': { + 'Meta': {'object_name': 'URLTransform'}, + 'find': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'match': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.URLMatch']"}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'replace_with': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'main.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'contributor': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + u'main.vidlysubmission': { + 'Meta': {'object_name': 'VidlySubmission'}, + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + 'hd': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'submission_error': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'submission_time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'token_protection': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + u'uploads.upload': { + 'Meta': {'object_name': 'Upload'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'event'", 'null': 'True', 'to': u"orm['main.Event']"}), + 'file_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'size': ('django.db.models.fields.BigIntegerField', [], {}), + 'suggested_event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'suggested_event'", 'null': 'True', 'to': u"orm['main.SuggestedEvent']"}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '400'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + } + } + + complete_apps = ['main'] \ No newline at end of file diff --git a/airmozilla/main/migrations/0056_auto.py b/airmozilla/main/migrations/0056_auto.py new file mode 100644 index 00000000..eaa8ff53 --- /dev/null +++ b/airmozilla/main/migrations/0056_auto.py @@ -0,0 +1,357 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Removing M2M table for field region on 'Location' + db.delete_table('main_location_region') + + # Adding M2M table for field regions on 'Location' + db.create_table(u'main_location_regions', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('location', models.ForeignKey(orm[u'main.location'], null=False)), + ('region', models.ForeignKey(orm[u'main.region'], null=False)) + )) + db.create_unique(u'main_location_regions', ['location_id', 'region_id']) + + + def backwards(self, orm): + # Adding M2M table for field region on 'Location' + db.create_table(u'main_location_region', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('location', models.ForeignKey(orm[u'main.location'], null=False)), + ('region', models.ForeignKey(orm[u'main.region'], null=False)) + )) + db.create_unique(u'main_location_region', ['location_id', 'region_id']) + + # Removing M2M table for field regions on 'Location' + db.delete_table('main_location_regions') + + + 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'main.approval': { + 'Meta': {'object_name': 'Approval'}, + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.Group']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'processed': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + 'processed_time': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}) + }, + u'main.channel': { + 'Meta': {'ordering': "['name']", 'object_name': 'Channel'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'exclude_from_trending': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'image_is_banner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Channel']", 'null': 'True'}), + 'reverse_order': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + }, + u'main.curatedgroup': { + 'Meta': {'object_name': 'CuratedGroup'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}) + }, + u'main.event': { + 'Meta': {'object_name': 'Event'}, + 'additional_links': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'archive_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'call_info': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'channels': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Channel']", 'symmetrical': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'creator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'duration': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), + 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Location']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'modified_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'modified_user'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'mozillian': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}), + 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Participant']", 'symmetrical': 'False'}), + 'picture': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'event_picture'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['main.Picture']"}), + 'pin': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), + 'placeholder_img': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'popcorn_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'privacy': ('django.db.models.fields.CharField', [], {'default': "'public'", 'max_length': '40', 'db_index': 'True'}), + 'recruitmentmessage': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.RecruitmentMessage']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'remote_presenters': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'short_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '215', 'blank': 'True'}), + 'start_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'initiated'", 'max_length': '20', 'db_index': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Tag']", 'symmetrical': 'False', 'blank': 'True'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Template']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'template_environment': ('airmozilla.main.fields.EnvironmentField', [], {'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'transcript': ('django.db.models.fields.TextField', [], {'null': 'True'}), + 'upload': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'event_upload'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['uploads.Upload']"}) + }, + u'main.eventassignment': { + 'Meta': {'object_name': 'EventAssignment'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']", 'unique': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'locations': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Location']", 'symmetrical': 'False'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}) + }, + u'main.eventhitstats': { + 'Meta': {'object_name': 'EventHitStats'}, + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']", 'unique': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'shortcode': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'total_hits': ('django.db.models.fields.IntegerField', [], {}) + }, + u'main.eventoldslug': { + 'Meta': {'object_name': 'EventOldSlug'}, + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '215'}) + }, + u'main.eventrevision': { + 'Meta': {'object_name': 'EventRevision'}, + 'additional_links': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'call_info': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'channels': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Channel']", 'symmetrical': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'picture': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Picture']", 'null': 'True', 'blank': 'True'}), + 'placeholder_img': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'recruitmentmessage': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.RecruitmentMessage']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'short_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Tag']", 'symmetrical': 'False', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True'}) + }, + u'main.eventtweet': { + 'Meta': {'object_name': 'EventTweet'}, + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'error': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'include_placeholder': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'send_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'sent_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '140'}), + 'tweet_id': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}) + }, + u'main.location': { + 'Meta': {'ordering': "['name']", 'object_name': 'Location'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}), + 'regions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['main.Region']", 'null': 'True', 'blank': 'True'}), + 'timezone': ('django.db.models.fields.CharField', [], {'max_length': '250'}) + }, + u'main.locationdefaultenvironment': { + 'Meta': {'unique_together': "(('location', 'privacy', 'template'),)", 'object_name': 'LocationDefaultEnvironment'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Location']"}), + 'privacy': ('django.db.models.fields.CharField', [], {'default': "'public'", 'max_length': '40'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Template']"}), + 'template_environment': ('airmozilla.main.fields.EnvironmentField', [], {}) + }, + u'main.participant': { + 'Meta': {'object_name': 'Participant'}, + 'blog_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'clear_token': ('django.db.models.fields.CharField', [], {'max_length': '36', 'blank': 'True'}), + 'cleared': ('django.db.models.fields.CharField', [], {'default': "'no'", 'max_length': '15', 'db_index': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'participant_creator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['auth.User']"}), + 'department': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'irc': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'photo': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'role': ('django.db.models.fields.CharField', [], {'max_length': '25'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '65', 'blank': 'True'}), + 'team': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'topic_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'twitter': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'main.picture': { + 'Meta': {'object_name': 'Picture'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'picture_event'", 'null': 'True', 'to': u"orm['main.Event']"}), + 'file': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'height': ('django.db.models.fields.PositiveIntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)', 'auto_now': 'True', 'blank': 'True'}), + 'modified_user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'notes': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'size': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'width': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + u'main.recruitmentmessage': { + 'Meta': {'ordering': "['text']", 'object_name': 'RecruitmentMessage'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)', 'auto_now': 'True', 'blank': 'True'}), + 'modified_user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL'}), + 'notes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'text': ('django.db.models.fields.CharField', [], {'max_length': '250'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + u'main.region': { + 'Meta': {'ordering': "['name']", 'object_name': 'Region'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}) + }, + u'main.suggestedevent': { + 'Meta': {'object_name': 'SuggestedEvent'}, + 'accepted': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']", 'null': 'True', 'blank': 'True'}), + 'additional_links': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'call_info': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'channels': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Channel']", 'symmetrical': 'False'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'first_submitted': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'location': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Location']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Participant']", 'symmetrical': 'False'}), + 'picture': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Picture']", 'null': 'True', 'blank': 'True'}), + 'placeholder_img': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'popcorn_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'privacy': ('django.db.models.fields.CharField', [], {'default': "'public'", 'max_length': '40'}), + 'remote_presenters': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'review_comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'short_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '215', 'blank': 'True'}), + 'start_time': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'created'", 'max_length': '40'}), + 'submitted': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['main.Tag']", 'symmetrical': 'False', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'upcoming': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'upload': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'upload'", 'null': 'True', 'to': u"orm['uploads.Upload']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + u'main.suggestedeventcomment': { + 'Meta': {'object_name': 'SuggestedEventComment'}, + 'comment': ('django.db.models.fields.TextField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'suggested_event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.SuggestedEvent']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}) + }, + u'main.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'main.template': { + 'Meta': {'ordering': "['name']", 'object_name': 'Template'}, + 'content': ('django.db.models.fields.TextField', [], {}), + 'default_archive_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'default_popcorn_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'main.urlmatch': { + 'Meta': {'object_name': 'URLMatch'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'string': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'use_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}) + }, + u'main.urltransform': { + 'Meta': {'object_name': 'URLTransform'}, + 'find': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'match': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.URLMatch']"}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'replace_with': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + u'main.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'contributor': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + u'main.vidlysubmission': { + 'Meta': {'object_name': 'VidlySubmission'}, + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Event']"}), + 'hd': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'submission_error': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'submission_time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 1, 21, 0, 0)'}), + 'tag': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'token_protection': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + u'uploads.upload': { + 'Meta': {'object_name': 'Upload'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'event'", 'null': 'True', 'to': u"orm['main.Event']"}), + 'file_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'size': ('django.db.models.fields.BigIntegerField', [], {}), + 'suggested_event': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'suggested_event'", 'null': 'True', 'to': u"orm['main.SuggestedEvent']"}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '400'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + } + } + + complete_apps = ['main'] \ No newline at end of file diff --git a/airmozilla/main/models.py b/airmozilla/main/models.py index dd21c777..60585248 100644 --- a/airmozilla/main/models.py +++ b/airmozilla/main/models.py @@ -189,11 +189,24 @@ def __unicode__(self): return self.name +class Region(models.Model): + """Region of a video/stream/presentation/etc.""" + name = models.CharField(max_length=300) + is_active = models.BooleanField(default=True) + + class Meta: + ordering = ['name'] + + def __unicode__(self): + return self.name + + class Location(models.Model): """Venue/location of a video/stream/presentation/etc.""" name = models.CharField(max_length=300) timezone = models.CharField(max_length=250) is_active = models.BooleanField(default=True) + regions = models.ManyToManyField(Region, blank=True) class Meta: ordering = ['name'] diff --git a/airmozilla/manage/forms.py b/airmozilla/manage/forms.py index 9b8e5926..29eb615f 100644 --- a/airmozilla/manage/forms.py +++ b/airmozilla/manage/forms.py @@ -17,6 +17,7 @@ Event, EventTweet, Location, + Region, Participant, Tag, Template, @@ -480,6 +481,12 @@ class Meta: fields = ('privacy', 'template', 'template_environment') +class RegionEditForm(BaseModelForm): + + class Meta: + model = Region + + class ApprovalForm(BaseModelForm): class Meta: model = Approval diff --git a/airmozilla/manage/templates/manage/locations.html b/airmozilla/manage/templates/manage/locations.html index 0c2a680c..b77f2ec5 100644 --- a/airmozilla/manage/templates/manage/locations.html +++ b/airmozilla/manage/templates/manage/locations.html @@ -11,6 +11,7 @@ Name + Region(s) Time zone Events/Suggested events @@ -25,6 +26,9 @@ Inactive {% endif %} + {% for region in location.regions.all() %} + {{ region.name }}{% if not loop.last %}, {% endif %} + {% endfor %} {{ location.timezone }} diff --git a/airmozilla/manage/templates/manage/manage_base.html b/airmozilla/manage/templates/manage/manage_base.html index 5e30bdc6..3c7e49c2 100644 --- a/airmozilla/manage/templates/manage/manage_base.html +++ b/airmozilla/manage/templates/manage/manage_base.html @@ -38,6 +38,8 @@ perms.main.change_channel, ''), ('manage:locations', 'Locations', 'locations', 'glyphicon-globe', perms.main.change_location, ''), + ('manage:regions', 'Regions', 'regions', 'glyphicon-globe', + perms.main.change_region, ''), ('manage:templates', 'Video templates', 'templates', 'glyphicon-film', perms.main.change_template, ''), ('manage:tags', 'Event tags', 'tags', 'glyphicon-tags', diff --git a/airmozilla/manage/templates/manage/region_edit.html b/airmozilla/manage/templates/manage/region_edit.html new file mode 100644 index 00000000..fc83a9e2 --- /dev/null +++ b/airmozilla/manage/templates/manage/region_edit.html @@ -0,0 +1,19 @@ +{% extends 'manage/regions.html' %} + +{% block manage_title %} + Editing region "{{ region.name }}" +{% endblock %} + + +{% block content_class %}col-md-6{% endblock %} + +{% block manage_content %} + + {% include 'manage/_alert_form_errors.html' %} +
+ {{ csrf() }} + {{ bootstrapform_horizontal(form) }} + {% include 'manage/_form_buttons.html' %} +
+ +{% endblock %} diff --git a/airmozilla/manage/templates/manage/region_new.html b/airmozilla/manage/templates/manage/region_new.html new file mode 100644 index 00000000..066b50a5 --- /dev/null +++ b/airmozilla/manage/templates/manage/region_new.html @@ -0,0 +1,9 @@ +{% extends 'manage/region_edit.html' %} + +{% block manage_title %} + New region +{% endblock %} + +{% block manage_content %} + {% include 'manage/_default_form.html' %} +{% endblock %} diff --git a/airmozilla/manage/templates/manage/regions.html b/airmozilla/manage/templates/manage/regions.html new file mode 100644 index 00000000..ed1e9962 --- /dev/null +++ b/airmozilla/manage/templates/manage/regions.html @@ -0,0 +1,54 @@ +{% extends 'manage/manage_base.html' %} +{% set page='regions' -%} + +{% block manage_title %} + Regions +{% endblock %} + +{% block manage_content %} +
Note: You cannot create new locations with inactive regions.
+ + + + + + + + + + {% for region in regions %} + + + + + + {% endfor %} + +
NameLocations
+ {{ region.name }} + {% if not region.is_active %} + Inactive + {% endif %} + + {{ region.location_set.all().count() }} + + + + Edit + +
+ {{ csrf() }} + +
+
+

+ + + New region + +

+{% endblock %} diff --git a/airmozilla/manage/tests/views/test_locations.py b/airmozilla/manage/tests/views/test_locations.py index 94ae506f..110a2c7b 100644 --- a/airmozilla/manage/tests/views/test_locations.py +++ b/airmozilla/manage/tests/views/test_locations.py @@ -6,6 +6,7 @@ from airmozilla.main.models import ( Location, + Region, Template, Event, LocationDefaultEnvironment @@ -19,6 +20,24 @@ def test_locations(self): response = self.client.get(reverse('manage:locations')) eq_(response.status_code, 200) + location = Location.objects.create(name='SomeLocation') + response = self.client.get(reverse('manage:locations')) + eq_(response.status_code, 200) + eq_(location.name, 'SomeLocation') + + def test_locations_regions(self): + """Location management pages with regions return successfully.""" + response = self.client.get(reverse('manage:locations')) + eq_(response.status_code, 200) + + location = Location.objects.create(name='SomeLocation') + region = Region.objects.create(name='SomeRegion') + location.regions.add(region) + response = self.client.get(reverse('manage:locations')) + eq_(response.status_code, 200) + ok_('SomeLocation' in response.content) + ok_('SomeRegion' in response.content) + def test_location_new(self): """Adding new location works correctly.""" url = reverse('manage:location_new') diff --git a/airmozilla/manage/tests/views/test_regions.py b/airmozilla/manage/tests/views/test_regions.py new file mode 100644 index 00000000..4b8c2eaf --- /dev/null +++ b/airmozilla/manage/tests/views/test_regions.py @@ -0,0 +1,72 @@ +from nose.tools import eq_, ok_ + +from funfactory.urlresolvers import reverse + +from airmozilla.main.models import ( + Region, +) +from .base import ManageTestCase + + +class TestRegions(ManageTestCase): + def setUp(self): + super(TestRegions, self).setUp() + Region.objects.create(name='South America') + + def test_regions(self): + """Region management pages return successfully.""" + response = self.client.get(reverse('manage:regions')) + eq_(response.status_code, 200) + + Region.objects.create(name='New Region') + response = self.client.get(reverse('manage:regions')) + eq_(response.status_code, 200) + ok_('New Region' in response.content) + + def test_region_new(self): + """Adding new region works correctly.""" + url = reverse('manage:region_new') + response = self.client.get(url) + eq_(response.status_code, 200) + + response_ok = self.client.post(url, { + 'name': 'testing', + }) + self.assertRedirects(response_ok, reverse('manage:regions')) + + response_fail = self.client.post(url) + eq_(response_fail.status_code, 200) + ok_('This field is required' in response_fail.content) + + def test_region_remove(self): + """Removing a region works correctly and leaves associated locations + with null regions.""" + region = Region.objects.create( + name="Something" + ) + self._delete_test( + region, + 'manage:region_remove', + 'manage:regions' + ) + assert not Region.objects.filter(name="Something") + + def test_region_edit(self): + """Test region editor""" + region = Region.objects.get(name='South America') + url = reverse('manage:region_edit', kwargs={'id': region.id}) + response = self.client.get(url) + eq_(response.status_code, 200) + ok_('South America' in response.content) + + response_ok = self.client.post(url, { + 'name': 'North America', + }) + self.assertRedirects(response_ok, reverse('manage:regions')) + ok_(Region.objects.get(name='North America')) + + def test_regions_inactive(self): + Region.objects.create(name='New Region', is_active=False) + response = self.client.get(reverse('manage:regions')) + eq_(response.status_code, 200) + ok_("Inactive region" in response.content) diff --git a/airmozilla/manage/urls.py b/airmozilla/manage/urls.py index 29ada8dd..82725761 100644 --- a/airmozilla/manage/urls.py +++ b/airmozilla/manage/urls.py @@ -13,6 +13,7 @@ groups, channels, locations, + regions, templates, tags, recruitmentmessages, @@ -154,6 +155,12 @@ url(r'^locations/tz/$', locations.location_timezone, name='location_timezone'), url(r'^locations/$', locations.locations, name='locations'), + url(r'^regions/new/$', regions.region_new, name='region_new'), + url(r'^regions/(?P\d+)/$', regions.region_edit, + name='region_edit'), + url(r'^regions/remove/(?P\d+)/$', regions.region_remove, + name='region_remove'), + url(r'^regions/$', regions.regions, name='regions'), url(r'^approvals/$', approvals.approvals, name='approvals'), url(r'^approvals/reconsider/$', approvals.approval_reconsider, name='approval_reconsider'), diff --git a/airmozilla/manage/views/regions.py b/airmozilla/manage/views/regions.py new file mode 100644 index 00000000..f8275507 --- /dev/null +++ b/airmozilla/manage/views/regions.py @@ -0,0 +1,76 @@ +from django.contrib import messages +from django.shortcuts import render, redirect, get_object_or_404 +from django.views.decorators.http import require_POST +from django.db import transaction + +from airmozilla.main.models import ( + Region, +) +from airmozilla.manage import forms + +from .decorators import ( + staff_required, + permission_required, + cancel_redirect +) + + +@staff_required +@permission_required('main.change_region') +def regions(request): + context = {} + regions = Region.objects.all() + context['regions'] = regions + + return render(request, 'manage/regions.html', context) + + +@permission_required('main.change_region') +@cancel_redirect('manage:regions') +@transaction.commit_on_success +def region_edit(request, id): + region = get_object_or_404(Region, id=id) + + if request.method == 'POST': + form = forms.RegionEditForm(request.POST, instance=region) + if form.is_valid(): + form.save() + messages.info(request, 'Region "%s" saved.' % region) + return redirect('manage:regions') + else: + form = forms.RegionEditForm(instance=region) + + context = { + 'form': form, + 'region': region, + } + + return render(request, 'manage/region_edit.html', context) + + +@staff_required +@permission_required('main.add_region') +@cancel_redirect('manage:events') +@transaction.commit_on_success +def region_new(request): + if request.method == 'POST': + form = forms.RegionEditForm(request.POST, instance=Region()) + if form.is_valid(): + form.save() + messages.success(request, 'Region created.') + return redirect('manage:regions') + else: + form = forms.RegionEditForm() + return render(request, 'manage/region_new.html', {'form': form}) + + +@require_POST +@staff_required +@permission_required('main.delete_region') +@transaction.commit_on_success +def region_remove(request, id): + region = get_object_or_404(Region, id=id) + region.delete() + messages.info(request, 'Region "%s" removed.' % region.name) + + return redirect('manage:regions')