diff --git a/dss/settings.py b/dss/settings.py index ed57efb..ef00cb6 100755 --- a/dss/settings.py +++ b/dss/settings.py @@ -33,8 +33,20 @@ DATABASES = { 'USER': localsettings.DATABASE_USER if hasattr(localsettings, 'DATABASE_USER') else 'deepsouthsounds', 'PASSWORD': localsettings.DATABASE_PASSWORD if hasattr(localsettings, 'DATABASE_PASSWORD') else '', 'HOST': localsettings.DATABASE_HOST if hasattr(localsettings, 'DATABASE_HOST') else 'localhost', + }, + 'test': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'test_deepsouthsounds', + 'ADMINUSER': 'postgres', + 'USER': localsettings.DATABASE_USER if hasattr(localsettings, 'DATABASE_USER') else 'deepsouthsounds', + 'PASSWORD': localsettings.DATABASE_PASSWORD if hasattr(localsettings, 'DATABASE_PASSWORD') else '', + 'HOST': localsettings.DATABASE_HOST if hasattr(localsettings, 'DATABASE_HOST') else 'localhost', } } +import sys +if 'test' in sys.argv or 'test_coverage' in sys.argv: #Covers regular testing and django-coverage + print "Testing" + DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3' ROOT_URLCONF = 'dss.urls' TIME_ZONE = 'Europe/Dublin' @@ -107,10 +119,10 @@ STATICFILES_DIRS = ( SECRET_KEY = localsettings.SECRET_KEY TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', - 'django.template.loaders.eggs.Loader', - #'django.template.loaders.app_directories.load_template_source', + ('django.template.loaders.cached.Loader', ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + )), ) TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + ( 'django_facebook.context_processors.facebook', @@ -140,7 +152,7 @@ MIDDLEWARE_CLASSES = ( 'htmlmin.middleware.HtmlMinifyMiddleware', 'django_user_agents.middleware.UserAgentMiddleware', #'spa.middleware.uploadify.SWFUploadMiddleware', - #'spa.middleware.sqlprinter.SqlPrintingMiddleware' if DEBUG else None, + 'spa.middleware.sqlprinter.SqlPrintingMiddleware' if DEBUG else None, #'debug_toolbar.middleware.DebugToolbarMiddleware', ) @@ -159,6 +171,7 @@ INSTALLED_APPS = ( 'django_facebook', 'django_extensions', 'django_gravatar', + 'schedule', 'compressor', 'notification', 'djcelery', diff --git a/spa/admin.py b/spa/admin.py index c6ec94c..9b6eca3 100755 --- a/spa/admin.py +++ b/spa/admin.py @@ -1,10 +1,11 @@ from django.contrib import admin +from spa.models import Show from spa.models.genre import Genre from spa.models.userprofile import UserProfile from spa.models.chatmessage import ChatMessage from spa.models.recurrence import Recurrence from spa.models.release import Release -from spa.models.event import Event +#from spa.models.event import Event from spa.models.label import Label from spa.models.mix import Mix from spa.models.release import ReleaseAudio @@ -23,7 +24,8 @@ admin.site.register(Label) admin.site.register(Release, DefaultAdmin) admin.site.register(ReleaseAudio) admin.site.register(Venue) -admin.site.register(Event) +#admin.site.register(Event) admin.site.register(UserProfile) admin.site.register(Recurrence) admin.site.register(ChatMessage) +admin.site.register(Show) diff --git a/spa/api/v1/EventResource.py b/spa/api/v1/EventResource.py index b7a8366..d072cc3 100755 --- a/spa/api/v1/EventResource.py +++ b/spa/api/v1/EventResource.py @@ -3,9 +3,9 @@ import humanize from tastypie.authorization import Authorization from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource from spa.models.recurrence import Recurrence +""" from spa.models.venue import Venue from spa.models.event import Event - class EventResource(BackboneCompatibleResource): class Meta: queryset = Event.objects.all() @@ -37,4 +37,5 @@ class EventResource(BackboneCompatibleResource): if recurrence != None: bundle.obj.event_recurrence = recurrence - return bundle \ No newline at end of file + return bundle +""" diff --git a/spa/api/v1/ShowResource.py b/spa/api/v1/ShowResource.py new file mode 100644 index 0000000..6a85e05 --- /dev/null +++ b/spa/api/v1/ShowResource.py @@ -0,0 +1,26 @@ +from tastypie.authorization import Authorization +from tastypie.exceptions import ImmediateHttpResponse +from tastypie.http import HttpBadRequest + +from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource + +from spa.models import Show +from spa.models.show import ShowOverlapException + +DATE_FORMAT = '%d/%m/%Y %H:%M:%S' + + +class ShowResource(BackboneCompatibleResource): + class Meta: + queryset = Show.objects.all() + authorization = Authorization() + resource_name = 'schedules' + + def obj_create(self, bundle, **kwargs): + try: + return super(ShowResource, self).obj_create(bundle, **kwargs) + except ShowOverlapException: + raise ImmediateHttpResponse( + HttpBadRequest("This event overlaps with an existing event") + ) + diff --git a/spa/api/v1/UserResource.py b/spa/api/v1/UserResource.py index 16f258f..2fadda1 100755 --- a/spa/api/v1/UserResource.py +++ b/spa/api/v1/UserResource.py @@ -76,8 +76,10 @@ class UserResource(BackboneCompatibleResource): ret = super(UserResource, self).obj_update(bundle, skip_errors, **kwargs) + """ bundle.obj.update_follower(bundle.request.user, - bundle.data['favourited']) + bundle.data['favourited']) + """ update_geo_info_task.delay(ip_address=bundle.request.META['REMOTE_ADDR'], profile_id=bundle.request.user.get_profile().id) diff --git a/spa/middleware/sqlprinter.py b/spa/middleware/sqlprinter.py index d2d5d80..72189de 100755 --- a/spa/middleware/sqlprinter.py +++ b/spa/middleware/sqlprinter.py @@ -41,7 +41,7 @@ class SqlPrintingMiddleware(object): indentation = 2 if len(connection.queries) > 0 and settings.DEBUG: - width = terminal_width() + width = 10000 #terminal_width() total_time = 0.0 for query in connection.queries: nice_sql = query['sql'].replace('"', '').replace(',', ', ') diff --git a/spa/migrations/0047_auto__del_field_label_object_updated__del_field_label_object_created__.py b/spa/migrations/0047_auto__del_field_label_object_updated__del_field_label_object_created__.py new file mode 100644 index 0000000..9d30cd2 --- /dev/null +++ b/spa/migrations/0047_auto__del_field_label_object_updated__del_field_label_object_created__.py @@ -0,0 +1,457 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting field 'Label.object_updated' + db.delete_column(u'spa_label', 'object_updated') + + # Deleting field 'Label.object_created' + db.delete_column(u'spa_label', 'object_created') + + # Deleting field 'Mix.object_updated' + db.delete_column(u'spa_mix', 'object_updated') + + # Deleting field 'Mix.object_created' + db.delete_column(u'spa_mix', 'object_created') + + # Deleting field 'Tracklist.object_updated' + db.delete_column(u'spa_tracklist', 'object_updated') + + # Deleting field 'Tracklist.object_created' + db.delete_column(u'spa_tracklist', 'object_created') + + # Deleting field 'ReleaseAudio.object_updated' + db.delete_column(u'spa_releaseaudio', 'object_updated') + + # Deleting field 'ReleaseAudio.object_created' + db.delete_column(u'spa_releaseaudio', 'object_created') + + # Deleting field 'Genre.object_updated' + db.delete_column(u'spa_genre', 'object_updated') + + # Deleting field 'Genre.object_created' + db.delete_column(u'spa_genre', 'object_created') + + # Deleting field 'UserProfile.object_created' + db.delete_column(u'spa_userprofile', 'object_created') + + # Deleting field 'UserProfile.object_updated' + db.delete_column(u'spa_userprofile', 'object_updated') + + # Deleting field 'Venue.object_updated' + db.delete_column(u'spa_venue', 'object_updated') + + # Deleting field 'Venue.object_created' + db.delete_column(u'spa_venue', 'object_created') + + # Deleting field '_Lookup.object_updated' + db.delete_column(u'spa__lookup', 'object_updated') + + # Deleting field '_Lookup.object_created' + db.delete_column(u'spa__lookup', 'object_created') + + # Deleting field 'Activity.object_updated' + db.delete_column(u'spa_activity', 'object_updated') + + # Deleting field 'Activity.object_created' + db.delete_column(u'spa_activity', 'object_created') + + # Deleting field 'Release.object_updated' + db.delete_column(u'spa_release', 'object_updated') + + # Deleting field 'Release.object_created' + db.delete_column(u'spa_release', 'object_created') + + # Deleting field 'PurchaseLink.object_updated' + db.delete_column(u'spa_purchaselink', 'object_updated') + + # Deleting field 'PurchaseLink.object_created' + db.delete_column(u'spa_purchaselink', 'object_created') + + # Deleting field 'ChatMessage.object_updated' + db.delete_column(u'spa_chatmessage', 'object_updated') + + # Deleting field 'ChatMessage.object_created' + db.delete_column(u'spa_chatmessage', 'object_created') + + # Deleting field 'Comment.object_updated' + db.delete_column(u'spa_comment', 'object_updated') + + # Deleting field 'Comment.object_created' + db.delete_column(u'spa_comment', 'object_created') + + # Deleting field 'Notification.object_updated' + db.delete_column(u'spa_notification', 'object_updated') + + # Deleting field 'Notification.object_created' + db.delete_column(u'spa_notification', 'object_created') + + + def backwards(self, orm): + # Adding field 'Label.object_updated' + db.add_column(u'spa_label', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'Label.object_created' + db.add_column(u'spa_label', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'Mix.object_updated' + db.add_column(u'spa_mix', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'Mix.object_created' + db.add_column(u'spa_mix', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'Tracklist.object_updated' + db.add_column(u'spa_tracklist', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'Tracklist.object_created' + db.add_column(u'spa_tracklist', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'ReleaseAudio.object_updated' + db.add_column(u'spa_releaseaudio', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'ReleaseAudio.object_created' + db.add_column(u'spa_releaseaudio', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'Genre.object_updated' + db.add_column(u'spa_genre', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'Genre.object_created' + db.add_column(u'spa_genre', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'UserProfile.object_created' + db.add_column(u'spa_userprofile', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'UserProfile.object_updated' + db.add_column(u'spa_userprofile', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'Venue.object_updated' + db.add_column(u'spa_venue', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'Venue.object_created' + db.add_column(u'spa_venue', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field '_Lookup.object_updated' + db.add_column(u'spa__lookup', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field '_Lookup.object_created' + db.add_column(u'spa__lookup', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'Activity.object_updated' + db.add_column(u'spa_activity', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'Activity.object_created' + db.add_column(u'spa_activity', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'Release.object_updated' + db.add_column(u'spa_release', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'Release.object_created' + db.add_column(u'spa_release', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'PurchaseLink.object_updated' + db.add_column(u'spa_purchaselink', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'PurchaseLink.object_created' + db.add_column(u'spa_purchaselink', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'ChatMessage.object_updated' + db.add_column(u'spa_chatmessage', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'ChatMessage.object_created' + db.add_column(u'spa_chatmessage', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'Comment.object_updated' + db.add_column(u'spa_comment', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'Comment.object_created' + db.add_column(u'spa_comment', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + # Adding field 'Notification.object_updated' + db.add_column(u'spa_notification', 'object_updated', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True), + keep_default=False) + + # Adding field 'Notification.object_created' + db.add_column(u'spa_notification', 'object_created', + self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True), + keep_default=False) + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'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'}) + }, + 'spa._lookup': { + 'Meta': {'object_name': '_Lookup'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'spa.activity': { + 'Meta': {'object_name': 'Activity'}, + 'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']", 'null': 'True', 'blank': 'True'}) + }, + 'spa.activitycomment': { + 'Meta': {'object_name': 'ActivityComment', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_comments'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activitydownload': { + 'Meta': {'object_name': 'ActivityDownload', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_downloads'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activityfavourite': { + 'Meta': {'object_name': 'ActivityFavourite', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_favourites'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activityfollow': { + 'Meta': {'object_name': 'ActivityFollow', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_follow'", 'to': "orm['spa.UserProfile']"}) + }, + 'spa.activitylike': { + 'Meta': {'object_name': 'ActivityLike', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_likes'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activityplay': { + 'Meta': {'object_name': 'ActivityPlay', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_plays'", 'to': "orm['spa.Mix']"}) + }, + 'spa.chatmessage': { + 'Meta': {'object_name': 'ChatMessage'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'message': ('django.db.models.fields.TextField', [], {}), + 'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'chat_messages'", 'null': 'True', 'to': "orm['spa.UserProfile']"}) + }, + 'spa.comment': { + 'Meta': {'object_name': 'Comment'}, + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comments'", 'null': 'True', 'to': "orm['spa.Mix']"}), + 'time_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) + }, + 'spa.event': { + 'Meta': {'object_name': 'Event'}, + 'attendees': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'attendees'", 'symmetrical': 'False', 'to': u"orm['auth.User']"}), + 'date_created': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 4, 28, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 4, 28, 0, 0)'}), + 'event_description': ('django.db.models.fields.TextField', [], {}), + 'event_recurrence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Recurrence']"}), + 'event_time': ('django.db.models.fields.TimeField', [], {'default': 'datetime.datetime(2014, 4, 28, 0, 0)'}), + 'event_title': ('django.db.models.fields.CharField', [], {'max_length': '250'}), + 'event_venue': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Venue']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'spa.genre': { + 'Meta': {'object_name': 'Genre'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}) + }, + 'spa.label': { + 'Meta': {'object_name': 'Label'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'spa.mix': { + 'Meta': {'object_name': 'Mix'}, + 'description': ('django.db.models.fields.TextField', [], {}), + 'download_allowed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'favourites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'favourites'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}), + 'filetype': ('django.db.models.fields.CharField', [], {'default': "'mp3'", 'max_length': '10'}), + 'genres': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['spa.Genre']", 'symmetrical': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_featured': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'likes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'likes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}), + 'mp3tags_updated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'uid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '38', 'blank': 'True'}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2014, 4, 28, 0, 0)'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mixes'", 'to': "orm['spa.UserProfile']"}), + 'waveform_generated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'spa.notification': { + 'Meta': {'object_name': 'Notification'}, + 'accepted_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), + 'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'from_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'notifications'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notification_html': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}), + 'target': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}), + 'verb': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}) + }, + 'spa.purchaselink': { + 'Meta': {'object_name': 'PurchaseLink'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'track': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'purchase_link'", 'to': "orm['spa.Tracklist']"}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + 'spa.recurrence': { + 'Meta': {'object_name': 'Recurrence', '_ormbases': ['spa._Lookup']}, + u'_lookup_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa._Lookup']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'spa.release': { + 'Meta': {'object_name': 'Release'}, + 'embed_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'release_artist': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'release_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 4, 28, 0, 0)'}), + 'release_description': ('django.db.models.fields.TextField', [], {}), + 'release_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'release_label': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Label']"}), + 'release_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']"}) + }, + 'spa.releaseaudio': { + 'Meta': {'object_name': 'ReleaseAudio'}, + 'description': ('django.db.models.fields.TextField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'release_audio'", 'null': 'True', 'to': "orm['spa.Release']"}) + }, + 'spa.tracklist': { + 'Meta': {'object_name': 'Tracklist'}, + 'artist': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'index': ('django.db.models.fields.SmallIntegerField', [], {}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tracklist'", 'to': "orm['spa.Mix']"}), + 'remixer': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'timeindex': ('django.db.models.fields.TimeField', [], {'null': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'spa.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'activity_sharing': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'activity_sharing_networks': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'avatar_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'city': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'country': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_known_session': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'default': 'None', 'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'userprofile'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + 'spa.venue': { + 'Meta': {'object_name': 'Venue'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), + 'venue_address': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'venue_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'venue_name': ('django.db.models.fields.CharField', [], {'max_length': '250'}) + } + } + + complete_apps = ['spa'] \ No newline at end of file diff --git a/spa/migrations/0048_auto__del_event.py b/spa/migrations/0048_auto__del_event.py new file mode 100644 index 0000000..940a393 --- /dev/null +++ b/spa/migrations/0048_auto__del_event.py @@ -0,0 +1,249 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting model 'Event' + db.delete_table(u'spa_event') + + # Removing M2M table for field attendees on 'Event' + db.delete_table(db.shorten_name(u'spa_event_attendees')) + + + def backwards(self, orm): + # Adding model 'Event' + db.create_table(u'spa_event', ( + ('event_description', self.gf('django.db.models.fields.TextField')()), + ('event_recurrence', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['spa.Recurrence'])), + ('event_time', self.gf('django.db.models.fields.TimeField')(default=datetime.datetime(2014, 4, 28, 0, 0))), + ('event_date', self.gf('django.db.models.fields.DateField')(default=datetime.datetime(2014, 4, 28, 0, 0))), + ('event_title', self.gf('django.db.models.fields.CharField')(max_length=250)), + ('date_created', self.gf('django.db.models.fields.DateField')(default=datetime.datetime(2014, 4, 28, 0, 0))), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('event_venue', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['spa.Venue'])), + )) + db.send_create_signal('spa', ['Event']) + + # Adding M2M table for field attendees on 'Event' + m2m_table_name = db.shorten_name(u'spa_event_attendees') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('event', models.ForeignKey(orm['spa.event'], null=False)), + ('user', models.ForeignKey(orm[u'auth.user'], null=False)) + )) + db.create_unique(m2m_table_name, ['event_id', 'user_id']) + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'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'}) + }, + 'spa._lookup': { + 'Meta': {'object_name': '_Lookup'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'spa.activity': { + 'Meta': {'object_name': 'Activity'}, + 'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']", 'null': 'True', 'blank': 'True'}) + }, + 'spa.activitycomment': { + 'Meta': {'object_name': 'ActivityComment', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_comments'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activitydownload': { + 'Meta': {'object_name': 'ActivityDownload', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_downloads'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activityfavourite': { + 'Meta': {'object_name': 'ActivityFavourite', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_favourites'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activityfollow': { + 'Meta': {'object_name': 'ActivityFollow', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_follow'", 'to': "orm['spa.UserProfile']"}) + }, + 'spa.activitylike': { + 'Meta': {'object_name': 'ActivityLike', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_likes'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activityplay': { + 'Meta': {'object_name': 'ActivityPlay', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_plays'", 'to': "orm['spa.Mix']"}) + }, + 'spa.chatmessage': { + 'Meta': {'object_name': 'ChatMessage'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'message': ('django.db.models.fields.TextField', [], {}), + 'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'chat_messages'", 'null': 'True', 'to': "orm['spa.UserProfile']"}) + }, + 'spa.comment': { + 'Meta': {'object_name': 'Comment'}, + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comments'", 'null': 'True', 'to': "orm['spa.Mix']"}), + 'time_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) + }, + 'spa.genre': { + 'Meta': {'object_name': 'Genre'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}) + }, + 'spa.label': { + 'Meta': {'object_name': 'Label'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'spa.mix': { + 'Meta': {'object_name': 'Mix'}, + 'description': ('django.db.models.fields.TextField', [], {}), + 'download_allowed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'favourites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'favourites'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}), + 'filetype': ('django.db.models.fields.CharField', [], {'default': "'mp3'", 'max_length': '10'}), + 'genres': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['spa.Genre']", 'symmetrical': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_featured': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'likes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'likes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}), + 'mp3tags_updated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'uid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '38', 'blank': 'True'}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2014, 4, 29, 0, 0)'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mixes'", 'to': "orm['spa.UserProfile']"}), + 'waveform_generated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'spa.notification': { + 'Meta': {'object_name': 'Notification'}, + 'accepted_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), + 'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'from_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'notifications'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notification_html': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}), + 'target': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}), + 'verb': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}) + }, + 'spa.purchaselink': { + 'Meta': {'object_name': 'PurchaseLink'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'track': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'purchase_link'", 'to': "orm['spa.Tracklist']"}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + 'spa.recurrence': { + 'Meta': {'object_name': 'Recurrence', '_ormbases': ['spa._Lookup']}, + u'_lookup_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa._Lookup']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'spa.release': { + 'Meta': {'object_name': 'Release'}, + 'embed_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'release_artist': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'release_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 4, 29, 0, 0)'}), + 'release_description': ('django.db.models.fields.TextField', [], {}), + 'release_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'release_label': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Label']"}), + 'release_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']"}) + }, + 'spa.releaseaudio': { + 'Meta': {'object_name': 'ReleaseAudio'}, + 'description': ('django.db.models.fields.TextField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'release_audio'", 'null': 'True', 'to': "orm['spa.Release']"}) + }, + 'spa.tracklist': { + 'Meta': {'object_name': 'Tracklist'}, + 'artist': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'index': ('django.db.models.fields.SmallIntegerField', [], {}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tracklist'", 'to': "orm['spa.Mix']"}), + 'remixer': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'timeindex': ('django.db.models.fields.TimeField', [], {'null': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'spa.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'activity_sharing': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'activity_sharing_networks': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'avatar_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'city': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'country': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_known_session': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'default': 'None', 'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'userprofile'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + 'spa.venue': { + 'Meta': {'object_name': 'Venue'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), + 'venue_address': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'venue_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'venue_name': ('django.db.models.fields.CharField', [], {'max_length': '250'}) + } + } + + complete_apps = ['spa'] \ No newline at end of file diff --git a/spa/migrations/0049_auto__add_show.py b/spa/migrations/0049_auto__add_show.py new file mode 100644 index 0000000..50ca281 --- /dev/null +++ b/spa/migrations/0049_auto__add_show.py @@ -0,0 +1,262 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Show' + db.create_table(u'spa_show', ( + (u'event_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['schedule.Event'], unique=True, primary_key=True)), + )) + db.send_create_signal('spa', ['Show']) + + + def backwards(self, orm): + # Deleting model 'Show' + db.delete_table(u'spa_show') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'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'}) + }, + 'schedule.calendar': { + 'Meta': {'object_name': 'Calendar'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200'}) + }, + 'schedule.event': { + 'Meta': {'object_name': 'Event'}, + 'calendar': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Calendar']", 'null': 'True', 'blank': 'True'}), + 'created_on': ('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', 'to': u"orm['auth.User']"}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'end': ('django.db.models.fields.DateTimeField', [], {}), + 'end_recurring_period': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'rule': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Rule']", 'null': 'True', 'blank': 'True'}), + 'start': ('django.db.models.fields.DateTimeField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'updated_on': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'schedule.rule': { + 'Meta': {'object_name': 'Rule'}, + 'description': ('django.db.models.fields.TextField', [], {}), + 'frequency': ('django.db.models.fields.CharField', [], {'max_length': '10'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'params': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + 'spa._lookup': { + 'Meta': {'object_name': '_Lookup'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'spa.activity': { + 'Meta': {'object_name': 'Activity'}, + 'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']", 'null': 'True', 'blank': 'True'}) + }, + 'spa.activitycomment': { + 'Meta': {'object_name': 'ActivityComment', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_comments'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activitydownload': { + 'Meta': {'object_name': 'ActivityDownload', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_downloads'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activityfavourite': { + 'Meta': {'object_name': 'ActivityFavourite', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_favourites'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activityfollow': { + 'Meta': {'object_name': 'ActivityFollow', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_follow'", 'to': "orm['spa.UserProfile']"}) + }, + 'spa.activitylike': { + 'Meta': {'object_name': 'ActivityLike', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_likes'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activityplay': { + 'Meta': {'object_name': 'ActivityPlay', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_plays'", 'to': "orm['spa.Mix']"}) + }, + 'spa.chatmessage': { + 'Meta': {'object_name': 'ChatMessage'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'message': ('django.db.models.fields.TextField', [], {}), + 'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'chat_messages'", 'null': 'True', 'to': "orm['spa.UserProfile']"}) + }, + 'spa.comment': { + 'Meta': {'object_name': 'Comment'}, + 'comment': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comments'", 'null': 'True', 'to': "orm['spa.Mix']"}), + 'time_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}) + }, + 'spa.genre': { + 'Meta': {'object_name': 'Genre'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}) + }, + 'spa.label': { + 'Meta': {'object_name': 'Label'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'spa.mix': { + 'Meta': {'object_name': 'Mix'}, + 'description': ('django.db.models.fields.TextField', [], {}), + 'download_allowed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'favourites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'favourites'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}), + 'filetype': ('django.db.models.fields.CharField', [], {'default': "'mp3'", 'max_length': '10'}), + 'genres': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['spa.Genre']", 'symmetrical': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_featured': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'likes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'likes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}), + 'mp3tags_updated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'uid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '38', 'blank': 'True'}), + 'upload_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2014, 4, 29, 0, 0)'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mixes'", 'to': "orm['spa.UserProfile']"}), + 'waveform_generated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'spa.notification': { + 'Meta': {'object_name': 'Notification'}, + 'accepted_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), + 'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'from_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'notifications'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'notification_html': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}), + 'target': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}), + 'verb': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}) + }, + 'spa.purchaselink': { + 'Meta': {'object_name': 'PurchaseLink'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'track': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'purchase_link'", 'to': "orm['spa.Tracklist']"}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + 'spa.recurrence': { + 'Meta': {'object_name': 'Recurrence', '_ormbases': ['spa._Lookup']}, + u'_lookup_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa._Lookup']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'spa.release': { + 'Meta': {'object_name': 'Release'}, + 'embed_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'release_artist': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'release_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 4, 29, 0, 0)'}), + 'release_description': ('django.db.models.fields.TextField', [], {}), + 'release_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'release_label': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Label']"}), + 'release_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']"}) + }, + 'spa.releaseaudio': { + 'Meta': {'object_name': 'ReleaseAudio'}, + 'description': ('django.db.models.fields.TextField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'release_audio'", 'null': 'True', 'to': "orm['spa.Release']"}) + }, + 'spa.show': { + 'Meta': {'object_name': 'Show', '_ormbases': ['schedule.Event']}, + u'event_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['schedule.Event']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'spa.tracklist': { + 'Meta': {'object_name': 'Tracklist'}, + 'artist': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'index': ('django.db.models.fields.SmallIntegerField', [], {}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tracklist'", 'to': "orm['spa.Mix']"}), + 'remixer': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'timeindex': ('django.db.models.fields.TimeField', [], {'null': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'spa.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'activity_sharing': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'activity_sharing_networks': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'avatar_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'city': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'country': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_known_session': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'default': 'None', 'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'userprofile'", 'unique': 'True', 'to': u"orm['auth.User']"}) + }, + 'spa.venue': { + 'Meta': {'object_name': 'Venue'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), + 'venue_address': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'venue_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'venue_name': ('django.db.models.fields.CharField', [], {'max_length': '250'}) + } + } + + complete_apps = ['spa'] \ No newline at end of file diff --git a/spa/models/__init__.py b/spa/models/__init__.py index 1240bad..75087f0 100755 --- a/spa/models/__init__.py +++ b/spa/models/__init__.py @@ -4,7 +4,6 @@ from chatmessage import ChatMessage from recurrence import Recurrence from comment import Comment from venue import Venue -from event import Event from label import Label from mix import Mix from activity import Activity @@ -13,3 +12,4 @@ from genre import Genre from tracklist import Tracklist from purchaselink import PurchaseLink from release import Release +from show import Show diff --git a/spa/models/event.py b/spa/models/event.py index ac45070..4404168 100755 --- a/spa/models/event.py +++ b/spa/models/event.py @@ -4,7 +4,7 @@ from django.db import models from spa.models import Recurrence from spa.models.venue import Venue - +""" class Event(models.Model): class Meta: app_label = 'spa' @@ -25,4 +25,5 @@ class Event(models.Model): return '/event/%i' % self.id def __unicode__(self): - return self.event_title \ No newline at end of file + return self.event_title +""" diff --git a/spa/models/show.py b/spa/models/show.py new file mode 100644 index 0000000..576f90c --- /dev/null +++ b/spa/models/show.py @@ -0,0 +1,23 @@ +from django.db.models import Q +from schedule.models import Event + +class ShowOverlapException(Exception): + pass + +class Show(Event): + class Meta: + app_label = 'spa' + + def save(self, force_insert=False, force_update=False, using=None, + update_fields=None): + """ + throw an exception if event overlaps with another event + """ + overlaps = Show.objects.filter( + Q(start__gte=self.start, end__lte=self.start) | + Q(start__gte=self.end, end__lte=self.end) + ) + if len(overlaps) != 0: + raise ShowOverlapException() + + return super(Show, self).save(force_insert, force_update, using, update_fields) \ No newline at end of file diff --git a/spa/models/userprofile.py b/spa/models/userprofile.py index 445b649..cf0ba02 100755 --- a/spa/models/userprofile.py +++ b/spa/models/userprofile.py @@ -12,9 +12,8 @@ from sorl import thumbnail from sorl.thumbnail.helpers import ThumbnailError from core.utils.file import generate_save_file_name -from core.utils.url import unique_slugify, wrap_full +from core.utils.url import unique_slugify from dss import settings -from spa.models.notification import Notification from spa.models._basemodel import _BaseModel diff --git a/spa/tests/schedule.py b/spa/tests/schedule.py new file mode 100644 index 0000000..3ef5a7e --- /dev/null +++ b/spa/tests/schedule.py @@ -0,0 +1,60 @@ +from datetime import datetime +from django.test import TestCase +from spa.models import Show +from spa.models.show import ShowOverlapException + +DATE_FORMAT = '%d/%m/%Y %H:%M:%S' +START_DATE = datetime.strptime("28/04/2013 12:00:00", DATE_FORMAT) +END_DATE = datetime.strptime("28/04/2013 13:00:00", DATE_FORMAT) + + +class TestScheduleOverlaps(TestCase): + def setUp(self): + Show.objects.all().delete() + Show(description="Test event one", start=START_DATE, end=END_DATE).save() + + def test_first_show_saved(self): + self.assertEqual(len(Show.objects.all()), 1) + + def test_same_event_overlap(self): + try: + Show(description="Test overlapping event", start=START_DATE, end=END_DATE).save() + self.fail("Shows cannot overlap each other") + except ShowOverlapException: + pass + except Exception, ex: + self.fail(ex.message) + + def test_two_events_flush(self): + try: + start = datetime.strptime("28/04/2013 13:00:00", DATE_FORMAT) + end = datetime.strptime("28/04/2013 14:00:00", DATE_FORMAT) + Show(description="Another show begins in middle of this show", start=start, end=end).save() + except ShowOverlapException: + self.fail("These events do not overlap, they are flush") + except Exception, ex: + self.fail(ex.message) + + def test_event_straddle_start_end(self): + try: + start = datetime.strptime("28/04/2013 11:30:00", DATE_FORMAT) + end = datetime.strptime("28/04/2013 12:30:00", DATE_FORMAT) + Show(description="Another show begins in middle of this show", start=start, end=end).save() + self.fail("Should not be able to save a show straddling another show") + except ShowOverlapException: + pass + except Exception, ex: + self.fail(ex.message) + + def test_event_straddle_end_start(self): + try: + start = datetime.strptime("28/04/2013 12:30:00", DATE_FORMAT) + end = datetime.strptime("28/04/2013 13:30:00", DATE_FORMAT) + s = Show(description="Show begins in middle of another show", start=start, end=end) + s.save() + import ipdb; ipdb.set_trace() + self.fail("Should not be able to save a show straddling another show") + except ShowOverlapException: + pass + except Exception, ex: + self.fail(ex.message) diff --git a/spa/urls.py b/spa/urls.py index dbec997..172c675 100755 --- a/spa/urls.py +++ b/spa/urls.py @@ -7,12 +7,13 @@ from spa.api.v1.NotificationResource import NotificationResource from spa.audio import AudioHandler from spa.api.v1.ChatResource import ChatResource from spa.api.v1.CommentResource import CommentResource -from spa.api.v1.EventResource import EventResource +#from spa.api.v1.EventResource import EventResource from spa.api.v1.MixResource import MixResource from spa.api.v1.ReleaseAudioResource import ReleaseAudioResource from spa.api.v1.ReleaseResource import ReleaseResource from spa.api.v1.UserResource import UserResource from spa.api.v1.ActivityResource import ActivityResource +from spa.api.v1.ShowResource import ShowResource api = Api(api_name='v1') api.register(ChatResource()) @@ -20,10 +21,11 @@ api.register(CommentResource()) api.register(MixResource()) api.register(ReleaseResource()) api.register(ReleaseAudioResource()) -api.register(EventResource()) +#api.register(EventResource()) api.register(UserResource()) api.register(ActivityResource()) api.register(NotificationResource()) +api.register(ShowResource()) api.register(DebugResource()) ajax = AjaxHandler() @@ -35,7 +37,6 @@ urlpatterns = patterns( url(r'^tpl/(?P\w+)/$', 'spa.templates.get_template'), url(r'^dlg/(?P\w+)/$', 'spa.templates.get_dialog'), url(r'^dlg/embed/(?P[\w\d_.-]+)/$', 'spa.templates.get_embed_codes_dialog'), - url(r'^js/(?P\w+)/$', 'spa.templates.get_javascript'), url(r'^tplex/(?P\w+)/$', 'spa.templates.get_template_ex'), url(r'^podcast', 'spa.podcast.get_default_podcast'), @@ -51,5 +52,3 @@ urlpatterns = patterns( url(r'^comments/', include('django.contrib.comments.urls')), (r'^.*/$', 'spa.views.default') ) - - diff --git a/spa/views.py b/spa/views.py index ccad870..1505859 100755 --- a/spa/views.py +++ b/spa/views.py @@ -27,7 +27,7 @@ def app(request): 'bust': uuid.uuid1() } - if request.user_agent.browser.family == 'Firefox': + if request.user_agent.browser.family == '___Firefox___': context['ua_html'] = \ """
\t\t\t\t
\t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t
\t\t\t\t
\t\t\t\t
\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\t\t\t \t\t\t \t\t\t" + modal = $(modal).appendTo("body") + modal.find("form").on "submit", (ev) -> + ev.preventDefault() + calEvent.title = $(this).find("input[type=text]").val() + calendar.fullCalendar "updateEvent", calEvent + modal.modal "hide" + return + + modal.find("button[data-action=delete]").on "click", -> + calendar.fullCalendar "removeEvents", (ev) -> + ev._id is calEvent._id + + modal.modal "hide" + return + + modal.modal("show").on "hidden", -> + modal.remove() + return + + return + ) + true + + ScheduleView + + diff --git a/static/js/app/views/schedule/scheduleView.js b/static/js/app/views/schedule/scheduleView.js new file mode 100644 index 0000000..b18b899 --- /dev/null +++ b/static/js/app/views/schedule/scheduleView.js @@ -0,0 +1,125 @@ +// Generated by CoffeeScript 1.4.0 +(function() { + var __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + + define(['app', 'vent', 'marionette', 'fullcalendar', 'text!/tpl/ScheduleView'], function(App, vent, Marionette, fullcalendar, Template) { + var ScheduleView; + ScheduleView = (function(_super) { + + __extends(ScheduleView, _super); + + function ScheduleView() { + return ScheduleView.__super__.constructor.apply(this, arguments); + } + + ScheduleView.prototype.template = _.template(Template); + + ScheduleView.prototype.onShow = function() { + var calendar, d, date, m, y; + $("#external-events div.external-event").each(function() { + var eventObject; + eventObject = { + title: $.trim($(this).text()) + }; + $(this).data("eventObject", eventObject); + $(this).draggable({ + zIndex: 999, + revert: true, + revertDuration: 0 + }); + }); + date = new Date(); + d = date.getDate(); + m = date.getMonth(); + y = date.getFullYear(); + return calendar = $("#calendar").fullCalendar({ + buttonText: { + prev: "", + next: "" + }, + header: { + left: "prev,next today", + center: "title", + right: "month,agendaWeek,agendaDay" + }, + events: [ + { + title: "All Day Event", + start: new Date(y, m, 1), + className: "label-important" + }, { + title: "Long Event", + start: new Date(y, m, d - 5), + end: new Date(y, m, d - 2), + className: "label-success" + }, { + title: "Some Event", + start: new Date(y, m, d - 3, 16, 0), + allDay: false + } + ], + editable: true, + droppable: true, + drop: function(date, allDay) { + var $extraEventClass, copiedEventObject, originalEventObject; + originalEventObject = $(this).data("eventObject"); + $extraEventClass = $(this).attr("data-class"); + copiedEventObject = $.extend({}, originalEventObject); + copiedEventObject.start = date; + copiedEventObject.allDay = allDay; + if ($extraEventClass) { + copiedEventObject["className"] = [$extraEventClass]; + } + $("#calendar").fullCalendar("renderEvent", copiedEventObject, true); + if ($("#drop-remove").is(":checked")) { + $(this).remove(); + } + }, + selectable: true, + selectHelper: true, + select: function(start, end, allDay) { + bootbox.prompt("New Event Title:", function(title) { + if (title !== null) { + calendar.fullCalendar("renderEvent", { + title: title, + start: start, + end: end, + allDay: allDay + }, true); + } + }); + calendar.fullCalendar("unselect"); + }, + eventClick: function(calEvent, jsEvent, view) { + var modal; + modal = "
\t\t\t
\t\t\t
\t\t\t\t
\t\t\t\t \t\t\t\t
\t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t
\t\t\t\t
\t\t\t\t
\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\t\t\t
\t\t\t
\t\t\t
"; + modal = $(modal).appendTo("body"); + modal.find("form").on("submit", function(ev) { + ev.preventDefault(); + calEvent.title = $(this).find("input[type=text]").val(); + calendar.fullCalendar("updateEvent", calEvent); + modal.modal("hide"); + }); + modal.find("button[data-action=delete]").on("click", function() { + calendar.fullCalendar("removeEvents", function(ev) { + return ev._id === calEvent._id; + }); + modal.modal("hide"); + }); + modal.modal("show").on("hidden", function() { + modal.remove(); + }); + } + }); + }; + + true; + + return ScheduleView; + + })(Marionette.ItemView); + return ScheduleView; + }); + +}).call(this); diff --git a/static/js/main.js b/static/js/main.js index 84eed17..bdaf107 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -5,6 +5,7 @@ requirejs.config({ paths: { site: 'app/site', jquery: 'lib/jquery', + 'jquery-ui': 'lib/ace/uncompressed/jquery-ui-1.10.3.custom', backbone: 'lib/backbone', 'backbone-associations': 'lib/backbone.associations', 'backbone.syphon': 'lib/backbone.syphon', @@ -26,6 +27,7 @@ requirejs.config({ wysiwyg: 'lib/ace/uncompressed/bootstrap-wysiwyg', wizard: 'lib/ace/uncompressed/fuelux/fuelux.wizard', dropzone: 'lib/ace/uncompressed/dropzone', + fullcalendar: 'lib/ace/uncompressed/fullcalendar', 'ace-editable': 'lib/ace/uncompressed/x-editable/ace-editable', 'bootstrap-editable': 'lib/ace/uncompressed/x-editable/bootstrap-editable', 'facebook': '//connect.facebook.net/en_US/all', @@ -82,6 +84,10 @@ requirejs.config({ 'facebook': { exports: 'FB' }, + 'fullcalendar': { + exports: 'fullCalendar', + deps: ['jquery', 'jquery-ui'] + }, 'ace': { exports: 'ace', deps: ['jquery', 'lib/ace/uncompressed/ace-elements', 'lib/ace/uncompressed/ace-extra'] diff --git a/templates/base.html b/templates/base.html index ebc5084..37f6049 100755 --- a/templates/base.html +++ b/templates/base.html @@ -12,6 +12,7 @@ + diff --git a/templates/views/EmptyTemplate.html b/templates/views/EmptyTemplate.html new file mode 100644 index 0000000..65fbe4e --- /dev/null +++ b/templates/views/EmptyTemplate.html @@ -0,0 +1 @@ +

Add some stuff!!

\ No newline at end of file diff --git a/templates/views/MixListView.html b/templates/views/MixListView.html index 4715b49..b05bf69 100755 --- a/templates/views/MixListView.html +++ b/templates/views/MixListView.html @@ -1,2 +1 @@
    -
    No items to display
    \ No newline at end of file diff --git a/templates/views/ScheduleView.html b/templates/views/ScheduleView.html new file mode 100644 index 0000000..c0653ed --- /dev/null +++ b/templates/views/ScheduleView.html @@ -0,0 +1,61 @@ +
    +
    +
    + +
    +
    + +
    +
    +
    +

    Draggable events

    +
    + +
    +
    +
    +
    + + My Event 1 +
    + +
    + + My Event 2 +
    + +
    + + My Event 3 +
    + +
    + + My Event 4 +
    + +
    + + My Event 5 +
    + +
    + + My Event 6 +
    + +
    + + My Event 7 +
    + + +
    +
    +
    +
    +
    +
    \ No newline at end of file