diff --git a/.gitignore b/.gitignore index 190d4ac..ba721d7 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ reset __krud/ celerybeat-schedule private/ +.vscode/ diff --git a/Dockerfile b/Dockerfile index fd64e60..a91b95f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,11 +2,17 @@ FROM fergalmoran/django ADD . /code/ - RUN mkdir /files/static RUN mkdir /files/media RUN mkdir /files/cache/mixes RUN mkdir /files/cache/waveforms RUN touch /files/tmp/dss.log +RUN chmod 777 /files/tmp/dss.log +RUN chmod 777 /files/cache -R + +RUN chmod +x /code/bin/wav2png +RUN chmod +x /code/run_web.sh +RUN chmod +x /code/run_celery.sh WORKDIR /code +RUN pip install -r requirements.txt diff --git a/INSTALL b/INSTALL old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/README b/README old mode 100755 new mode 100644 diff --git a/angular_upgrade.md b/angular_upgrade.md old mode 100755 new mode 100644 diff --git a/apache/django_live.wsgi b/apache/django_live.wsgi old mode 100755 new mode 100644 diff --git a/api/__init__.py b/api/__init__.py old mode 100755 new mode 100644 diff --git a/api/pipeline.py b/api/pipeline.py old mode 100755 new mode 100644 diff --git a/api/serializers.py b/api/serializers.py old mode 100755 new mode 100644 index c555694..85cff9b --- a/api/serializers.py +++ b/api/serializers.py @@ -87,6 +87,7 @@ class InlineUserProfileSerializer(serializers.ModelSerializer): return n + class LikeSerializer(serializers.ModelSerializer): class Meta: model = UserProfile @@ -160,6 +161,7 @@ class MixSerializer(serializers.ModelSerializer): 'description', 'user', 'duration', + 'audio_url', 'waveform_url', 'waveform_progress_url', 'mix_image', @@ -170,6 +172,7 @@ class MixSerializer(serializers.ModelSerializer): 'genres', 'likes', 'favourites', + 'playlists', 'plays', 'downloads', 'is_liked', @@ -179,6 +182,7 @@ class MixSerializer(serializers.ModelSerializer): slug = serializers.ReadOnlyField(required=False) user = InlineUserProfileSerializer(read_only=True) + audio_url = serializers.ReadOnlyField(source='get_stream_url') waveform_url = serializers.ReadOnlyField(source='get_waveform_url') waveform_progress_url = serializers.ReadOnlyField(source='get_waveform_progress_url') mix_image = serializers.ReadOnlyField(source='get_image_url') @@ -187,6 +191,7 @@ class MixSerializer(serializers.ModelSerializer): genres = GenreSerializer(many=True, required=False, read_only=True) likes = LikeSerializer(many=True, required=False, read_only=True) # slug_field='slug', many=True, read_only=True) favourites = FavouriteSerializer(many=True, required=False, read_only=True) # slug_field='slug', many=True, read_only=True) + playlists = serializers.SerializerMethodField() plays = InlineActivityPlaySerializer(many=True, read_only=True, source='activity_plays') downloads = InlineActivityDownloadSerializer(read_only=True, source='activity_downloads') is_liked = serializers.SerializerMethodField(read_only=True) @@ -196,53 +201,13 @@ class MixSerializer(serializers.ModelSerializer): # all nested representations need to be serialized separately here try: # get any likes that aren't in passed bundle - likes = self.initial_data['likes'] - unliked = instance.likes.exclude(user__userprofile__slug__in=[l['slug'] for l in likes]) - for ul in unliked: - # check that the user removing the like is an instance of the current user - # for now, only the current user can like stuff - if ul == self.context['request'].user.userprofile: - instance.update_liked(ul, False) + self._update_likes(instance) - for like in likes: - # check that the user adding the like is an instance of the current user - # for now, only the current user can like stuff - try: - user = UserProfile.objects.get(slug=like['slug']) - if user is not None and user == self.context['request'].user.userprofile: - instance.update_liked(user, True) + self._update_favourites(instance) - except UserProfile.DoesNotExist: - pass + self._update_genres(instance) - favourites = self.initial_data['favourites'] - unfavourited = instance.favourites.exclude(user__userprofile__slug__in=[f['slug'] for f in favourites]) - for uf in unfavourited: - # check that the user removing the like is an instance of the current user - # for now, only the current user can like stuff - if uf == self.context['request'].user.userprofile: - instance.update_favourite(uf, False) - - for favourite in favourites: - # check that the user adding the like is an instance of the current user - # for now, only the current user can like stuff - try: - user = UserProfile.objects.get(slug=favourite['slug']) - if user is not None and user == self.context['request'].user.userprofile: - instance.update_favourite(user, True) - - except UserProfile.DoesNotExist: - pass - - genres = self.initial_data['genres'] - instance.genres.clear() - for genre in genres: - try: - g = Genre.objects.get(slug=genre.get('slug')) - instance.genres.add(g) - except Genre.DoesNotExist: - """ Possibly allow adding genres here """ - pass + self._update_playlists(instance) validated_data.pop('genres', None) @@ -259,8 +224,71 @@ class MixSerializer(serializers.ModelSerializer): except Exception as ex: raise ex - def is_valid(self, raise_exception=False): - return super(MixSerializer, self).is_valid(raise_exception) + def _update_genres(self, instance): + genres = self.initial_data['genres'] + instance.genres.clear() + for genre in genres: + try: + g = Genre.objects.get(slug=genre.get('slug')) + instance.genres.add(g) + except Genre.DoesNotExist: + """ Possibly allow adding genres here """ + pass + + def _update_playlists(self, instance): + try: + user = self.context['request'].user + playlists = self.initial_data['playlists'] + removed = user.userprofile.playlists.exclude(slug__in=[f['slug'] for f in playlists]) + if user.is_authenticated(): + + for r in removed: + playlist = Playlist.objects.get(slug=r.slug) + playlist.mixes.remove(instance) + playlist.save() + + for p in playlists: + try: + playlist = Playlist.objects.get(slug=p['slug']) + playlist.mixes.add(instance) + playlist.save() + except Playlist.DoesNotExist: + print("Playlist %s not found".format(p['slug'])) + pass + else: + pass + except Exception as ex: + print(ex) + + def _update_favourites(self, instance): + favourites = self.initial_data['favourites'] + unfavourited = instance.favourites.exclude(user__userprofile__slug__in=[f['slug'] for f in favourites]) + for uf in unfavourited: + if uf == self.context['request'].user.userprofile: + instance.update_favourite(uf, False) + for favourite in favourites: + try: + user = UserProfile.objects.get(slug=favourite['slug']) + if user is not None and user == self.context['request'].user.userprofile: + instance.update_favourite(user, True) + + except UserProfile.DoesNotExist: + pass + + def _update_likes(self, instance): + likes = self.initial_data['likes'] + unliked = instance.likes.exclude(user__userprofile__slug__in=[l['slug'] for l in likes]) + for ul in unliked: + if ul == self.context['request'].user.userprofile: + instance.update_liked(ul, False) + for like in likes: + try: + user = UserProfile.objects.get(slug=like['slug']) + if user is not None and user == self.context['request'].user.userprofile: + instance.update_liked(user, True) + + except UserProfile.DoesNotExist: + pass def get_avatar_image(self, obj): return obj.user.get_sized_avatar_image(32, 32) @@ -284,6 +312,14 @@ class MixSerializer(serializers.ModelSerializer): user = self.context['request'].user return obj.is_liked(user) if user.is_authenticated() else False + def get_playlists(self, obj): + user = self.context['request'].user + if user.is_authenticated(): + playlists = user.userprofile.playlists.filter(mixes__in=[obj]) + return list(playlists.values('slug')) + else: + return [] + class UserProfileSerializer(serializers.ModelSerializer): roles = serializers.SerializerMethodField() @@ -583,5 +619,22 @@ class BlogSerializer(serializers.ModelSerializer): class PlaylistSerializer(serializers.ModelSerializer): + slug = serializers.ReadOnlyField(required=False) + user = InlineUserProfileSerializer(read_only=True) + mixes = MixSerializer(read_only=True, many=True) + date_created = serializers.SerializerMethodField() + class Meta: model = Playlist + fields = ( + 'id', + 'name', + 'slug', + 'mixes', + 'public', + 'user', + 'date_created', + ) + + def get_date_created(self, obj): + return obj.object_created \ No newline at end of file diff --git a/api/tests.py b/api/tests.py old mode 100755 new mode 100644 diff --git a/api/urls.py b/api/urls.py old mode 100755 new mode 100644 diff --git a/api/views.py b/api/views.py old mode 100755 new mode 100644 index d78d47f..fdbf276 --- a/api/views.py +++ b/api/views.py @@ -72,6 +72,7 @@ class UserProfileViewSet(viewsets.ModelViewSet): lookup_field = 'slug' filter_fields = ( 'slug', + 'user__first_name', ) def get_queryset(self): @@ -81,6 +82,9 @@ class UserProfileViewSet(viewsets.ModelViewSet): ret = UserProfile.objects.filter(followers__slug__in=[self.request.query_params['followers']]) elif 'messaged_with' in self.request.query_params: ret = UserProfile.objects.filter(messages__slug__in=[self.request.query_params['followers']]) + elif 'initial' in self.request.query_params: + ret = UserProfile.objects.filter(user__first_name__startswith=self.request.query_params['initial']) \ + .annotate(mix_count=Count('mixes')).order_by('-mix_count') else: ret = super(UserProfileViewSet, self).get_queryset() @@ -380,6 +384,6 @@ class PlaylistViewSet(viewsets.ModelViewSet): def get_queryset(self): if self.request.user.is_authenticated: - return self.queryset.get(user=self.request.user.userprofile) + return self.queryset.filter(user=self.request.user.userprofile) return Response(status=HTTP_401_UNAUTHORIZED) diff --git a/bin/wav2png b/bin/wav2png old mode 100755 new mode 100644 diff --git a/clean_thumbnails b/clean_thumbnails old mode 100755 new mode 100644 diff --git a/core/__init__.py b/core/__init__.py old mode 100755 new mode 100644 diff --git a/core/analytics/__init__.py b/core/analytics/__init__.py old mode 100755 new mode 100644 diff --git a/core/analytics/google.py b/core/analytics/google.py old mode 100755 new mode 100644 diff --git a/core/decorators.py b/core/decorators.py old mode 100755 new mode 100644 diff --git a/core/realtime/__init__.py b/core/realtime/__init__.py old mode 100755 new mode 100644 diff --git a/core/realtime/activity.py b/core/realtime/activity.py old mode 100755 new mode 100644 diff --git a/core/serialisers/__init__.py b/core/serialisers/__init__.py old mode 100755 new mode 100644 diff --git a/core/utils/__init__.py b/core/utils/__init__.py old mode 100755 new mode 100644 diff --git a/core/utils/audio/__init__.py b/core/utils/audio/__init__.py old mode 100755 new mode 100644 diff --git a/core/utils/audio/mp3.py b/core/utils/audio/mp3.py old mode 100755 new mode 100644 diff --git a/core/utils/cdn.py b/core/utils/cdn.py old mode 100755 new mode 100644 diff --git a/core/utils/file.py b/core/utils/file.py old mode 100755 new mode 100644 diff --git a/core/utils/html.py b/core/utils/html.py old mode 100755 new mode 100644 diff --git a/core/utils/ice.py b/core/utils/ice.py old mode 100755 new mode 100644 diff --git a/core/utils/live.py b/core/utils/live.py old mode 100755 new mode 100644 diff --git a/core/utils/string.py b/core/utils/string.py old mode 100755 new mode 100644 diff --git a/core/utils/url.py b/core/utils/url.py old mode 100755 new mode 100644 diff --git a/core/utils/waveform.py b/core/utils/waveform.py old mode 100755 new mode 100644 diff --git a/core/widgets/__init__.py b/core/widgets/__init__.py old mode 100755 new mode 100644 diff --git a/core/widgets/upload.py b/core/widgets/upload.py old mode 100755 new mode 100644 diff --git a/db_reset b/db_reset old mode 100755 new mode 100644 diff --git a/dss/__init__.py b/dss/__init__.py old mode 100755 new mode 100644 diff --git a/dss/localsettings.py b/dss/localsettings.py index ec4fc83..b34b3ce 100644 --- a/dss/localsettings.py +++ b/dss/localsettings.py @@ -6,7 +6,7 @@ DEBUG = ast.literal_eval(os.environ.get('IS_DEBUG', 'True')) DSS_TEMP_PATH = os.environ.get('DSS_TEMP_PATH', '/tmp/') DSS_LAME_PATH = os.environ.get('DSS_LAME_PATH', '/usr/bin/sox') DSS_WAVE_PATH = os.environ.get('DSS_WAVE_PATH', - '/home/fergalm/Dropbox/development/deepsouthsounds.com/dss.lib/wav2png/bin/Linux/wav2png') + '/home/fergalm/dev/personal/deepsouthsounds.com/dss.lib/wav2png/bin/Linux/wav2png') GEOIP_PATH = os.environ.get('GEOIP_PATH', '/home/fergalm/Dropbox/Private/deepsouthsounds.com/working/geolite') DATABASE_PASSWORD = os.environ.get('DATABASE_PASSWORD', 'deepsouthsounds') @@ -17,7 +17,7 @@ DATABASE_HOST = os.environ.get('DATABASE_HOST', 'localhost') STATIC_URL = '/assets/' MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/mnt/dev/deepsouthsounds.com/media') -STATIC_ROOT = os.environ.get('STATIC_ROOT', '/home/fergalm/Dropbox/development/deepsouthsounds.com/cache/static') +STATIC_ROOT = os.environ.get('STATIC_ROOT', '/home/fergalm/dev/personal/deepsouthsounds.com/cache/static') CACHE_ROOT = os.environ.get('CACHE_ROOT', '/mnt/dev/deepsouthsounds.com/cache') MEDIA_URL = os.environ.get('MEDIA_URL', 'http://localhost/DSSMedia/') # '{0}media/'.format(CDN_URL) @@ -40,7 +40,7 @@ MANDRILL_API_KEY = os.environ.get('MANDRILL_API_KEY', '') FACEBOOK_API_VERSION = os.environ.get('FACEBOOK_API_VERSION', '2.5') GOOGLE_CREDENTIALS = os.environ.get('GOOGLE_CREDENTIALS', - '/home/fergalm/Dropbox/development/deepsouthsounds.com/dss.api/googleapikey.json') + '/home/fergalm/dev/personal/deepsouthsounds.com/dss.api/googleapikey.json') SOCIAL_AUTH_FACEBOOK_KEY = os.environ.get('SOCIAL_AUTH_FACEBOOK_KEY', '') SOCIAL_AUTH_FACEBOOK_SECRET = os.environ.get('SOCIAL_AUTH_FACEBOOK_SECRET', '') diff --git a/dss/logsettings.py b/dss/logsettings.py old mode 100755 new mode 100644 diff --git a/dss/paymentsettings.py b/dss/paymentsettings.py old mode 100755 new mode 100644 diff --git a/dss/pipelinesettings.py b/dss/pipelinesettings.py old mode 100755 new mode 100644 diff --git a/dss/psa.py b/dss/psa.py old mode 100755 new mode 100644 diff --git a/dss/settings.py b/dss/settings.py old mode 100755 new mode 100644 index e06d2da..3072266 --- a/dss/settings.py +++ b/dss/settings.py @@ -20,7 +20,7 @@ DEVELOPMENT = DEBUG # AUTH_USER_MODEL = 'spa.UserProfile' TEMPLATE_DEBUG = DEBUG -VERSION = '3.0.1' +VERSION = '3.0.2' ADMINS = ( ('Fergal Moran', 'fergal.moran@gmail.com'), @@ -123,6 +123,7 @@ INSTALLED_APPS = ( 'allauth.socialaccount.providers.twitter', 'pipeline', + #'dbbackup', 'gunicorn', 'corsheaders', @@ -195,9 +196,8 @@ REST_FRAMEWORK = { 'rest_framework.authentication.BasicAuthentication', 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), - 'PAGINATE_BY': 12, # Default to 10 - 'PAGINATE_BY_PARAM': 'limit', # Allow client to override, using `?page_size=xxx`. - 'MAX_PAGINATE_BY': 100 # Maximum limit allowed when using `?page_size=xxx`.} + 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', + 'PAGE_SIZE': 10 } DEFAULT_TRACK_IMAGE = 'assets/images/dyn/default-track-200.png' @@ -258,4 +258,4 @@ DBBACKUP_STORAGE = 'dbbackup.storage.dropbox_storage' DBBACKUP_TOKENS_FILEPATH = '._dss_tokens' DBBACKUP_DROPBOX_APP_KEY = localsettings.DSS_DB_BACKUP_KEY DBBACKUP_DROPBOX_APP_SECRET = localsettings.DSS_DB_BACKUP_SECRET -""" \ No newline at end of file +""" diff --git a/dss/urls.py b/dss/urls.py old mode 100755 new mode 100644 diff --git a/dss/warning_settings.py b/dss/warning_settings.py old mode 100755 new mode 100644 diff --git a/dss/wsgi.py b/dss/wsgi.py old mode 100755 new mode 100644 diff --git a/pip_upgrade.py b/pip_upgrade.py old mode 100755 new mode 100644 diff --git a/requirements.txt b/requirements.txt old mode 100755 new mode 100644 index 0d9e4b4..b80999e --- a/requirements.txt +++ b/requirements.txt @@ -30,6 +30,10 @@ sorl-thumbnail git+git://github.com/disqus/django-bitfield.git#django-bitfield git+git://github.com/tschellenbach/Django-facebook.git#django-facebook git+git://github.com/omab/python-social-auth.git#python-social-auth +social-auth-app-django + +django-dbbackup + django-allauth apache-libcloud mandrill @@ -37,7 +41,7 @@ djrill celery -djangorestframework==3.1.3 +djangorestframework==3.3.3 djangorestframework-jwt==1.6.0 drf-nested-routers pillow @@ -53,4 +57,4 @@ beautifulsoup4 django-pipeline django-pipeline-forgiving -requests-oauthlib \ No newline at end of file +requests-oauthlib diff --git a/run_celery.sh b/run_celery.sh old mode 100755 new mode 100644 diff --git a/run_web.sh b/run_web.sh index a2db8f4..680ecb9 100755 --- a/run_web.sh +++ b/run_web.sh @@ -1,6 +1,8 @@ #!/bin/bash python manage.py migrate +chmod 777 /files/tmp/dss.log + touch /srv/logs/gunicorn.log touch /srv/logs/access.log tail -n 0 -f /srv/logs/*.log & @@ -12,4 +14,4 @@ exec gunicorn dss.wsgi:application \ --log-level=info \ --log-file=/srv/logs/gunicorn.log \ --access-logfile=/srv/logs/access.log \ - "$@" \ No newline at end of file + "$@" diff --git a/spa/__init__.py b/spa/__init__.py old mode 100755 new mode 100644 diff --git a/spa/admin.py b/spa/admin.py old mode 100755 new mode 100644 diff --git a/spa/blog/urls.py b/spa/blog/urls.py old mode 100755 new mode 100644 diff --git a/spa/blog/views.py b/spa/blog/views.py old mode 100755 new mode 100644 diff --git a/spa/embedding/__init__.py b/spa/embedding/__init__.py old mode 100755 new mode 100644 diff --git a/spa/embedding/urls.py b/spa/embedding/urls.py old mode 100755 new mode 100644 diff --git a/spa/embedding/views.py b/spa/embedding/views.py old mode 100755 new mode 100644 diff --git a/spa/management/__init__.py b/spa/management/__init__.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/__init__.py b/spa/management/commands/__init__.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/__template_Debug.py b/spa/management/commands/__template_Debug.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/__timeside_waveforms.py b/spa/management/commands/__timeside_waveforms.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/add_user_uid.py b/spa/management/commands/add_user_uid.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/archive_mixes.py b/spa/management/commands/archive_mixes.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/azure_util.py b/spa/management/commands/azure_util.py old mode 100755 new mode 100644 index 71f466a..b620569 --- a/spa/management/commands/azure_util.py +++ b/spa/management/commands/azure_util.py @@ -22,7 +22,7 @@ def _check_missing_mixes(): for m in ms: url = m.get_download_url() if not cdn.file_exists(url): - file = '/mnt/dev/working/Dropbox/Development/deepsouthsounds.com/media/mixes/{0}.mp3'.format(m.uid) + file = '/mnt/dev/working/deepsouthsounds.com/media/mixes/{0}.mp3'.format(m.uid) if os.path.isfile(file): print(('* {0}'.format(file))) # cdn.upload_file_to_azure(file, '{0}.mp3'.format(m.uid), 'mixes') diff --git a/spa/management/commands/create_notifications.py b/spa/management/commands/create_notifications.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/debugHumanize.py b/spa/management/commands/debugHumanize.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/debugRelations.py b/spa/management/commands/debugRelations.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/debugUserProfile.py b/spa/management/commands/debugUserProfile.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/deletefailed.py b/spa/management/commands/deletefailed.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/deleteorphanmp3.py b/spa/management/commands/deleteorphanmp3.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/fake_comment_timeindex.py b/spa/management/commands/fake_comment_timeindex.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/get_avatars.py b/spa/management/commands/get_avatars.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/processmix.py b/spa/management/commands/processmix.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/tidy_cdn.py b/spa/management/commands/tidy_cdn.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/waveforms.py b/spa/management/commands/waveforms.py old mode 100755 new mode 100644 diff --git a/spa/management/commands/zoom_convert_waveforms.py b/spa/management/commands/zoom_convert_waveforms.py old mode 100755 new mode 100644 diff --git a/spa/middleware/__init__.py b/spa/middleware/__init__.py old mode 100755 new mode 100644 diff --git a/spa/middleware/sqlprinter.py b/spa/middleware/sqlprinter.py old mode 100755 new mode 100644 diff --git a/spa/middleware/stripwhitespace.py b/spa/middleware/stripwhitespace.py old mode 100755 new mode 100644 diff --git a/spa/middleware/uploadify.py b/spa/middleware/uploadify.py old mode 100755 new mode 100644 diff --git a/spa/models/__init__.py b/spa/models/__init__.py old mode 100755 new mode 100644 diff --git a/spa/models/_lookup.py b/spa/models/_lookup.py old mode 100755 new mode 100644 diff --git a/spa/models/activity.py b/spa/models/activity.py old mode 100755 new mode 100644 diff --git a/spa/models/basemodel.py b/spa/models/basemodel.py old mode 100755 new mode 100644 diff --git a/spa/models/chatmessage.py b/spa/models/chatmessage.py old mode 100755 new mode 100644 diff --git a/spa/models/comment.py b/spa/models/comment.py old mode 100755 new mode 100644 diff --git a/spa/models/fields.py b/spa/models/fields.py old mode 100755 new mode 100644 diff --git a/spa/models/genre.py b/spa/models/genre.py old mode 100755 new mode 100644 diff --git a/spa/models/label.py b/spa/models/label.py old mode 100755 new mode 100644 diff --git a/spa/models/managers/QueuedActivityModelManager.py b/spa/models/managers/QueuedActivityModelManager.py old mode 100755 new mode 100644 diff --git a/spa/models/managers/__init__.py b/spa/models/managers/__init__.py old mode 100755 new mode 100644 diff --git a/spa/models/notification.py b/spa/models/notification.py old mode 100755 new mode 100644 diff --git a/spa/models/playlist.py b/spa/models/playlist.py old mode 100755 new mode 100644 index 73c78e5..f401d20 --- a/spa/models/playlist.py +++ b/spa/models/playlist.py @@ -25,6 +25,12 @@ class Playlist(BaseModel): objects = PlaylistManager() + def __str__(self): + return self.__unicode__().encode('utf-8') + + def __unicode__(self): + return self.name + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): if not self.id: self.slug = unique_slugify(self, self.name) diff --git a/spa/models/purchaselink.py b/spa/models/purchaselink.py old mode 100755 new mode 100644 diff --git a/spa/models/release.py b/spa/models/release.py old mode 100755 new mode 100644 diff --git a/spa/models/show.py b/spa/models/show.py old mode 100755 new mode 100644 diff --git a/spa/models/tracklist.py b/spa/models/tracklist.py old mode 100755 new mode 100644 diff --git a/spa/models/userprofile.py b/spa/models/userprofile.py old mode 100755 new mode 100644 diff --git a/spa/models/venue.py b/spa/models/venue.py old mode 100755 new mode 100644 diff --git a/spa/podcast/views.py b/spa/podcast/views.py index 7ff1aac..d911928 100644 --- a/spa/podcast/views.py +++ b/spa/podcast/views.py @@ -17,7 +17,7 @@ def _get_user(uid): def featured(request): podcast_list = Mix.objects.order_by('-id').filter(is_private=False, is_featured=True) return _render_podcast(request, 'Deep South Sounds', 'DSS Favourites', - 'All your favourites on Deep South Sounds', podcast_list) + 'Featured Deep South Sounds mixes', podcast_list) def user(request, slug): diff --git a/spa/signals.py b/spa/signals.py old mode 100755 new mode 100644 diff --git a/spa/social/__init__.py b/spa/social/__init__.py old mode 100755 new mode 100644 diff --git a/spa/social/urls.py b/spa/social/urls.py old mode 100755 new mode 100644 diff --git a/spa/social/views.py b/spa/social/views.py old mode 100755 new mode 100644 diff --git a/spa/tasks.py b/spa/tasks.py old mode 100755 new mode 100644 diff --git a/spa/tests/__init__.py b/spa/tests/__init__.py old mode 100755 new mode 100644 diff --git a/spa/tests/dom_helper.py b/spa/tests/dom_helper.py old mode 100755 new mode 100644 diff --git a/spa/tests/facebook_dom.py b/spa/tests/facebook_dom.py old mode 100755 new mode 100644 diff --git a/spa/tests/schedule.py b/spa/tests/schedule.py old mode 100755 new mode 100644 diff --git a/spa/tests/webdriver.py b/spa/tests/webdriver.py old mode 100755 new mode 100644 diff --git a/utils.py b/utils.py old mode 100755 new mode 100644