diff --git a/manage.py b/manage.py old mode 100755 new mode 100644 diff --git a/spa/ajax.py b/spa/ajax.py index b8e7647..b2cbf31 100644 --- a/spa/ajax.py +++ b/spa/ajax.py @@ -14,7 +14,7 @@ from django.views.decorators.csrf import csrf_exempt from core.utils import live from dss import localsettings, settings from spa import social -from spa.models import UserProfile, MixFavourite, Release +from spa.models import UserProfile, mixfavourite, Release from spa.models.mix import Mix from spa.models.comment import Comment from spa.models.mixlike import MixLike @@ -174,25 +174,26 @@ def like(request): @login_required() def toggle_follow(request): - pass - """ - if request.is_ajax() and request.method == 'POST' and 'userId' in request.POST: - follower = request.user - following = User.objects.get(pk=request.POST['userId']) - if follower is not None and following is not None: - try: - user_follow = UserFollows.objects.get(follower=follower, following=following) - user_follow.delete() - response = _get_json('Unfollowed') - except UserFollows.DoesNotExist: - user_follow = UserFollows(follower=follower.get_profile(), following=following.get_profile()) - user_follow.save() - response = _get_json('Followed') + response = _get_json('Invalid request') + try: + if request.is_ajax() and request.method == 'POST' and 'userId' in request.POST: + profile = request.user.get_profile() + following = UserProfile.objects.get(pk=request.POST['userId']) + if following is not None: + if profile.followers is None or (following not in profile.followers.all()): + profile.followers.add(following) + response = _get_json('Followed') + else: + profile.followers.remove(following) + response = _get_json('Unfollowed') + profile.save() + except Exception, ex: + if settings.DEBUG: + response = _get_json(ex.message) else: - response = _get_json('Invalid') + response = _get_json('Error') - return HttpResponse(response) - """ + return HttpResponse(response) @login_required() def favourite(request): @@ -202,7 +203,7 @@ def favourite(request): mix = Mix.objects.get(pk=request.POST['dataId']) if mix is not None: if mix.favourites.count() == 0: - mix.favourites.add(MixFavourite(mix=mix, user=request.user)) + mix.favourites.add(mixfavourite(mix=mix, user=request.user)) response = _get_json('Favourited') else: mix.favourites.all().delete() diff --git a/spa/api/v1/MixResource.py b/spa/api/v1/MixResource.py index 51455b7..260eb09 100644 --- a/spa/api/v1/MixResource.py +++ b/spa/api/v1/MixResource.py @@ -11,7 +11,7 @@ from core.serialisers import json from spa.api.v1.ActivityResource import ActivityResource from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource from spa.api.v1.CommentResource import CommentResource -from spa.models import Genre +from spa.models import genre from spa.models.mix import Mix @@ -34,11 +34,11 @@ class MixResource(BackboneCompatibleResource): ret = [] for genre in genres: if genre['id'] == genre['text']: - new_item = Genre(description=genre['text']) + new_item = genre(description=genre['text']) new_item.save() ret.append(new_item) else: - ret.append(Genre.objects.get(pk=genre['id'])) + ret.append(genre.objects.get(pk=genre['id'])) return ret diff --git a/spa/management/commands/purchaselinks.py b/spa/management/commands/purchaselinks.py index a557099..d9e47ea 100644 --- a/spa/management/commands/purchaselinks.py +++ b/spa/management/commands/purchaselinks.py @@ -2,7 +2,7 @@ import logging import urllib from django.core.management.base import NoArgsCommand from django.utils import simplejson -from spa.models import Tracklist +from spa.models import tracklist class Command(NoArgsCommand): @@ -22,7 +22,7 @@ class Command(NoArgsCommand): def handle_noargs(self, **options): try: - tracks = Tracklist.objects.all() + tracks = tracklist.objects.all() for track in tracks: link = self.generate_purchase_link(track) except Exception, ex: diff --git a/spa/management/commands/tracklists.py b/spa/management/commands/tracklists.py index f0eb397..ec0ba77 100644 --- a/spa/management/commands/tracklists.py +++ b/spa/management/commands/tracklists.py @@ -1,6 +1,6 @@ from django.core.management.base import NoArgsCommand -from spa.models import Tracklist +from spa.models import tracklist from spa.models.mix import Mix @@ -13,7 +13,7 @@ class Command(NoArgsCommand): lines = mix.description.strip().split('\n') index = 0 for line in lines: - mix.tracklist.add(Tracklist(index=index, description=line)) + mix.tracklist.add(tracklist(index=index, description=line)) mix.save() print "%d: %s" % (index, line) index += 1 \ No newline at end of file diff --git a/spa/migrations/0006_auto__chg_field_userprofile_user.py b/spa/migrations/0006_auto__chg_field_userprofile_user.py old mode 100755 new mode 100644 diff --git a/spa/migrations/0008_auto__add_field_userprofile_followers__add_field_userprofile_following.py b/spa/migrations/0008_auto__add_field_userprofile_followers__add_field_userprofile_following.py new file mode 100644 index 0000000..eb02516 --- /dev/null +++ b/spa/migrations/0008_auto__add_field_userprofile_followers__add_field_userprofile_following.py @@ -0,0 +1,225 @@ +# -*- 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 'UserProfile.followers' + db.add_column(u'spa_userprofile', 'followers', + self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='userprofile_followers', null=True, to=orm['spa.UserProfile']), + keep_default=False) + + # Adding field 'UserProfile.following' + db.add_column(u'spa_userprofile', 'following', + self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='userprofile_following', null=True, to=orm['spa.UserProfile']), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'UserProfile.followers' + db.delete_column(u'spa_userprofile', 'followers_id') + + # Deleting field 'UserProfile.following' + db.delete_column(u'spa_userprofile', 'following_id') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'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._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'}), + 'uid': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True'}) + }, + 'spa._lookup': { + 'Meta': {'object_name': '_Lookup'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'spa.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, 4, 30, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 4, 30, 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, 4, 30, 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, 4, 30, 0, 0)'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']"}), + 'waveform_generated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'spa.mixdownload': { + 'Meta': {'object_name': 'MixDownload', '_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.mixfavourite': { + 'Meta': {'object_name': 'MixFavourite', '_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.mixlike': { + 'Meta': {'object_name': 'MixLike', '_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.mixplay': { + 'Meta': {'object_name': 'MixPlay', '_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.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, 4, 30, 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.ForeignKey', [], {'blank': 'True', 'related_name': "'userprofile_followers'", 'null': 'True', 'to': "orm['spa.UserProfile']"}), + 'following': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'userprofile_following'", '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/0009_auto__del_field_userprofile_followers__del_field_userprofile_following.py b/spa/migrations/0009_auto__del_field_userprofile_followers__del_field_userprofile_following.py new file mode 100644 index 0000000..eb1a75e --- /dev/null +++ b/spa/migrations/0009_auto__del_field_userprofile_followers__del_field_userprofile_following.py @@ -0,0 +1,247 @@ +# -*- 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 'UserProfile.followers' + db.delete_column(u'spa_userprofile', 'followers_id') + + # Deleting field 'UserProfile.following' + db.delete_column(u'spa_userprofile', 'following_id') + + # Adding M2M table for field followers on 'UserProfile' + db.create_table(u'spa_userprofile_followers', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('from_userprofile', models.ForeignKey(orm['spa.userprofile'], null=False)), + ('to_userprofile', models.ForeignKey(orm['spa.userprofile'], null=False)) + )) + db.create_unique(u'spa_userprofile_followers', ['from_userprofile_id', 'to_userprofile_id']) + + # Adding M2M table for field following on 'UserProfile' + db.create_table(u'spa_userprofile_following', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('from_userprofile', models.ForeignKey(orm['spa.userprofile'], null=False)), + ('to_userprofile', models.ForeignKey(orm['spa.userprofile'], null=False)) + )) + db.create_unique(u'spa_userprofile_following', ['from_userprofile_id', 'to_userprofile_id']) + + + def backwards(self, orm): + # Adding field 'UserProfile.followers' + db.add_column(u'spa_userprofile', 'followers', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='userprofile_followers', null=True, to=orm['spa.UserProfile'], blank=True), + keep_default=False) + + # Adding field 'UserProfile.following' + db.add_column(u'spa_userprofile', 'following', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='userprofile_following', null=True, to=orm['spa.UserProfile'], blank=True), + keep_default=False) + + # Removing M2M table for field followers on 'UserProfile' + db.delete_table('spa_userprofile_followers') + + # Removing M2M table for field following on 'UserProfile' + db.delete_table('spa_userprofile_following') + + + 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._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'}), + 'uid': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True'}) + }, + 'spa._lookup': { + 'Meta': {'object_name': '_Lookup'}, + 'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'spa.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, 4, 30, 0, 0)'}), + 'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 4, 30, 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, 4, 30, 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, 4, 30, 0, 0)'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']"}), + 'waveform_generated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'spa.mixdownload': { + 'Meta': {'object_name': 'MixDownload', '_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.mixfavourite': { + 'Meta': {'object_name': 'MixFavourite', '_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.mixlike': { + 'Meta': {'object_name': 'MixLike', '_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.mixplay': { + 'Meta': {'object_name': 'MixPlay', '_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.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, 4, 30, 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/UserFollows.py b/spa/models/UserFollows.py deleted file mode 100644 index bfeb325..0000000 --- a/spa/models/UserFollows.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.db import models - -from spa.models._basemodel import _BaseModel - - -class __UserFollows(_BaseModel): - follower = models.OneToOneField('UserProfile', related_name='followers') - following = models.OneToOneField('UserProfile', related_name='following') diff --git a/spa/models/_basemodel.py b/spa/models/_basemodel.py index 9ce0a12..a30502a 100644 --- a/spa/models/_basemodel.py +++ b/spa/models/_basemodel.py @@ -1,10 +1,13 @@ import logging +import os + from django.db import models from django.utils import simplejson -import os + from core.utils import url from dss import localsettings, settings + class _BaseModel(models.Model): logger = logging.getLogger(__name__) @@ -26,7 +29,8 @@ class _BaseModel(models.Model): def get_image_url(self, image, default): try: if os.path.isfile(image.path): - images_root = localsettings.IMAGE_URL if hasattr(localsettings, 'IMAGE_URL') else "%s" % settings.MEDIA_URL + images_root = localsettings.IMAGE_URL if hasattr(localsettings, + 'IMAGE_URL') else "%s" % settings.MEDIA_URL ret = "%s/%s/%s" % (settings.STATIC_URL, images_root, image) return url.urlclean(ret) diff --git a/spa/models/chatmessage.py b/spa/models/chatmessage.py index 3d8f25a..4beaec2 100644 --- a/spa/models/chatmessage.py +++ b/spa/models/chatmessage.py @@ -1,7 +1,8 @@ from django.db import models -from spa.models import _BaseModel +from spa.models._basemodel import _BaseModel from spa.models.userprofile import UserProfile + class ChatMessage(_BaseModel): message = models.TextField('Message') timestamp = models.DateTimeField('Timestamp', auto_now_add=True) diff --git a/spa/models/genre.py b/spa/models/genre.py index f4030c1..2961b3b 100644 --- a/spa/models/genre.py +++ b/spa/models/genre.py @@ -1,6 +1,7 @@ from django.db import models from core.utils.url import unique_slugify -from spa.models import _BaseModel +from spa.models._basemodel import _BaseModel + class Genre(_BaseModel): class Meta: diff --git a/spa/models/mixfavourite.py b/spa/models/mixfavourite.py index 3a2999e..3685bf2 100644 --- a/spa/models/mixfavourite.py +++ b/spa/models/mixfavourite.py @@ -1,4 +1,4 @@ -from spa.models import _BaseModel, UserProfile, Mix, _Activity +from spa.models import _basemodel, UserProfile, Mix, _Activity from django.db import models class MixFavourite(_Activity): diff --git a/spa/models/purchaselink.py b/spa/models/purchaselink.py index 9fe4689..f402451 100644 --- a/spa/models/purchaselink.py +++ b/spa/models/purchaselink.py @@ -1,4 +1,6 @@ -from spa.models import _BaseModel, Tracklist +from spa.models._basemodel import _BaseModel +from spa.models.tracklist import Tracklist + from django.db import models class PurchaseLink(_BaseModel): diff --git a/spa/models/tracklist.py b/spa/models/tracklist.py index 7a39cd9..5efe0df 100644 --- a/spa/models/tracklist.py +++ b/spa/models/tracklist.py @@ -1,4 +1,5 @@ -from spa.models import _BaseModel, Mix +from spa.models.mix import Mix +from spa.models._basemodel import _BaseModel from django.db import models class Tracklist(_BaseModel): diff --git a/spa/models/userprofile.py b/spa/models/userprofile.py index 999827f..1bec7e5 100644 --- a/spa/models/userprofile.py +++ b/spa/models/userprofile.py @@ -42,6 +42,8 @@ class UserProfile(_BaseModel): activity_sharing = models.IntegerField(default=0) activity_sharing_networks = models.IntegerField(default=0) + followers = models.ManyToManyField('self', null=True, blank=True) + following = models.ManyToManyField('self', null=True, blank=True) def __unicode__(self): return "%s - %s" % (self.user.get_full_name(), self.slug) @@ -85,7 +87,7 @@ class UserProfile(_BaseModel): def is_follower(self, user): try: - return user in self.followers + return user.get_profile() in self.followers.all() except Exception, ex: logger.error(ex.message) diff --git a/spa/models/venue.py b/spa/models/venue.py index bfdacd2..d1faa45 100644 --- a/spa/models/venue.py +++ b/spa/models/venue.py @@ -1,7 +1,7 @@ from django.contrib.auth.models import User from django.db import models from core.utils.file import generate_save_file_name -from spa.models import _BaseModel +from spa.models._basemodel import _BaseModel def venue_image_name(instance, filename): return generate_save_file_name('venue-images', filename) diff --git a/spa/templatetags/spa_extras.py b/spa/templatetags/spa_extras.py index 6da769d..b48c6ae 100644 --- a/spa/templatetags/spa_extras.py +++ b/spa/templatetags/spa_extras.py @@ -7,7 +7,6 @@ from django_gravatar.helpers import has_gravatar, get_gravatar_url from core.analytics.google import ShowGoogleAnalyticsJS from core.utils.string import is_number, trunc_lines from dss import settings -from spa.models import _BaseModel register = template.Library() diff --git a/static/js/app/app.js b/static/js/app/app.js index aebda69..92ae492 100644 --- a/static/js/app/app.js +++ b/static/js/app/app.js @@ -55,7 +55,7 @@ var AppRouter = Backbone.Router.extend({ }, debug: function () { var model = new User({ - id: 'fergal' + id: 'fergalmoran' }); model.fetch({ success: function(){ diff --git a/static/js/app/views/sidebaruser.js b/static/js/app/views/sidebaruser.js index 23b8561..b7da155 100644 --- a/static/js/app/views/sidebaruser.js +++ b/static/js/app/views/sidebaruser.js @@ -37,7 +37,7 @@ window.SidebarViewUser = Backbone.View.extend({ } }, toggleFollow: function () { - var model = this.model; + var ref = this; $('#follow-button', this.el).addClass("loading"); $.post( "/ajax/toggle_follow/", @@ -45,10 +45,10 @@ window.SidebarViewUser = Backbone.View.extend({ function (data) { var result = $.parseJSON(data); if (result.value == 'Followed') - model.set('profile.following', true); + ref.model.get('profile').following = true; else - model.set('profile.following', true); - this._renderFollowButton(); + ref.model.get('profile').following = false; + ref._renderFollowButton(); $('#follow-button', this.el).removeClass("loading"); } ); diff --git a/static/js/libs/ape/apeClientJS.js b/static/js/libs/ape/apeClientJS.js old mode 100755 new mode 100644 diff --git a/static/js/libs/ape/apeClientMoo.js b/static/js/libs/ape/apeClientMoo.js old mode 100755 new mode 100644 diff --git a/static/js/libs/ape/apeCore.js b/static/js/libs/ape/apeCore.js old mode 100755 new mode 100644 diff --git a/static/js/libs/ape/apeCoreSession.js b/static/js/libs/ape/apeCoreSession.js old mode 100755 new mode 100644 diff --git a/static/js/libs/backbone/backbone.marionette.js b/static/js/libs/backbone/backbone.marionette.js old mode 100755 new mode 100644 diff --git a/static/js/libs/backbone/backbone.syphon.js b/static/js/libs/backbone/backbone.syphon.js old mode 100755 new mode 100644