From be038e58e2876f198dbe7e1667cabf0a1b83d39d Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 14 Jul 2013 22:11:31 +0100 Subject: [PATCH] First draft of notifications system --- spa/api/v1/ActivityResource.py | 2 +- spa/api/v1/NotificationResource.py | 27 + spa/api/v1/UserResource.py | 9 +- .../0023_auto__add_activityfollow.py | 227 ++ .../0024_auto__add_notifications.py | 238 ++ ...dd_field_notifications_notification_url.py | 234 ++ ...to__del_notifications__add_notification.py | 254 ++ spa/migrations/0027_auto__del_activitymix.py | 231 ++ ...o__add_field_notification_accepted_date.py | 231 ++ ...ion_verb__add_field_notification_object.py | 241 ++ ...n_object__add_field_notification_target.py | 241 ++ spa/models/__init__.py | 1 + spa/models/activity.py | 66 +- spa/models/notification.py | 16 + spa/models/userprofile.py | 19 - spa/signals.py | 36 +- spa/urls.py | 2 + static/bin/jplayer/jwplayer.flash.swf | Bin 0 -> 142663 bytes static/css/animate-custom.css | 3202 +++++++++++++++++ static/css/deepsouthsounds.css | 49 +- static/js/app/dss.bootstrapper.js | 6 +- static/js/app/lib/controller.coffee | 1 - static/js/app/lib/controller.js | 17 +- .../notificationCollection.coffee | 22 + .../notifications/notificationCollection.js | 49 + .../notifications/notificationItem.coffee | 10 + .../models/notifications/notificationItem.js | 29 + .../views/activity/activityItemView.coffee | 5 +- .../js/app/views/activity/activityItemView.js | 5 +- .../views/activity/activityListView.coffee | 7 +- .../js/app/views/activity/activityListView.js | 9 +- static/js/app/views/mix/mixListView.coffee | 12 +- static/js/app/views/mix/mixListView.js | 12 +- .../notificationsItemView.coffee | 5 + .../notifications/notificationsItemView.js | 25 + .../notificationsListView.coffee | 29 + .../notifications/notificationsListView.js | 55 + .../js/app/views/sidebar/sidebarView.coffee | 4 - static/js/app/views/sidebar/sidebarView.js | 17 +- static/js/app/views/widgets/headerView.coffee | 18 +- static/js/app/views/widgets/headerView.js | 27 +- static/js/app/views/widgets/searchView.coffee | 2 - static/js/app/views/widgets/searchView.js | 13 +- templates/base.html | 2 + templates/inc/facebook/mix.html | 17 +- templates/views/HeaderView.html | 11 +- templates/views/MixEditView.html | 3 +- templates/views/NotificationsItemView.html | 15 + templates/views/NotificationsListView.html | 10 + 49 files changed, 5614 insertions(+), 149 deletions(-) create mode 100644 spa/api/v1/NotificationResource.py create mode 100644 spa/migrations/0023_auto__add_activityfollow.py create mode 100644 spa/migrations/0024_auto__add_notifications.py create mode 100644 spa/migrations/0025_auto__add_field_notifications_notification_url.py create mode 100644 spa/migrations/0026_auto__del_notifications__add_notification.py create mode 100644 spa/migrations/0027_auto__del_activitymix.py create mode 100644 spa/migrations/0028_auto__add_field_notification_accepted_date.py create mode 100644 spa/migrations/0029_auto__add_field_notification_verb__add_field_notification_object.py create mode 100644 spa/migrations/0030_auto__del_field_notification_object__add_field_notification_target.py create mode 100644 spa/models/notification.py create mode 100644 static/bin/jplayer/jwplayer.flash.swf create mode 100644 static/css/animate-custom.css create mode 100644 static/js/app/models/notifications/notificationCollection.coffee create mode 100644 static/js/app/models/notifications/notificationCollection.js create mode 100644 static/js/app/models/notifications/notificationItem.coffee create mode 100644 static/js/app/models/notifications/notificationItem.js create mode 100644 static/js/app/views/notifications/notificationsItemView.coffee create mode 100644 static/js/app/views/notifications/notificationsItemView.js create mode 100644 static/js/app/views/notifications/notificationsListView.coffee create mode 100644 static/js/app/views/notifications/notificationsListView.js create mode 100644 templates/views/NotificationsItemView.html create mode 100644 templates/views/NotificationsListView.html diff --git a/spa/api/v1/ActivityResource.py b/spa/api/v1/ActivityResource.py index fa5c773..1b08363 100755 --- a/spa/api/v1/ActivityResource.py +++ b/spa/api/v1/ActivityResource.py @@ -25,7 +25,7 @@ class ActivityResource(BackboneCompatibleResource): user_image = UserProfile.get_default_avatar_image() user_profile = "" - bundle.data["verb"] = bundle.obj.get_verb_passed(), + bundle.data["verb"] = bundle.obj.get_verb_past(), bundle.data["object"] = bundle.obj.get_object_singular(), bundle.data["item_name"] = bundle.obj.get_object_name(), bundle.data["item_url"] = bundle.obj.get_object_url(), diff --git a/spa/api/v1/NotificationResource.py b/spa/api/v1/NotificationResource.py new file mode 100644 index 0000000..b6acb81 --- /dev/null +++ b/spa/api/v1/NotificationResource.py @@ -0,0 +1,27 @@ +from tastypie.authentication import SessionAuthentication +from tastypie.authorization import DjangoAuthorization +from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource +from spa.models.notification import Notification + + +class NotificationResource(BackboneCompatibleResource): + class Meta: + queryset = Notification.objects.order_by('-id') + resource_name = 'notification' + authentication = SessionAuthentication() + authorization = DjangoAuthorization() + always_return_data = True + excludes = ['accepted_date', 'id'] + + def authorized_read_list(self, object_list, bundle): + return object_list.filter(to_user=bundle.request.user) + + def dehydrate(self, bundle): + bundle.data['user_image'] = bundle.obj.from_user.get_small_profile_image() + bundle.data['user_name'] = bundle.obj.from_user.get_nice_name() + + return bundle + + def alter_list_data_to_serialize(self, request, data): + data['meta']['is_new'] = Notification.objects.filter(to_user=request.user, accepted_date__isnull=True).count() + return data \ No newline at end of file diff --git a/spa/api/v1/UserResource.py b/spa/api/v1/UserResource.py index c5916d5..2dcda80 100755 --- a/spa/api/v1/UserResource.py +++ b/spa/api/v1/UserResource.py @@ -10,6 +10,7 @@ from tastypie.utils import trailing_slash from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource from spa.api.v1.MixResource import MixResource +from spa.models.activity import ActivityFollow from spa.models.userprofile import UserProfile from spa.models.mix import Mix @@ -32,6 +33,9 @@ class UserResource(BackboneCompatibleResource): url(r"^(?P%s)/(?P[\w\d_.-]+)/favourites%s$" % ( self._meta.resource_name, trailing_slash()), self.wrap_view('get_user_favourites'), name="api_get_user_favourites"), + url(r"^(?P%s)/(?P[\w\d_.-]+)/activity%s$" % ( + self._meta.resource_name, trailing_slash()), + self.wrap_view('get_user_activity'), name="api_get_user_activity"), url(r"^(?P%s)/(?P\d+)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name="api_dispatch_detail"), url(r"^(?P%s)/(?P[\w\d_.-]+)/$" % self._meta.resource_name, @@ -73,10 +77,13 @@ class UserResource(BackboneCompatibleResource): #Handle the patched items from backbone if bundle.data['following']: bundle.obj.add_follower(bundle.request.user.get_profile()) + activity = ActivityFollow() + activity.user = bundle.request.user.get_profile() + activity.to_user = bundle.obj + activity.save() else: bundle.obj.remove_follower(bundle.request.user.get_profile()) - def obj_update(self, bundle, skip_errors=False, **kwargs): """ This feels extremely hacky - but for some reason, deleting from the bundle diff --git a/spa/migrations/0023_auto__add_activityfollow.py b/spa/migrations/0023_auto__add_activityfollow.py new file mode 100644 index 0000000..e5487e4 --- /dev/null +++ b/spa/migrations/0023_auto__add_activityfollow.py @@ -0,0 +1,227 @@ +# -*- 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 'ActivityFollow' + db.create_table(u'spa_activityfollow', ( + (u'activity_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['spa.Activity'], unique=True, primary_key=True)), + ('to_user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='follower_activity', to=orm['spa.UserProfile'])), + )) + db.send_create_signal('spa', ['ActivityFollow']) + + + def backwards(self, orm): + # Deleting model 'ActivityFollow' + db.delete_table(u'spa_activityfollow') + + + 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'}) + }, + '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.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': "'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': "'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': "'follower_activity'", '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': "'likes'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activitymix': { + 'Meta': {'object_name': 'ActivityMix', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}) + }, + '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': "'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + '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(2013, 7, 12, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 7, 12, 0, 0)'}), + 'event_description': ('tinymce.models.HTMLField', [], {}), + 'event_recurrence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Recurrence']"}), + 'event_time': ('django.db.models.fields.TimeField', [], {'default': 'datetime.datetime(2013, 7, 12, 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'}), + 'download_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'stream_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + '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(2013, 7, 12, 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.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(2013, 7, 12, 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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + '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': '100', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'followers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'following_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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/0024_auto__add_notifications.py b/spa/migrations/0024_auto__add_notifications.py new file mode 100644 index 0000000..674e0e8 --- /dev/null +++ b/spa/migrations/0024_auto__add_notifications.py @@ -0,0 +1,238 @@ +# -*- 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 'Notifications' + db.create_table(u'spa_notifications', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('to_user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='to_notications', to=orm['spa.UserProfile'])), + ('from_user', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='notifications', null=True, to=orm['spa.UserProfile'])), + ('date', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), + ('notification_text', self.gf('django.db.models.fields.CharField')(max_length=1024)), + )) + db.send_create_signal('spa', ['Notifications']) + + + def backwards(self, orm): + # Deleting model 'Notifications' + db.delete_table(u'spa_notifications') + + + 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'}) + }, + '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.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': "'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': "'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': "'follower_activity'", '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': "'likes'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activitymix': { + 'Meta': {'object_name': 'ActivityMix', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}) + }, + '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': "'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + '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(2013, 7, 14, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 7, 14, 0, 0)'}), + 'event_description': ('tinymce.models.HTMLField', [], {}), + 'event_recurrence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Recurrence']"}), + 'event_time': ('django.db.models.fields.TimeField', [], {'default': 'datetime.datetime(2013, 7, 14, 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'}), + 'download_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'stream_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + '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(2013, 7, 14, 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.notifications': { + 'Meta': {'object_name': 'Notifications'}, + '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_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}) + }, + '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(2013, 7, 14, 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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + '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': '100', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'followers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'following_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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/0025_auto__add_field_notifications_notification_url.py b/spa/migrations/0025_auto__add_field_notifications_notification_url.py new file mode 100644 index 0000000..bf6268b --- /dev/null +++ b/spa/migrations/0025_auto__add_field_notifications_notification_url.py @@ -0,0 +1,234 @@ +# -*- 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 field 'Notifications.notification_url' + db.add_column(u'spa_notifications', 'notification_url', + self.gf('django.db.models.fields.URLField')(max_length=200, null=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Notifications.notification_url' + db.delete_column(u'spa_notifications', 'notification_url') + + + 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'}) + }, + '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.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': "'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': "'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': "'follower_activity'", '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': "'likes'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activitymix': { + 'Meta': {'object_name': 'ActivityMix', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}) + }, + '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': "'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + '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(2013, 7, 14, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 7, 14, 0, 0)'}), + 'event_description': ('tinymce.models.HTMLField', [], {}), + 'event_recurrence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Recurrence']"}), + 'event_time': ('django.db.models.fields.TimeField', [], {'default': 'datetime.datetime(2013, 7, 14, 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'}), + 'download_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'stream_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + '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(2013, 7, 14, 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.notifications': { + 'Meta': {'object_name': 'Notifications'}, + '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_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}) + }, + '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(2013, 7, 14, 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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + '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': '100', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'followers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'following_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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/0026_auto__del_notifications__add_notification.py b/spa/migrations/0026_auto__del_notifications__add_notification.py new file mode 100644 index 0000000..4ef9da2 --- /dev/null +++ b/spa/migrations/0026_auto__del_notifications__add_notification.py @@ -0,0 +1,254 @@ +# -*- 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): + # Deleting model 'Notifications' + db.delete_table(u'spa_notifications') + + # Adding model 'Notification' + db.create_table(u'spa_notification', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('to_user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='to_notications', to=orm['spa.UserProfile'])), + ('from_user', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='notifications', null=True, to=orm['spa.UserProfile'])), + ('date', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), + ('notification_text', self.gf('django.db.models.fields.CharField')(max_length=1024)), + ('notification_url', self.gf('django.db.models.fields.URLField')(max_length=200, null=True)), + )) + db.send_create_signal('spa', ['Notification']) + + + def backwards(self, orm): + # Adding model 'Notifications' + db.create_table(u'spa_notifications', ( + ('notification_url', self.gf('django.db.models.fields.URLField')(max_length=200, null=True)), + ('notification_text', self.gf('django.db.models.fields.CharField')(max_length=1024)), + ('to_user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='to_notications', to=orm['spa.UserProfile'])), + ('from_user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='notifications', null=True, to=orm['spa.UserProfile'], blank=True)), + ('date', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('spa', ['Notifications']) + + # Deleting model 'Notification' + db.delete_table(u'spa_notification') + + + 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'}) + }, + '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.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': "'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': "'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': "'follower_activity'", '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': "'likes'", 'to': "orm['spa.Mix']"}) + }, + 'spa.activitymix': { + 'Meta': {'object_name': 'ActivityMix', '_ormbases': ['spa.Activity']}, + u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}) + }, + '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': "'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + '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(2013, 7, 14, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 7, 14, 0, 0)'}), + 'event_description': ('tinymce.models.HTMLField', [], {}), + 'event_recurrence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Recurrence']"}), + 'event_time': ('django.db.models.fields.TimeField', [], {'default': 'datetime.datetime(2013, 7, 14, 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'}), + 'download_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'stream_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + '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(2013, 7, 14, 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'}, + '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_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}) + }, + '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(2013, 7, 14, 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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + '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': '100', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'followers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'following_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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/0027_auto__del_activitymix.py b/spa/migrations/0027_auto__del_activitymix.py new file mode 100644 index 0000000..8e56a9a --- /dev/null +++ b/spa/migrations/0027_auto__del_activitymix.py @@ -0,0 +1,231 @@ +# -*- 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): + # Deleting model 'ActivityMix' + db.delete_table(u'spa_activitymix') + + + def backwards(self, orm): + # Adding model 'ActivityMix' + db.create_table(u'spa_activitymix', ( + (u'activity_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['spa.Activity'], unique=True, primary_key=True)), + )) + db.send_create_signal('spa', ['ActivityMix']) + + + 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'}) + }, + '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.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': "'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': "'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': "'follower_activity'", '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': "'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': "'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + '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(2013, 7, 14, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 7, 14, 0, 0)'}), + 'event_description': ('tinymce.models.HTMLField', [], {}), + 'event_recurrence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Recurrence']"}), + 'event_time': ('django.db.models.fields.TimeField', [], {'default': 'datetime.datetime(2013, 7, 14, 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'}), + 'download_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'stream_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + '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(2013, 7, 14, 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'}, + '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_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}) + }, + '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(2013, 7, 14, 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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + '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': '100', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'followers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'following_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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/0028_auto__add_field_notification_accepted_date.py b/spa/migrations/0028_auto__add_field_notification_accepted_date.py new file mode 100644 index 0000000..b723bb2 --- /dev/null +++ b/spa/migrations/0028_auto__add_field_notification_accepted_date.py @@ -0,0 +1,231 @@ +# -*- 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 field 'Notification.accepted_date' + db.add_column(u'spa_notification', 'accepted_date', + self.gf('django.db.models.fields.DateTimeField')(null=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Notification.accepted_date' + db.delete_column(u'spa_notification', 'accepted_date') + + + 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'}) + }, + '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.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': "'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': "'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': "'follower_activity'", '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': "'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': "'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + '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(2013, 7, 14, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 7, 14, 0, 0)'}), + 'event_description': ('tinymce.models.HTMLField', [], {}), + 'event_recurrence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Recurrence']"}), + 'event_time': ('django.db.models.fields.TimeField', [], {'default': 'datetime.datetime(2013, 7, 14, 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'}), + 'download_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'stream_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + '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(2013, 7, 14, 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_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}), + 'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}) + }, + '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(2013, 7, 14, 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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + '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': '100', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'followers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'following_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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/0029_auto__add_field_notification_verb__add_field_notification_object.py b/spa/migrations/0029_auto__add_field_notification_verb__add_field_notification_object.py new file mode 100644 index 0000000..e77bdfe --- /dev/null +++ b/spa/migrations/0029_auto__add_field_notification_verb__add_field_notification_object.py @@ -0,0 +1,241 @@ +# -*- 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 field 'Notification.verb' + db.add_column(u'spa_notification', 'verb', + self.gf('django.db.models.fields.CharField')(max_length=200, null=True), + keep_default=False) + + # Adding field 'Notification.object' + db.add_column(u'spa_notification', 'object', + self.gf('django.db.models.fields.CharField')(max_length=200, null=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Notification.verb' + db.delete_column(u'spa_notification', 'verb') + + # Deleting field 'Notification.object' + db.delete_column(u'spa_notification', 'object') + + + 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'}) + }, + '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.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': "'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': "'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': "'follower_activity'", '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': "'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': "'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + '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(2013, 7, 14, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 7, 14, 0, 0)'}), + 'event_description': ('tinymce.models.HTMLField', [], {}), + 'event_recurrence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Recurrence']"}), + 'event_time': ('django.db.models.fields.TimeField', [], {'default': 'datetime.datetime(2013, 7, 14, 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'}), + 'download_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'stream_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + '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(2013, 7, 14, 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_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}), + 'object': ('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(2013, 7, 14, 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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + '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': '100', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'followers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'following_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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/0030_auto__del_field_notification_object__add_field_notification_target.py b/spa/migrations/0030_auto__del_field_notification_object__add_field_notification_target.py new file mode 100644 index 0000000..22db519 --- /dev/null +++ b/spa/migrations/0030_auto__del_field_notification_object__add_field_notification_target.py @@ -0,0 +1,241 @@ +# -*- 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): + # Deleting field 'Notification.object' + db.delete_column(u'spa_notification', 'object') + + # Adding field 'Notification.target' + db.add_column(u'spa_notification', 'target', + self.gf('django.db.models.fields.CharField')(max_length=200, null=True), + keep_default=False) + + + def backwards(self, orm): + # Adding field 'Notification.object' + db.add_column(u'spa_notification', 'object', + self.gf('django.db.models.fields.CharField')(max_length=200, null=True), + keep_default=False) + + # Deleting field 'Notification.target' + db.delete_column(u'spa_notification', 'target') + + + 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'}) + }, + '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.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': "'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': "'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': "'follower_activity'", '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': "'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': "'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', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + }, + '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(2013, 7, 14, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 7, 14, 0, 0)'}), + 'event_description': ('tinymce.models.HTMLField', [], {}), + 'event_recurrence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Recurrence']"}), + 'event_time': ('django.db.models.fields.TimeField', [], {'default': 'datetime.datetime(2013, 7, 14, 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'}), + 'download_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), + 'stream_url': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + '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(2013, 7, 14, 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_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(2013, 7, 14, 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'}), + 'local_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + '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': '100', 'blank': 'True'}), + 'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}), + 'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}), + 'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'followers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + 'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'following_rel_+'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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 915982c..1240bad 100755 --- a/spa/models/__init__.py +++ b/spa/models/__init__.py @@ -8,6 +8,7 @@ from event import Event from label import Label from mix import Mix from activity import Activity +from notification import Notification from genre import Genre from tracklist import Tracklist from purchaselink import PurchaseLink diff --git a/spa/models/activity.py b/spa/models/activity.py index bfe4de8..1929d49 100755 --- a/spa/models/activity.py +++ b/spa/models/activity.py @@ -1,7 +1,9 @@ from django.db import models from model_utils.managers import InheritanceManager +from spa.models.notification import Notification from spa.models.userprofile import UserProfile from spa.models._basemodel import _BaseModel +import abc ACTIVITYTYPES = ( ('p', 'played'), @@ -17,28 +19,63 @@ class Activity(_BaseModel): date = models.DateTimeField(auto_now=True) def __unicode__(self): - return "%s" % self.date + return "%s" % self.get_object_name() + + def create_notification(self): + notification = Notification() + notification.from_user = self.user + notification.to_user = self.get_target_user() + notification.notification_text = "%s %s %s" % (self.user, self.get_verb_past(), self.get_object_name()) + notification.notification_url = self.get_object_url() + notification.verb = self.get_verb_past() + notification.target = self.get_object_name() + notification.save() def get_activity_url(self): return '/api/v1/activity/%s' % self.id + @abc.abstractmethod + def get_target_user(self): + pass -class ActivityMix(Activity): - objects = InheritanceManager() + @abc.abstractmethod + def get_object_name(self): + pass + + @abc.abstractmethod + def get_object_url(self): + pass + + @abc.abstractmethod + def get_object_singular(self): + pass + + +class ActivityFollow(Activity): + to_user = models.ForeignKey('spa.UserProfile', related_name='follower_activity') + + def get_target_user(self): + return self.user def get_object_name(self): - return self.mix.title + return self.user.get_nice_name() def get_object_url(self): - return self.mix.get_absolute_url() + return self.user.get_profile_url() def get_object_singular(self): - return "mix" + return "user" + + def get_verb_past(self): + return "followed" class ActivityFavourite(Activity): mix = models.ForeignKey('spa.Mix', related_name='favourites') + def get_target_user(self): + return self.mix.user + def get_object_name(self): return self.mix.title @@ -48,13 +85,16 @@ class ActivityFavourite(Activity): def get_object_singular(self): return "mix" - def get_verb_passed(self): + def get_verb_past(self): return "favourited" class ActivityPlay(Activity): mix = models.ForeignKey('spa.Mix', related_name='plays') + def get_target_user(self): + return self.mix.user + def get_object_name(self): return self.mix.title @@ -64,13 +104,16 @@ class ActivityPlay(Activity): def get_object_singular(self): return "mix" - def get_verb_passed(self): + def get_verb_past(self): return "played" class ActivityLike(Activity): mix = models.ForeignKey('spa.Mix', related_name='likes') + def get_target_user(self): + return self.mix.user + def get_object_name(self): return self.mix.title @@ -80,13 +123,16 @@ class ActivityLike(Activity): def get_object_singular(self): return "mix" - def get_verb_passed(self): + def get_verb_past(self): return "liked" class ActivityDownload(Activity): mix = models.ForeignKey('spa.Mix', related_name='downloads') + def get_target_user(self): + return self.mix.user + def get_object_name(self): return self.mix.title @@ -96,5 +142,5 @@ class ActivityDownload(Activity): def get_object_singular(self): return "mix" - def get_verb_passed(self): + def get_verb_past(self): return "downloaded" diff --git a/spa/models/notification.py b/spa/models/notification.py new file mode 100644 index 0000000..d0667fc --- /dev/null +++ b/spa/models/notification.py @@ -0,0 +1,16 @@ +from django.db import models +from spa.models import _BaseModel, UserProfile + + +class Notification(_BaseModel): + to_user = models.ForeignKey(UserProfile, related_name='to_notications') + from_user = models.ForeignKey(UserProfile, related_name='notifications', null=True, blank=True) + date = models.DateTimeField(auto_now=True) + + notification_text = models.CharField(max_length=1024) + notification_url = models.URLField(null=True) + + verb = models.CharField(max_length=200, null=True) + target = models.CharField(max_length=200, null=True) + + accepted_date = models.DateTimeField(null=True) \ No newline at end of file diff --git a/spa/models/userprofile.py b/spa/models/userprofile.py index 3a98a19..1678915 100755 --- a/spa/models/userprofile.py +++ b/spa/models/userprofile.py @@ -185,22 +185,3 @@ class UserProfile(_BaseModel): def get_default_avatar_image(cls): return urlparse.urljoin(settings.STATIC_URL, "img/default-avatar-32.png") - """ - handle custom patch methods from tastypie - feels smelly, maybe introduce a tier between - the API and the models to handle these patches - """ - def update_following(self, user, value): - try: - if user is None: - return - if user.is_authenticated(): - if value: - if self.favourites.filter(user=user).count() == 0: - ActivityFavourite(user=user.get_profile(), mix=self).save() - else: - self.favourites.filter(user=user).delete() - except Exception, ex: - self.logger.error("Exception updating favourite: %s" % ex.message) - - diff --git a/spa/signals.py b/spa/signals.py index d4afe66..939b8d4 100755 --- a/spa/signals.py +++ b/spa/signals.py @@ -9,7 +9,7 @@ from core.utils.audio.mp3 import mp3_length from dss import settings from spa.models.userprofile import UserProfile -from spa.models.activity import ActivityPlay +from spa.models.activity import ActivityPlay, ActivityDownload, ActivityFavourite, ActivityLike, ActivityFollow, Activity from spa.models.mix import Mix waveform_generated = Signal() @@ -41,11 +41,20 @@ class ActivityThread(threading.Thread): post_activity(self.instance.get_activity_url()) -def send_activity_to_realtime(sender, instance, created, **kwargs): +def process_activity(sender, instance, created, **kwargs): + send_activity_to_realtime(instance) + create_notfication(instance.mix.user) + pass + + +def send_activity_to_realtime(instance): ActivityThread(instance=instance).start() - -post_save.connect(send_activity_to_realtime, sender=ActivityPlay, dispatch_uid="activity-realtime-play") +#post_save.connect(process_activity, sender=Activity, dispatch_uid="activity-realtime-play") +#post_save.connect(process_activity, sender=ActivityFollow, dispatch_uid="activity-realtime-play") +#post_save.connect(process_activity, sender=ActivityFavourite, dispatch_uid="activity-realtime-play") +#post_save.connect(process_activity, sender=ActivityDownload, dispatch_uid="activity-realtime-play") +#post_save.connect(process_activity, sender=ActivityLike, dispatch_uid="activity-realtime-play") def create_profile(sender, **kw): @@ -53,6 +62,8 @@ def create_profile(sender, **kw): if kw["created"]: up = UserProfile(user=user) up.save() + + post_save.connect(create_profile, sender=User) if "notification" in settings.INSTALLED_APPS: @@ -64,4 +75,19 @@ if "notification" in settings.INSTALLED_APPS: signals.post_migrate.connect(create_notice_types, sender=notification) else: - print "Skipping creation of NoticeTypes as notification app not found" \ No newline at end of file + print "Skipping creation of NoticeTypes as notification app not found" + +""" + Doing signals for notifications here. + I like this method because I have a single signal + and just check for a hook method on the sender +""" + + +def notification_post_save_handler(**kwargs): + instance = kwargs['instance'] + if hasattr(instance, 'create_notification'): + instance.create_notification() + + +post_save.connect(notification_post_save_handler) diff --git a/spa/urls.py b/spa/urls.py index cd2c612..697cd4e 100755 --- a/spa/urls.py +++ b/spa/urls.py @@ -2,6 +2,7 @@ from django.conf.urls import patterns, url, include from tastypie.api import Api from spa.ajax import AjaxHandler from spa.api.v1.DebugResource import DebugResource +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 @@ -21,6 +22,7 @@ v1_api.register(ReleaseAudioResource()) v1_api.register(EventResource()) v1_api.register(UserResource()) v1_api.register(ActivityResource()) +v1_api.register(NotificationResource()) v1_api.register(DebugResource()) ajax = AjaxHandler() diff --git a/static/bin/jplayer/jwplayer.flash.swf b/static/bin/jplayer/jwplayer.flash.swf new file mode 100644 index 0000000000000000000000000000000000000000..6f9107af20e1a09a48e4e587063f6b446ed796d7 GIT binary patch literal 142663 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:~lz~{b?gC<&5zAG? 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 Nl5jI*`adC$^+5ChqN)G@ literal 0 HcmV?d00001 diff --git a/static/css/animate-custom.css b/static/css/animate-custom.css new file mode 100644 index 0000000..22f6eef --- /dev/null +++ b/static/css/animate-custom.css @@ -0,0 +1,3202 @@ +.animated{-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;}.animated.hinge{-webkit-animation-duration:2s;-moz-animation-duration:2s;-ms-animation-duration:2s;-o-animation-duration:2s;animation-duration:2s;}@-webkit-keyframes flash { + 0%, 50%, 100% {opacity: 1;} 25%, 75% {opacity: 0;} +} + +@-moz-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@-o-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +.flash { + -webkit-animation-name: flash; + -moz-animation-name: flash; + -o-animation-name: flash; + animation-name: flash; +} +@-webkit-keyframes shake { + 0%, 100% {-webkit-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-webkit-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-webkit-transform: translateX(10px);} +} + +@-moz-keyframes shake { + 0%, 100% {-moz-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-moz-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-moz-transform: translateX(10px);} +} + +@-o-keyframes shake { + 0%, 100% {-o-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-o-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-o-transform: translateX(10px);} +} + +@keyframes shake { + 0%, 100% {transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);} + 20%, 40%, 60%, 80% {transform: translateX(10px);} +} + +.shake { + -webkit-animation-name: shake; + -moz-animation-name: shake; + -o-animation-name: shake; + animation-name: shake; +} +@-webkit-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-webkit-transform: translateY(0);} + 40% {-webkit-transform: translateY(-30px);} + 60% {-webkit-transform: translateY(-15px);} +} + +@-moz-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-moz-transform: translateY(0);} + 40% {-moz-transform: translateY(-30px);} + 60% {-moz-transform: translateY(-15px);} +} + +@-o-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-o-transform: translateY(0);} + 40% {-o-transform: translateY(-30px);} + 60% {-o-transform: translateY(-15px);} +} +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% {transform: translateY(0);} + 40% {transform: translateY(-30px);} + 60% {transform: translateY(-15px);} +} + +.bounce { + -webkit-animation-name: bounce; + -moz-animation-name: bounce; + -o-animation-name: bounce; + animation-name: bounce; +} +@-webkit-keyframes tada { + 0% {-webkit-transform: scale(1);} + 10%, 20% {-webkit-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-webkit-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-webkit-transform: scale(1.1) rotate(-3deg);} + 100% {-webkit-transform: scale(1) rotate(0);} +} + +@-moz-keyframes tada { + 0% {-moz-transform: scale(1);} + 10%, 20% {-moz-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-moz-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-moz-transform: scale(1.1) rotate(-3deg);} + 100% {-moz-transform: scale(1) rotate(0);} +} + +@-o-keyframes tada { + 0% {-o-transform: scale(1);} + 10%, 20% {-o-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-o-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-o-transform: scale(1.1) rotate(-3deg);} + 100% {-o-transform: scale(1) rotate(0);} +} + +@keyframes tada { + 0% {transform: scale(1);} + 10%, 20% {transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {transform: scale(1.1) rotate(-3deg);} + 100% {transform: scale(1) rotate(0);} +} + +.tada { + -webkit-animation-name: tada; + -moz-animation-name: tada; + -o-animation-name: tada; + animation-name: tada; +} +@-webkit-keyframes swing { + 20%, 40%, 60%, 80%, 100% { -webkit-transform-origin: top center; } + 20% { -webkit-transform: rotate(15deg); } + 40% { -webkit-transform: rotate(-10deg); } + 60% { -webkit-transform: rotate(5deg); } + 80% { -webkit-transform: rotate(-5deg); } + 100% { -webkit-transform: rotate(0deg); } +} + +@-moz-keyframes swing { + 20% { -moz-transform: rotate(15deg); } + 40% { -moz-transform: rotate(-10deg); } + 60% { -moz-transform: rotate(5deg); } + 80% { -moz-transform: rotate(-5deg); } + 100% { -moz-transform: rotate(0deg); } +} + +@-o-keyframes swing { + 20% { -o-transform: rotate(15deg); } + 40% { -o-transform: rotate(-10deg); } + 60% { -o-transform: rotate(5deg); } + 80% { -o-transform: rotate(-5deg); } + 100% { -o-transform: rotate(0deg); } +} + +@keyframes swing { + 20% { transform: rotate(15deg); } + 40% { transform: rotate(-10deg); } + 60% { transform: rotate(5deg); } + 80% { transform: rotate(-5deg); } + 100% { transform: rotate(0deg); } +} + +.swing { + -webkit-transform-origin: top center; + -moz-transform-origin: top center; + -o-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + -moz-animation-name: swing; + -o-animation-name: swing; + animation-name: swing; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + 0% { -webkit-transform: translateX(0%); } + 15% { -webkit-transform: translateX(-25%) rotate(-5deg); } + 30% { -webkit-transform: translateX(20%) rotate(3deg); } + 45% { -webkit-transform: translateX(-15%) rotate(-3deg); } + 60% { -webkit-transform: translateX(10%) rotate(2deg); } + 75% { -webkit-transform: translateX(-5%) rotate(-1deg); } + 100% { -webkit-transform: translateX(0%); } +} + +@-moz-keyframes wobble { + 0% { -moz-transform: translateX(0%); } + 15% { -moz-transform: translateX(-25%) rotate(-5deg); } + 30% { -moz-transform: translateX(20%) rotate(3deg); } + 45% { -moz-transform: translateX(-15%) rotate(-3deg); } + 60% { -moz-transform: translateX(10%) rotate(2deg); } + 75% { -moz-transform: translateX(-5%) rotate(-1deg); } + 100% { -moz-transform: translateX(0%); } +} + +@-o-keyframes wobble { + 0% { -o-transform: translateX(0%); } + 15% { -o-transform: translateX(-25%) rotate(-5deg); } + 30% { -o-transform: translateX(20%) rotate(3deg); } + 45% { -o-transform: translateX(-15%) rotate(-3deg); } + 60% { -o-transform: translateX(10%) rotate(2deg); } + 75% { -o-transform: translateX(-5%) rotate(-1deg); } + 100% { -o-transform: translateX(0%); } +} + +@keyframes wobble { + 0% { transform: translateX(0%); } + 15% { transform: translateX(-25%) rotate(-5deg); } + 30% { transform: translateX(20%) rotate(3deg); } + 45% { transform: translateX(-15%) rotate(-3deg); } + 60% { transform: translateX(10%) rotate(2deg); } + 75% { transform: translateX(-5%) rotate(-1deg); } + 100% { transform: translateX(0%); } +} + +.wobble { + -webkit-animation-name: wobble; + -moz-animation-name: wobble; + -o-animation-name: wobble; + animation-name: wobble; +} +@-webkit-keyframes wiggle { + 0% { -webkit-transform: skewX(9deg); } + 10% { -webkit-transform: skewX(-8deg); } + 20% { -webkit-transform: skewX(7deg); } + 30% { -webkit-transform: skewX(-6deg); } + 40% { -webkit-transform: skewX(5deg); } + 50% { -webkit-transform: skewX(-4deg); } + 60% { -webkit-transform: skewX(3deg); } + 70% { -webkit-transform: skewX(-2deg); } + 80% { -webkit-transform: skewX(1deg); } + 90% { -webkit-transform: skewX(0deg); } + 100% { -webkit-transform: skewX(0deg); } +} + +@-moz-keyframes wiggle { + 0% { -moz-transform: skewX(9deg); } + 10% { -moz-transform: skewX(-8deg); } + 20% { -moz-transform: skewX(7deg); } + 30% { -moz-transform: skewX(-6deg); } + 40% { -moz-transform: skewX(5deg); } + 50% { -moz-transform: skewX(-4deg); } + 60% { -moz-transform: skewX(3deg); } + 70% { -moz-transform: skewX(-2deg); } + 80% { -moz-transform: skewX(1deg); } + 90% { -moz-transform: skewX(0deg); } + 100% { -moz-transform: skewX(0deg); } +} + +@-o-keyframes wiggle { + 0% { -o-transform: skewX(9deg); } + 10% { -o-transform: skewX(-8deg); } + 20% { -o-transform: skewX(7deg); } + 30% { -o-transform: skewX(-6deg); } + 40% { -o-transform: skewX(5deg); } + 50% { -o-transform: skewX(-4deg); } + 60% { -o-transform: skewX(3deg); } + 70% { -o-transform: skewX(-2deg); } + 80% { -o-transform: skewX(1deg); } + 90% { -o-transform: skewX(0deg); } + 100% { -o-transform: skewX(0deg); } +} + +@keyframes wiggle { + 0% { transform: skewX(9deg); } + 10% { transform: skewX(-8deg); } + 20% { transform: skewX(7deg); } + 30% { transform: skewX(-6deg); } + 40% { transform: skewX(5deg); } + 50% { transform: skewX(-4deg); } + 60% { transform: skewX(3deg); } + 70% { transform: skewX(-2deg); } + 80% { transform: skewX(1deg); } + 90% { transform: skewX(0deg); } + 100% { transform: skewX(0deg); } +} + +.wiggle { + -webkit-animation-name: wiggle; + -moz-animation-name: wiggle; + -o-animation-name: wiggle; + animation-name: wiggle; + + -webkit-animation-timing-function: ease-in; + -moz-animation-timing-function: ease-in; + -o-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + 0% { -webkit-transform: scale(1); } + 50% { -webkit-transform: scale(1.1); } + 100% { -webkit-transform: scale(1); } +} +@-moz-keyframes pulse { + 0% { -moz-transform: scale(1); } + 50% { -moz-transform: scale(1.1); } + 100% { -moz-transform: scale(1); } +} +@-o-keyframes pulse { + 0% { -o-transform: scale(1); } + 50% { -o-transform: scale(1.1); } + 100% { -o-transform: scale(1); } +} +@keyframes pulse { + 0% { transform: scale(1); } + 50% { transform: scale(1.1); } + 100% { transform: scale(1); } +} + +.pulse { + -webkit-animation-name: pulse; + -moz-animation-name: pulse; + -o-animation-name: pulse; + animation-name: pulse; +} +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) rotateY(0); + -webkit-animation-timing-function: ease-out; + } + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg); + -webkit-animation-timing-function: ease-out; + } + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + } + 80% { + -webkit-transform: perspective(400px) rotateY(360deg) scale(.95); + -webkit-animation-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px) scale(1); + -webkit-animation-timing-function: ease-in; + } +} +@-moz-keyframes flip { + 0% { + -moz-transform: perspective(400px) rotateY(0); + -moz-animation-timing-function: ease-out; + } + 40% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg); + -moz-animation-timing-function: ease-out; + } + 50% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -moz-animation-timing-function: ease-in; + } + 80% { + -moz-transform: perspective(400px) rotateY(360deg) scale(.95); + -moz-animation-timing-function: ease-in; + } + 100% { + -moz-transform: perspective(400px) scale(1); + -moz-animation-timing-function: ease-in; + } +} +@-o-keyframes flip { + 0% { + -o-transform: perspective(400px) rotateY(0); + -o-animation-timing-function: ease-out; + } + 40% { + -o-transform: perspective(400px) translateZ(150px) rotateY(170deg); + -o-animation-timing-function: ease-out; + } + 50% { + -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -o-animation-timing-function: ease-in; + } + 80% { + -o-transform: perspective(400px) rotateY(360deg) scale(.95); + -o-animation-timing-function: ease-in; + } + 100% { + -o-transform: perspective(400px) scale(1); + -o-animation-timing-function: ease-in; + } +} +@keyframes flip { + 0% { + transform: perspective(400px) rotateY(0); + animation-timing-function: ease-out; + } + 40% { + transform: perspective(400px) translateZ(150px) rotateY(170deg); + animation-timing-function: ease-out; + } + 50% { + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + animation-timing-function: ease-in; + } + 80% { + transform: perspective(400px) rotateY(360deg) scale(.95); + animation-timing-function: ease-in; + } + 100% { + transform: perspective(400px) scale(1); + animation-timing-function: ease-in; + } +} + +.flip { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flip; + -moz-backface-visibility: visible !important; + -moz-animation-name: flip; + -o-backface-visibility: visible !important; + -o-animation-name: flip; + backface-visibility: visible !important; + animation-name: flip; +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInX { + 0% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -moz-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -moz-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-o-keyframes flipInX { + 0% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -o-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -o-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + transform: perspective(400px) rotateX(-10deg); + } + + 70% { + transform: perspective(400px) rotateX(10deg); + } + + 100% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInX; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInX; + -o-backface-visibility: visible !important; + -o-animation-name: flipInX; + backface-visibility: visible !important; + animation-name: flipInX; +} +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-moz-keyframes flipOutX { + 0% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-o-keyframes flipOutX { + 0% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + 0% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + -moz-animation-name: flipOutX; + -moz-backface-visibility: visible !important; + -o-animation-name: flipOutX; + -o-backface-visibility: visible !important; + animation-name: flipOutX; + backface-visibility: visible !important; +} +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInY { + 0% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -moz-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -moz-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-o-keyframes flipInY { + 0% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -o-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -o-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@keyframes flipInY { + 0% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + transform: perspective(400px) rotateY(-10deg); + } + + 70% { + transform: perspective(400px) rotateY(10deg); + } + + 100% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInY; + -o-backface-visibility: visible !important; + -o-animation-name: flipInY; + backface-visibility: visible !important; + animation-name: flipInY; +} +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-moz-keyframes flipOutY { + 0% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-o-keyframes flipOutY { + 0% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@keyframes flipOutY { + 0% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipOutY; + -o-backface-visibility: visible !important; + -o-animation-name: flipOutY; + backface-visibility: visible !important; + animation-name: flipOutY; +} +@-webkit-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-moz-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-o-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +.fadeIn { + -webkit-animation-name: fadeIn; + -moz-animation-name: fadeIn; + -o-animation-name: fadeIn; + animation-name: fadeIn; +} +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInUp { + 0% { + opacity: 0; + -moz-transform: translateY(20px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInUp { + 0% { + opacity: 0; + -o-transform: translateY(20px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + transform: translateY(20px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + -moz-animation-name: fadeInUp; + -o-animation-name: fadeInUp; + animation-name: fadeInUp; +} +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInDown { + 0% { + opacity: 0; + -o-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInDown { + 0% { + opacity: 0; + transform: translateY(-20px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + -moz-animation-name: fadeInDown; + -o-animation-name: fadeInDown; + animation-name: fadeInDown; +} +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + transform: translateX(-20px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + -moz-animation-name: fadeInLeft; + -o-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInRight { + 0% { + opacity: 0; + -moz-transform: translateX(20px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInRight { + 0% { + opacity: 0; + -o-transform: translateX(20px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + transform: translateX(20px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + -moz-animation-name: fadeInRight; + -o-animation-name: fadeInRight; + animation-name: fadeInRight; +} +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInUpBig { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInUpBig { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInUpBig { + 0% { + opacity: 0; + transform: translateY(2000px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + -moz-animation-name: fadeInUpBig; + -o-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInDownBig { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInDownBig { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInDownBig { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + -moz-animation-name: fadeInDownBig; + -o-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@-moz-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} +@-o-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + -moz-animation-name: fadeInLeftBig; + -o-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInRightBig { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInRightBig { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInRightBig { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + -moz-animation-name: fadeInRightBig; + -o-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} +@-webkit-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-moz-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-o-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +.fadeOut { + -webkit-animation-name: fadeOut; + -moz-animation-name: fadeOut; + -o-animation-name: fadeOut; + animation-name: fadeOut; +} +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + } +} +@-moz-keyframes fadeOutUp { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-20px); + } +} +@-o-keyframes fadeOutUp { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-20px); + } +} +@keyframes fadeOutUp { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-20px); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + -moz-animation-name: fadeOutUp; + -o-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + } +} + +@-moz-keyframes fadeOutDown { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(20px); + } +} + +@-o-keyframes fadeOutDown { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(20px); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(20px); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + -moz-animation-name: fadeOutDown; + -o-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + } +} + +@-moz-keyframes fadeOutLeft { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-20px); + } +} + +@-o-keyframes fadeOutLeft { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-20px); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-20px); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + -moz-animation-name: fadeOutLeft; + -o-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + } +} + +@-moz-keyframes fadeOutRight { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(20px); + } +} + +@-o-keyframes fadeOutRight { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(20px); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(20px); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + -moz-animation-name: fadeOutRight; + -o-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} +@-webkit-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-o-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes fadeOutUpBig { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + -moz-animation-name: fadeOutUpBig; + -o-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} + +@-moz-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} + +@-o-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} + +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(2000px); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + -moz-animation-name: fadeOutDownBig; + -o-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-o-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + -moz-animation-name: fadeOutLeftBig; + -o-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} +@-moz-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} +@-o-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + -moz-animation-name: fadeOutRightBig; + -o-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} +@-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.3); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + } + + 70% { + -webkit-transform: scale(.9); + } + + 100% { + -webkit-transform: scale(1); + } +} + +@-moz-keyframes bounceIn { + 0% { + opacity: 0; + -moz-transform: scale(.3); + } + + 50% { + opacity: 1; + -moz-transform: scale(1.05); + } + + 70% { + -moz-transform: scale(.9); + } + + 100% { + -moz-transform: scale(1); + } +} + +@-o-keyframes bounceIn { + 0% { + opacity: 0; + -o-transform: scale(.3); + } + + 50% { + opacity: 1; + -o-transform: scale(1.05); + } + + 70% { + -o-transform: scale(.9); + } + + 100% { + -o-transform: scale(1); + } +} + +@keyframes bounceIn { + 0% { + opacity: 0; + transform: scale(.3); + } + + 50% { + opacity: 1; + transform: scale(1.05); + } + + 70% { + transform: scale(.9); + } + + 100% { + transform: scale(1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + -moz-animation-name: bounceIn; + -o-animation-name: bounceIn; + animation-name: bounceIn; +} +@-webkit-keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + } + + 80% { + -webkit-transform: translateY(10px); + } + + 100% { + -webkit-transform: translateY(0); + } +} +@-moz-keyframes bounceInUp { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateY(-30px); + } + + 80% { + -moz-transform: translateY(10px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-o-keyframes bounceInUp { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -o-transform: translateY(-30px); + } + + 80% { + -o-transform: translateY(10px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes bounceInUp { + 0% { + opacity: 0; + transform: translateY(2000px); + } + + 60% { + opacity: 1; + transform: translateY(-30px); + } + + 80% { + transform: translateY(10px); + } + + 100% { + transform: translateY(0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + -moz-animation-name: bounceInUp; + -o-animation-name: bounceInUp; + animation-name: bounceInUp; +} +@-webkit-keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + } + + 80% { + -webkit-transform: translateY(-10px); + } + + 100% { + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes bounceInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateY(30px); + } + + 80% { + -moz-transform: translateY(-10px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-o-keyframes bounceInDown { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -o-transform: translateY(30px); + } + + 80% { + -o-transform: translateY(-10px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes bounceInDown { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 60% { + opacity: 1; + transform: translateY(30px); + } + + 80% { + transform: translateY(-10px); + } + + 100% { + transform: translateY(0); + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + -moz-animation-name: bounceInDown; + -o-animation-name: bounceInDown; + animation-name: bounceInDown; +} +@-webkit-keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + } + + 80% { + -webkit-transform: translateX(-10px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes bounceInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(30px); + } + + 80% { + -moz-transform: translateX(-10px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes bounceInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -o-transform: translateX(30px); + } + + 80% { + -o-transform: translateX(-10px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes bounceInLeft { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 60% { + opacity: 1; + transform: translateX(30px); + } + + 80% { + transform: translateX(-10px); + } + + 100% { + transform: translateX(0); + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + -moz-animation-name: bounceInLeft; + -o-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} +@-webkit-keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + } + + 80% { + -webkit-transform: translateX(10px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes bounceInRight { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(-30px); + } + + 80% { + -moz-transform: translateX(10px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes bounceInRight { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -o-transform: translateX(-30px); + } + + 80% { + -o-transform: translateX(10px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes bounceInRight { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 60% { + opacity: 1; + transform: translateX(-30px); + } + + 80% { + transform: translateX(10px); + } + + 100% { + transform: translateX(0); + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + -moz-animation-name: bounceInRight; + -o-animation-name: bounceInRight; + animation-name: bounceInRight; +} +@-webkit-keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + } + + 25% { + -webkit-transform: scale(.95); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.3); + } +} + +@-moz-keyframes bounceOut { + 0% { + -moz-transform: scale(1); + } + + 25% { + -moz-transform: scale(.95); + } + + 50% { + opacity: 1; + -moz-transform: scale(1.1); + } + + 100% { + opacity: 0; + -moz-transform: scale(.3); + } +} + +@-o-keyframes bounceOut { + 0% { + -o-transform: scale(1); + } + + 25% { + -o-transform: scale(.95); + } + + 50% { + opacity: 1; + -o-transform: scale(1.1); + } + + 100% { + opacity: 0; + -o-transform: scale(.3); + } +} + +@keyframes bounceOut { + 0% { + transform: scale(1); + } + + 25% { + transform: scale(.95); + } + + 50% { + opacity: 1; + transform: scale(1.1); + } + + 100% { + opacity: 0; + transform: scale(.3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + -moz-animation-name: bounceOut; + -o-animation-name: bounceOut; + animation-name: bounceOut; +} +@-webkit-keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes bounceOutUp { + 0% { + -moz-transform: translateY(0); + } + + 20% { + opacity: 1; + -moz-transform: translateY(20px); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-o-keyframes bounceOutUp { + 0% { + -o-transform: translateY(0); + } + + 20% { + opacity: 1; + -o-transform: translateY(20px); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes bounceOutUp { + 0% { + transform: translateY(0); + } + + 20% { + opacity: 1; + transform: translateY(20px); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + -moz-animation-name: bounceOutUp; + -o-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} +@-webkit-keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} + +@-moz-keyframes bounceOutDown { + 0% { + -moz-transform: translateY(0); + } + + 20% { + opacity: 1; + -moz-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} + +@-o-keyframes bounceOutDown { + 0% { + -o-transform: translateY(0); + } + + 20% { + opacity: 1; + -o-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} + +@keyframes bounceOutDown { + 0% { + transform: translateY(0); + } + + 20% { + opacity: 1; + transform: translateY(-20px); + } + + 100% { + opacity: 0; + transform: translateY(2000px); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + -moz-animation-name: bounceOutDown; + -o-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} +@-webkit-keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes bounceOutLeft { + 0% { + -moz-transform: translateX(0); + } + + 20% { + opacity: 1; + -moz-transform: translateX(20px); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-o-keyframes bounceOutLeft { + 0% { + -o-transform: translateX(0); + } + + 20% { + opacity: 1; + -o-transform: translateX(20px); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes bounceOutLeft { + 0% { + transform: translateX(0); + } + + 20% { + opacity: 1; + transform: translateX(20px); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + -moz-animation-name: bounceOutLeft; + -o-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} +@-webkit-keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} + +@-moz-keyframes bounceOutRight { + 0% { + -moz-transform: translateX(0); + } + + 20% { + opacity: 1; + -moz-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} + +@-o-keyframes bounceOutRight { + 0% { + -o-transform: translateX(0); + } + + 20% { + opacity: 1; + -o-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} + +@keyframes bounceOutRight { + 0% { + transform: translateX(0); + } + + 20% { + opacity: 1; + transform: translateX(-20px); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + -moz-animation-name: bounceOutRight; + -o-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@-moz-keyframes rotateIn { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } +} +@-o-keyframes rotateIn { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateIn { + 0% { + transform-origin: center center; + transform: rotate(-200deg); + opacity: 0; + } + + 100% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + -moz-animation-name: rotateIn; + -o-animation-name: rotateIn; + animation-name: rotateIn; +} +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } + + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + -moz-animation-name: rotateInUpLeft; + -o-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + -moz-animation-name: rotateInDownLeft; + -o-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + -moz-animation-name: rotateInUpRight; + -o-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } + + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + -moz-animation-name: rotateInDownRight; + -o-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(200deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOut { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(200deg); + opacity: 0; + } +} + +@-o-keyframes rotateOut { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: center center; + -o-transform: rotate(200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + 0% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: center center; + transform: rotate(200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + -moz-animation-name: rotateOut; + -o-animation-name: rotateOut; + animation-name: rotateOut; +} +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + -transform-origin: left bottom; + -transform: rotate(-90deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + -moz-animation-name: rotateOutUpLeft; + -o-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + -moz-animation-name: rotateOutDownLeft; + -o-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + -moz-animation-name: rotateOutUpRight; + -o-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + -moz-animation-name: rotateOutDownRight; + -o-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} +@-webkit-keyframes lightSpeedIn { + 0% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -webkit-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -webkit-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@-moz-keyframes lightSpeedIn { + 0% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -moz-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -moz-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@-o-keyframes lightSpeedIn { + 0% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -o-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -o-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@keyframes lightSpeedIn { + 0% { transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + -moz-animation-name: lightSpeedIn; + -o-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + + -webkit-animation-timing-function: ease-out; + -moz-animation-timing-function: ease-out; + -o-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} +@-webkit-keyframes lightSpeedOut { + 0% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@-moz-keyframes lightSpeedOut { + 0% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@-o-keyframes lightSpeedOut { + 0% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@keyframes lightSpeedOut { + 0% { transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + -moz-animation-name: lightSpeedOut; + -o-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + + -webkit-animation-timing-function: ease-in; + -moz-animation-timing-function: ease-in; + -o-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} +@-webkit-keyframes hinge { + 0% { -webkit-transform: rotate(0); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 20%, 60% { -webkit-transform: rotate(80deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 40% { -webkit-transform: rotate(60deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 80% { -webkit-transform: rotate(60deg) translateY(0); opacity: 1; -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 100% { -webkit-transform: translateY(700px); opacity: 0; } +} + +@-moz-keyframes hinge { + 0% { -moz-transform: rotate(0); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 20%, 60% { -moz-transform: rotate(80deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 40% { -moz-transform: rotate(60deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 80% { -moz-transform: rotate(60deg) translateY(0); opacity: 1; -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 100% { -moz-transform: translateY(700px); opacity: 0; } +} + +@-o-keyframes hinge { + 0% { -o-transform: rotate(0); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 20%, 60% { -o-transform: rotate(80deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 40% { -o-transform: rotate(60deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 80% { -o-transform: rotate(60deg) translateY(0); opacity: 1; -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 100% { -o-transform: translateY(700px); opacity: 0; } +} + +@keyframes hinge { + 0% { transform: rotate(0); transform-origin: top left; animation-timing-function: ease-in-out; } + 20%, 60% { transform: rotate(80deg); transform-origin: top left; animation-timing-function: ease-in-out; } + 40% { transform: rotate(60deg); transform-origin: top left; animation-timing-function: ease-in-out; } + 80% { transform: rotate(60deg) translateY(0); opacity: 1; transform-origin: top left; animation-timing-function: ease-in-out; } + 100% { transform: translateY(700px); opacity: 0; } +} + +.hinge { + -webkit-animation-name: hinge; + -moz-animation-name: hinge; + -o-animation-name: hinge; + animation-name: hinge; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + 0% { opacity: 0; -webkit-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); } +} + +@-moz-keyframes rollIn { + 0% { opacity: 0; -moz-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -moz-transform: translateX(0px) rotate(0deg); } +} + +@-o-keyframes rollIn { + 0% { opacity: 0; -o-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -o-transform: translateX(0px) rotate(0deg); } +} + +@keyframes rollIn { + 0% { opacity: 0; transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; transform: translateX(0px) rotate(0deg); } +} + +.rollIn { + -webkit-animation-name: rollIn; + -moz-animation-name: rollIn; + -o-animation-name: rollIn; + animation-name: rollIn; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + } +} + +@-moz-keyframes rollOut { + 0% { + opacity: 1; + -moz-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -moz-transform: translateX(100%) rotate(120deg); + } +} + +@-o-keyframes rollOut { + 0% { + opacity: 1; + -o-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -o-transform: translateX(100%) rotate(120deg); + } +} + +@keyframes rollOut { + 0% { + opacity: 1; + transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + transform: translateX(100%) rotate(120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + -moz-animation-name: rollOut; + -o-animation-name: rollOut; + animation-name: rollOut; +} diff --git a/static/css/deepsouthsounds.css b/static/css/deepsouthsounds.css index 642e48e..8f1bc2b 100755 --- a/static/css/deepsouthsounds.css +++ b/static/css/deepsouthsounds.css @@ -588,5 +588,52 @@ img.flag { } .pagination { - margin: 0px 0;!important; + margin: 0px 0; +!important; +} + +#header-alerts-icon { + -webkit-animation-duration: 3s; + -webkit-animation-delay: 2s; + -webkit-animation-iteration-count: infinite; + + -moz-animation-duration: 3s; + -moz-animation-delay: 2s; + -moz-animation-iteration-count: infinite; + + animation-duration: 3s; + animation-delay: 2s; + animation-iteration-count: infinite; + +} + +.notifications-dropdown { + min-width: 320px; +} + +.notification-surround { + margin-top: 1px; + line-height: 14px; + vertical-align: text-top; +} + +.navbar .nav > li > span > a { + float: none; + padding: 10px 15px 10px; + color: #ffffff; + text-decoration: none; + text-shadow: 0 1px 0 #ce4213; + display: block; +} + +.navbar .nav > li > span > a:focus, +.navbar .nav > li > span > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #a5360f; +} + +.navbarcaret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; } diff --git a/static/js/app/dss.bootstrapper.js b/static/js/app/dss.bootstrapper.js index 415f246..990afd3 100755 --- a/static/js/app/dss.bootstrapper.js +++ b/static/js/app/dss.bootstrapper.js @@ -10,6 +10,7 @@ requirejs.config({ 'backbone.wreqr': 'libs/backbone/backbone.wreqr', ich: 'libs/ICanHaz', bootstrap: 'libs/bootstrap/bootstrap', + typeahead: 'libs/bootstrap/bootstrap-typeahead', underscore: 'libs/backbone/underscore', bootpag: 'libs/bootstrap/bootpag', text: 'libs/text', @@ -29,7 +30,7 @@ requirejs.config({ }, shim: { jquery: { - exports: 'jQuery' + exports: '$' }, backbone: { exports: 'Backbone', @@ -39,6 +40,9 @@ requirejs.config({ exports: 'bootstrap', deps: ['jquery'] }, + typeahead: { + deps: ['jquery', 'bootstrap'] + }, bootpag: { exports: 'bootpag', deps: ['jquery', 'bootstrap'] diff --git a/static/js/app/lib/controller.coffee b/static/js/app/lib/controller.coffee index 995fccf..dff348d 100755 --- a/static/js/app/lib/controller.coffee +++ b/static/js/app/lib/controller.coffee @@ -11,7 +11,6 @@ define ['app', 'marionette', 'vent', true _showMixList: (options) -> - console.log "Controller: _showMixList" app = require('app') app.contentRegion.show(new MixListView(options)) true diff --git a/static/js/app/lib/controller.js b/static/js/app/lib/controller.js index cce6015..b28d044 100755 --- a/static/js/app/lib/controller.js +++ b/static/js/app/lib/controller.js @@ -1,17 +1,16 @@ -// Generated by CoffeeScript 1.6.2 +// Generated by CoffeeScript 1.3.3 (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', 'marionette', 'vent', 'views/chat/chatView', 'models/mix/mixItem', 'views/mix/mixListView', 'views/mix/mixDetailView', 'views/mix/mixEditView', 'models/user/userItem', 'views/user/userListView', 'views/user/userEditView'], function(App, Marionette, vent, ChatView, MixItem, MixListView, MixDetailView, MixEditView, UserItem, UserListView, UserEditView) { - var DssController, _ref; - + var DssController; DssController = (function(_super) { + __extends(DssController, _super); function DssController() { - _ref = DssController.__super__.constructor.apply(this, arguments); - return _ref; + return DssController.__super__.constructor.apply(this, arguments); } DssController.prototype.home = function() { @@ -22,8 +21,6 @@ DssController.prototype._showMixList = function(options) { var app; - - console.log("Controller: _showMixList"); app = require('app'); app.contentRegion.show(new MixListView(options)); return true; @@ -38,7 +35,6 @@ DssController.prototype.showMix = function(slug) { var app, mix; - console.log("Controller: showMix"); app = require('app'); mix = new MixItem({ @@ -57,7 +53,6 @@ DssController.prototype.uploadMix = function() { var app, mix; - console.log("Controller: mixUpload"); app = require('app'); mix = new MixItem({ @@ -74,7 +69,6 @@ DssController.prototype.editMix = function(slug) { var app, mix; - console.log("Controller: mixEdit"); app = require('app'); mix = new MixItem({ @@ -92,7 +86,6 @@ DssController.prototype.showChat = function() { var app; - console.log("Controller: showChat"); app = require('app'); return app.contentRegion.show(new ChatView()); @@ -100,7 +93,6 @@ DssController.prototype.showUserList = function(type) { var app; - console.log("Controller: showUserList"); app = require('app'); return app.contentRegion.show(new UserListView()); @@ -152,7 +144,6 @@ DssController.prototype.editUser = function() { var app, user; - console.log("Controller: editUser"); app = require('app'); user = new UserItem({ diff --git a/static/js/app/models/notifications/notificationCollection.coffee b/static/js/app/models/notifications/notificationCollection.coffee new file mode 100644 index 0000000..261acdc --- /dev/null +++ b/static/js/app/models/notifications/notificationCollection.coffee @@ -0,0 +1,22 @@ +define ['backbone', 'vent', 'models/notifications/notificationItem', 'app.lib/backbone.dss.model.collection'], \ + (Backbone, vent, NotificationItem, DssCollection) -> + class NotificationCollection extends DssCollection + model: NotificationItem + url:com.podnoms.settings.urlRoot + "notification/" + limit: 5 + + initialize: -> + @listenTo vent, "model:notification:new", (url) => + console.log("NotificationCollection: activity:new") + item = new NotificationItem() + item.fetch + url: url, + success: (response) => + console.log("ActivityCollection: item fetched") + console.log(response) + @add response + + comparator: (item)-> + -item.id + + NotificationCollection \ No newline at end of file diff --git a/static/js/app/models/notifications/notificationCollection.js b/static/js/app/models/notifications/notificationCollection.js new file mode 100644 index 0000000..892def6 --- /dev/null +++ b/static/js/app/models/notifications/notificationCollection.js @@ -0,0 +1,49 @@ +// Generated by CoffeeScript 1.3.3 +(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(['backbone', 'vent', 'models/notifications/notificationItem', 'app.lib/backbone.dss.model.collection'], function(Backbone, vent, NotificationItem, DssCollection) { + var NotificationCollection; + NotificationCollection = (function(_super) { + + __extends(NotificationCollection, _super); + + function NotificationCollection() { + return NotificationCollection.__super__.constructor.apply(this, arguments); + } + + NotificationCollection.prototype.model = NotificationItem; + + NotificationCollection.prototype.url = com.podnoms.settings.urlRoot + "notification/"; + + NotificationCollection.prototype.limit = 5; + + NotificationCollection.prototype.initialize = function() { + var _this = this; + return this.listenTo(vent, "model:notification:new", function(url) { + var item; + console.log("NotificationCollection: activity:new"); + item = new NotificationItem(); + return item.fetch({ + url: url, + success: function(response) { + console.log("ActivityCollection: item fetched"); + console.log(response); + return _this.add(response); + } + }); + }); + }; + + NotificationCollection.prototype.comparator = function(item) { + return -item.id; + }; + + return NotificationCollection; + + })(DssCollection); + return NotificationCollection; + }); + +}).call(this); diff --git a/static/js/app/models/notifications/notificationItem.coffee b/static/js/app/models/notifications/notificationItem.coffee new file mode 100644 index 0000000..8a7c8c5 --- /dev/null +++ b/static/js/app/models/notifications/notificationItem.coffee @@ -0,0 +1,10 @@ +define ['backbone', 'moment'], \ + (Backbone, moment) -> + class NotificationItem extends Backbone.Model + urlRoot: com.podnoms.settings.urlRoot + "activity/" + + parse: (model) -> + model.human_date = moment(model.date).fromNow() + model + + NotificationItem \ No newline at end of file diff --git a/static/js/app/models/notifications/notificationItem.js b/static/js/app/models/notifications/notificationItem.js new file mode 100644 index 0000000..8f2d28a --- /dev/null +++ b/static/js/app/models/notifications/notificationItem.js @@ -0,0 +1,29 @@ +// Generated by CoffeeScript 1.3.3 +(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(['backbone', 'moment'], function(Backbone, moment) { + var NotificationItem; + NotificationItem = (function(_super) { + + __extends(NotificationItem, _super); + + function NotificationItem() { + return NotificationItem.__super__.constructor.apply(this, arguments); + } + + NotificationItem.prototype.urlRoot = com.podnoms.settings.urlRoot + "activity/"; + + NotificationItem.prototype.parse = function(model) { + model.human_date = moment(model.date).fromNow(); + return model; + }; + + return NotificationItem; + + })(Backbone.Model); + return NotificationItem; + }); + +}).call(this); diff --git a/static/js/app/views/activity/activityItemView.coffee b/static/js/app/views/activity/activityItemView.coffee index 3883d0b..6b5256c 100755 --- a/static/js/app/views/activity/activityItemView.coffee +++ b/static/js/app/views/activity/activityItemView.coffee @@ -1,4 +1,4 @@ -define ['marionette', 'text!/tpl/ActivityListItemView', 'libs/jquery-ui'], +define ['marionette', 'text!/tpl/ActivityListItemView'], (Marionette, Template) -> class ActivityItemView extends Marionette.ItemView template: _.template(Template) @@ -6,6 +6,5 @@ define ['marionette', 'text!/tpl/ActivityListItemView', 'libs/jquery-ui'], className: "media" onRender: (itemView) -> - $(itemView.el).effect("bounce", "slow") - $(itemView.el).effect("highlight", {}, 3000) + $(itemView.el).addClass('animated flash') true diff --git a/static/js/app/views/activity/activityItemView.js b/static/js/app/views/activity/activityItemView.js index 741d011..03c5046 100755 --- a/static/js/app/views/activity/activityItemView.js +++ b/static/js/app/views/activity/activityItemView.js @@ -3,7 +3,7 @@ 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(['marionette', 'text!/tpl/ActivityListItemView', 'libs/jquery-ui'], function(Marionette, Template) { + define(['marionette', 'text!/tpl/ActivityListItemView'], function(Marionette, Template) { var ActivityItemView; return ActivityItemView = (function(_super) { @@ -20,8 +20,7 @@ ActivityItemView.prototype.className = "media"; ActivityItemView.prototype.onRender = function(itemView) { - $(itemView.el).effect("bounce", "slow"); - $(itemView.el).effect("highlight", {}, 3000); + $(itemView.el).addClass('animated flash'); return true; }; diff --git a/static/js/app/views/activity/activityListView.coffee b/static/js/app/views/activity/activityListView.coffee index 28e7ad0..9d6193f 100755 --- a/static/js/app/views/activity/activityListView.coffee +++ b/static/js/app/views/activity/activityListView.coffee @@ -1,5 +1,5 @@ define ['marionette', 'models/activity/activityCollection', 'views/activity/activityItemView', - 'text!/tpl/ActivityListView', 'libs/jquery-ui'], + 'text!/tpl/ActivityListView'], (Marionette, ActivityCollection, ActivityItemView, Template) -> class ActivityListView extends Marionette.CompositeView @@ -12,10 +12,7 @@ define ['marionette', 'models/activity/activityCollection', 'views/activity/acti initialize: -> console.log "ActivityListView: initialize" @collection = new ActivityCollection - @collection.fetch( - success: => - console.log "ActivityListView: Collection fetched" - ) + @collection.fetch() #kinda primordial (but working) support for sorted collection view #based on https://github.com/marionettejs/backbone.marionette/wiki/Adding-support-for-sorted-collections diff --git a/static/js/app/views/activity/activityListView.js b/static/js/app/views/activity/activityListView.js index 09ec5a4..8fd5050 100755 --- a/static/js/app/views/activity/activityListView.js +++ b/static/js/app/views/activity/activityListView.js @@ -3,7 +3,7 @@ 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(['marionette', 'models/activity/activityCollection', 'views/activity/activityItemView', 'text!/tpl/ActivityListView', 'libs/jquery-ui'], function(Marionette, ActivityCollection, ActivityItemView, Template) { + define(['marionette', 'models/activity/activityCollection', 'views/activity/activityItemView', 'text!/tpl/ActivityListView'], function(Marionette, ActivityCollection, ActivityItemView, Template) { var ActivityListView; ActivityListView = (function(_super) { @@ -24,14 +24,9 @@ ActivityListView.prototype.itemViewContainer = "#activity-list-container-ul"; ActivityListView.prototype.initialize = function() { - var _this = this; console.log("ActivityListView: initialize"); this.collection = new ActivityCollection; - return this.collection.fetch({ - success: function() { - return console.log("ActivityListView: Collection fetched"); - } - }); + return this.collection.fetch(); }; ActivityListView.prototype.appendHtml = function(collectionView, itemView, index) { diff --git a/static/js/app/views/mix/mixListView.coffee b/static/js/app/views/mix/mixListView.coffee index ce0ac52..54f2dca 100755 --- a/static/js/app/views/mix/mixListView.coffee +++ b/static/js/app/views/mix/mixListView.coffee @@ -10,21 +10,12 @@ define ['marionette', 'vent', 'models/mix/mixCollection', 'views/mix/mixItemView currentMix = -1 initialize: => - console.log "MixListView: initialize" @collection = new MixCollection() - @collection.fetch( + @collection.fetch data: @options - success: => - console.log("MixListView: Collection fetched") - @tabChanged(@options.order_by) - @listenTo(vent, 'mix:play', @mixPlay) - true - ) return mixPlay: (model) -> - console.log "MixListView: mixPlay" - if currentMix != -1 v = @children.findByModelCid(currentMix) v.mixStop(v.model) @@ -32,7 +23,6 @@ define ['marionette', 'vent', 'models/mix/mixCollection', 'views/mix/mixItemView return tabChanged: (type) -> - console.log("MixListView: tab changed") $('#mix-tab li[id=li-' + type + ']', @el).addClass('active') true diff --git a/static/js/app/views/mix/mixListView.js b/static/js/app/views/mix/mixListView.js index 63b778b..bdd047e 100755 --- a/static/js/app/views/mix/mixListView.js +++ b/static/js/app/views/mix/mixListView.js @@ -27,23 +27,14 @@ currentMix = -1; MixListView.prototype.initialize = function() { - var _this = this; - console.log("MixListView: initialize"); this.collection = new MixCollection(); this.collection.fetch({ - data: this.options, - success: function() { - console.log("MixListView: Collection fetched"); - _this.tabChanged(_this.options.order_by); - _this.listenTo(vent, 'mix:play', _this.mixPlay); - return true; - } + data: this.options }); }; MixListView.prototype.mixPlay = function(model) { var v; - console.log("MixListView: mixPlay"); if (currentMix !== -1) { v = this.children.findByModelCid(currentMix); v.mixStop(v.model); @@ -52,7 +43,6 @@ }; MixListView.prototype.tabChanged = function(type) { - console.log("MixListView: tab changed"); $('#mix-tab li[id=li-' + type + ']', this.el).addClass('active'); return true; }; diff --git a/static/js/app/views/notifications/notificationsItemView.coffee b/static/js/app/views/notifications/notificationsItemView.coffee new file mode 100644 index 0000000..cbd9cd0 --- /dev/null +++ b/static/js/app/views/notifications/notificationsItemView.coffee @@ -0,0 +1,5 @@ +define ['marionette', 'text!/tpl/NotificationsItemView'], +(Marionette, Template) -> + class NotificationsItemView extends Marionette.ItemView + template: _.template(Template) + tagName: "li" diff --git a/static/js/app/views/notifications/notificationsItemView.js b/static/js/app/views/notifications/notificationsItemView.js new file mode 100644 index 0000000..c450747 --- /dev/null +++ b/static/js/app/views/notifications/notificationsItemView.js @@ -0,0 +1,25 @@ +// Generated by CoffeeScript 1.3.3 +(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(['marionette', 'text!/tpl/NotificationsItemView'], function(Marionette, Template) { + var NotificationsItemView; + return NotificationsItemView = (function(_super) { + + __extends(NotificationsItemView, _super); + + function NotificationsItemView() { + return NotificationsItemView.__super__.constructor.apply(this, arguments); + } + + NotificationsItemView.prototype.template = _.template(Template); + + NotificationsItemView.prototype.tagName = "li"; + + return NotificationsItemView; + + })(Marionette.ItemView); + }); + +}).call(this); diff --git a/static/js/app/views/notifications/notificationsListView.coffee b/static/js/app/views/notifications/notificationsListView.coffee new file mode 100644 index 0000000..3bf3573 --- /dev/null +++ b/static/js/app/views/notifications/notificationsListView.coffee @@ -0,0 +1,29 @@ +define ['marionette', 'underscore', 'vent', + 'models/notifications/notificationCollection', + 'views/notifications/notificationsItemView', + 'text!/tpl/NotificationsListView'], +(Marionette, _, vent, NotificationCollection, NotificationsItemView, Template) -> + class NotificationsListView extends Marionette.CompositeView + + template: _.template(Template), + tagName: "span", + className: "dropdown" + itemView: NotificationsItemView, + itemViewContainer: "#notif_list_node", + events: + "click #notifications-dropdown": "showNotifications" + ui: + notificationSurround: "#notification-surround" + notificationCount: "#notification-count" + + initialize: -> + @collection = new NotificationCollection + @collection.fetch( + success: => + $(@ui.notificationCount).text(@collection.meta.is_new) + ) + + showNotifications: -> + console.log("Marking read") + + NotificationsListView diff --git a/static/js/app/views/notifications/notificationsListView.js b/static/js/app/views/notifications/notificationsListView.js new file mode 100644 index 0000000..52dae90 --- /dev/null +++ b/static/js/app/views/notifications/notificationsListView.js @@ -0,0 +1,55 @@ +// Generated by CoffeeScript 1.3.3 +(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(['marionette', 'underscore', 'vent', 'models/notifications/notificationCollection', 'views/notifications/notificationsItemView', 'text!/tpl/NotificationsListView'], function(Marionette, _, vent, NotificationCollection, NotificationsItemView, Template) { + var NotificationsListView; + NotificationsListView = (function(_super) { + + __extends(NotificationsListView, _super); + + function NotificationsListView() { + return NotificationsListView.__super__.constructor.apply(this, arguments); + } + + NotificationsListView.prototype.template = _.template(Template); + + NotificationsListView.prototype.tagName = "span"; + + NotificationsListView.prototype.className = "dropdown"; + + NotificationsListView.prototype.itemView = NotificationsItemView; + + NotificationsListView.prototype.itemViewContainer = "#notif_list_node"; + + NotificationsListView.prototype.events = { + "click #notifications-dropdown": "showNotifications" + }; + + NotificationsListView.prototype.ui = { + notificationSurround: "#notification-surround", + notificationCount: "#notification-count" + }; + + NotificationsListView.prototype.initialize = function() { + var _this = this; + this.collection = new NotificationCollection; + return this.collection.fetch({ + success: function() { + return $(_this.ui.notificationCount).text(_this.collection.meta.is_new); + } + }); + }; + + NotificationsListView.prototype.showNotifications = function() { + return console.log("Marking read"); + }; + + return NotificationsListView; + + })(Marionette.CompositeView); + return NotificationsListView; + }); + +}).call(this); diff --git a/static/js/app/views/sidebar/sidebarView.coffee b/static/js/app/views/sidebar/sidebarView.coffee index de50a81..268592f 100755 --- a/static/js/app/views/sidebar/sidebarView.coffee +++ b/static/js/app/views/sidebar/sidebarView.coffee @@ -9,7 +9,6 @@ define ['underscore', 'backbone', 'marionette', 'vent', 'views/activity/activity initialize: -> - console.log "SidebarView: initialize" this.listenTo(vent, 'mix:init', @mixInit) this.listenTo(vent, 'mix:play', @mixPlay) this.listenTo(vent, 'mix:pause', @mixPause) @@ -17,17 +16,14 @@ define ['underscore', 'backbone', 'marionette', 'vent', 'views/activity/activity return onRender: -> - console.log "SidebarView: onRender" return onShow: -> - console.log "SidebarView: onShow" @streamRegion.show(new ActivityListView()) $(@topRegion.el).hide() return mixInit: (model) -> - console.log "SidebarView: mixInit" $(@topRegion.el).show() @topRegion.show(new NowPlayingView({model: model})) diff --git a/static/js/app/views/sidebar/sidebarView.js b/static/js/app/views/sidebar/sidebarView.js index 8c60fea..a6b1938 100755 --- a/static/js/app/views/sidebar/sidebarView.js +++ b/static/js/app/views/sidebar/sidebarView.js @@ -1,17 +1,16 @@ -// Generated by CoffeeScript 1.6.2 +// Generated by CoffeeScript 1.3.3 (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(['underscore', 'backbone', 'marionette', 'vent', 'views/activity/activityListView', 'views/widgets/nowPlayingView', 'text!/tpl/SidebarView'], function(_, Backbone, Marionette, vent, ActivityListView, NowPlayingView, Template) { - var SidebarView, _ref; - + var SidebarView; SidebarView = (function(_super) { + __extends(SidebarView, _super); function SidebarView() { - _ref = SidebarView.__super__.constructor.apply(this, arguments); - return _ref; + return SidebarView.__super__.constructor.apply(this, arguments); } SidebarView.prototype.template = _.template(Template); @@ -22,25 +21,20 @@ }; SidebarView.prototype.initialize = function() { - console.log("SidebarView: initialize"); this.listenTo(vent, 'mix:init', this.mixInit); this.listenTo(vent, 'mix:play', this.mixPlay); this.listenTo(vent, 'mix:pause', this.mixPause); this.listenTo(vent, 'live:started', this.liveStarted); }; - SidebarView.prototype.onRender = function() { - console.log("SidebarView: onRender"); - }; + SidebarView.prototype.onRender = function() {}; SidebarView.prototype.onShow = function() { - console.log("SidebarView: onShow"); this.streamRegion.show(new ActivityListView()); $(this.topRegion.el).hide(); }; SidebarView.prototype.mixInit = function(model) { - console.log("SidebarView: mixInit"); $(this.topRegion.el).show(); return this.topRegion.show(new NowPlayingView({ model: model @@ -49,7 +43,6 @@ SidebarView.prototype.liveStarted = function() { var _this = this; - console.log("SidebarView: livePlay"); $.getJSON("ajax/live_now_playing/", function(data) { $(_this.topRegion.el).show(); diff --git a/static/js/app/views/widgets/headerView.coffee b/static/js/app/views/widgets/headerView.coffee index 9d22237..b5b94d8 100755 --- a/static/js/app/views/widgets/headerView.coffee +++ b/static/js/app/views/widgets/headerView.coffee @@ -6,9 +6,14 @@ Copyright (c) 2012, Fergal Moran. All rights reserved. Code provided under the BSD License: ### -define ["underscore", "marionette", "vent", "utils", "views/widgets/searchView", "text!/tpl/HeaderView"], -(_, Marionette, vent, utils, SearchView, Template) -> +define ["underscore", "marionette", "vent", "utils", "views/widgets/searchView", + "views/notifications/notificationsListView", "text!/tpl/HeaderView"], +(_, Marionette, vent, utils, SearchView, NotificationsListView, Template) -> class HeaderView extends Marionette.Layout + NowrapRegion = Marionette.Region.extend(open: (view) -> + debugger + @$el.html view.$el.html() + ) template: _.template(Template) events: "click #header-play-pause-button": "togglePlayState" @@ -20,15 +25,18 @@ define ["underscore", "marionette", "vent", "utils", "views/widgets/searchView", regions: searchRegion: "#header-search" + notificationsRegion: + selector: "#header-notifications" + #regionType: NowrapRegion initialize: -> @render() - @listenTo vent, "mix:play", @trackPlaying @listenTo vent, "mix:pause", @trackPaused onShow: -> @searchRegion.show(new SearchView()) + @notificationsRegion.show(new NotificationsListView()) login: -> vent.trigger('app:login') @@ -55,14 +63,14 @@ define ["underscore", "marionette", "vent", "utils", "views/widgets/searchView", playLive: -> console.log("HeaderView: playLive") $(@ui.liveButton).toggleClass('btn-success', false) - .toggleClass('btn-danger', true) + .toggleClass('btn-danger', true) vent.trigger('live:play') pauseLive: -> console.log("HeaderView: pauseLive") $(@ui.liveButton).toggleClass('btn-success', true) - .toggleClass('btn-danger', false) + .toggleClass('btn-danger', false) vent.trigger('live:pause') diff --git a/static/js/app/views/widgets/headerView.js b/static/js/app/views/widgets/headerView.js index 721ea1d..0bb3969 100644 --- a/static/js/app/views/widgets/headerView.js +++ b/static/js/app/views/widgets/headerView.js @@ -1,4 +1,5 @@ -// Generated by CoffeeScript 1.6.2 +// Generated by CoffeeScript 1.3.3 + /* @license @@ -13,17 +14,23 @@ Code provided under the BSD License: 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(["underscore", "marionette", "vent", "utils", "views/widgets/searchView", "text!/tpl/HeaderView"], function(_, Marionette, vent, utils, SearchView, Template) { - var HeaderView, _ref; - + define(["underscore", "marionette", "vent", "utils", "views/widgets/searchView", "views/notifications/notificationsListView", "text!/tpl/HeaderView"], function(_, Marionette, vent, utils, SearchView, NotificationsListView, Template) { + var HeaderView; HeaderView = (function(_super) { + var NowrapRegion; + __extends(HeaderView, _super); function HeaderView() { - _ref = HeaderView.__super__.constructor.apply(this, arguments); - return _ref; + return HeaderView.__super__.constructor.apply(this, arguments); } + NowrapRegion = Marionette.Region.extend({ + open: function(view) { + debugger; return this.$el.html(view.$el.html()); + } + }); + HeaderView.prototype.template = _.template(Template); HeaderView.prototype.events = { @@ -38,7 +45,10 @@ Code provided under the BSD License: }; HeaderView.prototype.regions = { - searchRegion: "#header-search" + searchRegion: "#header-search", + notificationsRegion: { + selector: "#header-notifications" + } }; HeaderView.prototype.initialize = function() { @@ -48,7 +58,8 @@ Code provided under the BSD License: }; HeaderView.prototype.onShow = function() { - return this.searchRegion.show(new SearchView()); + this.searchRegion.show(new SearchView()); + return this.notificationsRegion.show(new NotificationsListView()); }; HeaderView.prototype.login = function() { diff --git a/static/js/app/views/widgets/searchView.coffee b/static/js/app/views/widgets/searchView.coffee index 4d64f71..6299388 100644 --- a/static/js/app/views/widgets/searchView.coffee +++ b/static/js/app/views/widgets/searchView.coffee @@ -14,7 +14,6 @@ define ['jquery', 'underscore', 'libs/bootstrap/bootstrap-typeahead', 'marionett compiled context onShow: -> - console.log("SearchView: onShow") t = $('#search-text', @el).typeahead name: "search" engine: @engine @@ -30,7 +29,6 @@ define ['jquery', 'underscore', 'libs/bootstrap/bootstrap-typeahead', 'marionett $('.tt-hint', @el).addClass('span3'); t.on 'typeahead:selected': (event, datum, dataset_name) -> - console.log("SearchView: Selected") vent.trigger 'navigate:mix', datum.slug $('#search-text', @el).blur() $('.tt-hint', @el).blur() diff --git a/static/js/app/views/widgets/searchView.js b/static/js/app/views/widgets/searchView.js index e2b8589..cd8d208 100644 --- a/static/js/app/views/widgets/searchView.js +++ b/static/js/app/views/widgets/searchView.js @@ -1,17 +1,16 @@ -// Generated by CoffeeScript 1.6.2 +// Generated by CoffeeScript 1.3.3 (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(['jquery', 'underscore', 'libs/bootstrap/bootstrap-typeahead', 'marionette', 'vent', 'text!/tpl/SearchView', 'text!/tpl/SearchResultView'], function($, _, Typeahead, Marionette, vent, Template, SearchResultView) { - var SearchView, _ref; - + var SearchView; SearchView = (function(_super) { + __extends(SearchView, _super); function SearchView() { - _ref = SearchView.__super__.constructor.apply(this, arguments); - return _ref; + return SearchView.__super__.constructor.apply(this, arguments); } SearchView.prototype.template = _.template(Template); @@ -23,7 +22,6 @@ SearchView.prototype.engine = { compile: function(template) { var compiled; - compiled = _.template(template); return { render: function(context) { @@ -35,8 +33,6 @@ SearchView.prototype.onShow = function() { var t; - - console.log("SearchView: onShow"); t = $('#search-text', this.el).typeahead({ name: "search", engine: this.engine, @@ -54,7 +50,6 @@ $('.tt-hint', this.el).addClass('span3'); return t.on({ 'typeahead:selected': function(event, datum, dataset_name) { - console.log("SearchView: Selected"); vent.trigger('navigate:mix', datum.slug); $('#search-text', this.el).blur(); return $('.tt-hint', this.el).blur(); diff --git a/templates/base.html b/templates/base.html index f4a0c56..ae8690d 100755 --- a/templates/base.html +++ b/templates/base.html @@ -15,6 +15,8 @@ + + diff --git a/templates/inc/facebook/mix.html b/templates/inc/facebook/mix.html index 081fa17..e5b853f 100755 --- a/templates/inc/facebook/mix.html +++ b/templates/inc/facebook/mix.html @@ -4,14 +4,17 @@ xmlns:fb="https://www.facebook.com/2008/fbml"> - + + + + + + + + + + - - - - - - diff --git a/templates/views/HeaderView.html b/templates/views/HeaderView.html index 2a20496..f3dc57f 100755 --- a/templates/views/HeaderView.html +++ b/templates/views/HeaderView.html @@ -9,11 +9,12 @@ diff --git a/templates/views/MixEditView.html b/templates/views/MixEditView.html index 09b255e..b15008d 100755 --- a/templates/views/MixEditView.html +++ b/templates/views/MixEditView.html @@ -62,9 +62,8 @@
-
- +
diff --git a/templates/views/NotificationsItemView.html b/templates/views/NotificationsItemView.html new file mode 100644 index 0000000..6ab0971 --- /dev/null +++ b/templates/views/NotificationsItemView.html @@ -0,0 +1,15 @@ +
+ + + + +
+
+ + <%= user_name %> + + <%= verb %> <%= target %> +
<%= human_date %>
+
+
+
diff --git a/templates/views/NotificationsListView.html b/templates/views/NotificationsListView.html new file mode 100644 index 0000000..496b1c7 --- /dev/null +++ b/templates/views/NotificationsListView.html @@ -0,0 +1,10 @@ + + + + + + + +