From 42b30b8e3aca69591ff408f521ea455003be477f Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 13 Sep 2015 14:53:52 +0100 Subject: [PATCH] Updated azure headers management command --- api/serializers.py | 16 +++++- api/views.py | 35 ++++++++----- dss/settings.py | 4 +- spa/management/commands/azure_util.py | 49 ++++++++++++------- spa/migrations/0010_auto_20150907_2238.py | 30 ++++++++++++ spa/migrations/0011_auto_20150910_1927.py | 25 ++++++++++ spa/migrations/0012_remove_show_recurrence.py | 18 +++++++ spa/migrations/0013_show_recurrence_rrule.py | 20 ++++++++ spa/migrations/0014_show_recurrence.py | 20 ++++++++ spa/migrations/0015_auto_20150910_2136.py | 19 +++++++ .../0016_remove_show_recurrence_rrule.py | 18 +++++++ spa/models/show.py | 28 ++++++----- 12 files changed, 236 insertions(+), 46 deletions(-) create mode 100644 spa/migrations/0010_auto_20150907_2238.py create mode 100644 spa/migrations/0011_auto_20150910_1927.py create mode 100644 spa/migrations/0012_remove_show_recurrence.py create mode 100644 spa/migrations/0013_show_recurrence_rrule.py create mode 100644 spa/migrations/0014_show_recurrence.py create mode 100644 spa/migrations/0015_auto_20150910_2136.py create mode 100644 spa/migrations/0016_remove_show_recurrence_rrule.py diff --git a/api/serializers.py b/api/serializers.py index 78b0930..ab65b0b 100755 --- a/api/serializers.py +++ b/api/serializers.py @@ -157,7 +157,6 @@ class MixSerializer(serializers.ModelSerializer): ] slug = serializers.ReadOnlyField(required=False) - # user = serializers.SlugRelatedField(slug_field='slug', read_only=True) user = InlineUserProfileSerializer(read_only=True) waveform_url = serializers.ReadOnlyField(source='get_waveform_url') waveform_progress_url = serializers.ReadOnlyField(source='get_waveform_progress_url') @@ -493,5 +492,20 @@ class MessageSerializer(serializers.ModelSerializer): class ShowSerializer(serializers.ModelSerializer): + performer = InlineUserProfileSerializer(read_only=True) + user = InlineUserProfileSerializer(read_only=True) + class Meta: model = Show + """ + fields = ( + 'id', + 'start_date', + 'end_date', + 'user', + 'performer', + 'recurrence', + 'description' + ) + """ + diff --git a/api/views.py b/api/views.py index 62f0d49..9ab1edf 100755 --- a/api/views.py +++ b/api/views.py @@ -1,6 +1,5 @@ import logging import os -from django.contrib.auth.models import User from django.core.exceptions import PermissionDenied, ObjectDoesNotExist, SuspiciousOperation from django.core.files.base import ContentFile @@ -15,7 +14,7 @@ from rest_framework.parsers import FileUploadParser from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnly from rest_framework.response import Response from rest_framework.status import HTTP_202_ACCEPTED, HTTP_401_UNAUTHORIZED, HTTP_400_BAD_REQUEST, HTTP_404_NOT_FOUND, \ - HTTP_200_OK, HTTP_204_NO_CONTENT + HTTP_200_OK, HTTP_204_NO_CONTENT, HTTP_500_INTERNAL_SERVER_ERROR from api import serializers from dss import settings @@ -23,7 +22,6 @@ from spa import tasks from spa.models import Message from spa.models.genre import Genre from spa.models.activity import ActivityPlay -from spa.models.show import Show from spa.models.mix import Mix from spa.models.comment import Comment from spa.models.notification import Notification @@ -153,7 +151,8 @@ class SearchResultsView(views.APIView): if q_type == 'user': r_s = [ { - 'title': user.get_nice_name(), + 'id': user.id, + 'display_name': user.get_nice_name(), 'image': user.get_sized_avatar_image(64, 64), 'slug': user.slug, 'url': user.get_absolute_url(), @@ -162,15 +161,16 @@ class SearchResultsView(views.APIView): Q(user__first_name__icontains=q) | Q(user__last_name__icontains=q) | Q(display_name__icontains=q)).exclude(slug__isnull=True).exclude(slug__exact='')[0:10] - ] + ] else: - r_s = [{ - 'title': mix.title, - 'image': mix.get_image_url(), - 'slug': mix.slug, - 'url': mix.get_absolute_url(), - 'description': mix.description - } for mix in Mix.objects.filter(title__icontains=q)[0:10]] + r_s = [ + { + 'title': mix.title, + 'image': mix.get_image_url(), + 'slug': mix.slug, + 'url': mix.get_absolute_url(), + 'description': mix.description + } for mix in Mix.objects.filter(title__icontains=q)[0:10]] return Response(r_s) return HttpResponse(status=HTTP_204_NO_CONTENT) @@ -179,7 +179,7 @@ class SearchResultsView(views.APIView): class PartialMixUploadView(views.APIView): parser_classes = (FileUploadParser,) # TODO have to make this anonymous (for now) because dropzone doesn't play nice with JWT - #permission_classes = (IsAuthenticated,) + # permission_classes = (IsAuthenticated,) # noinspection PyBroadException def post(self, request): @@ -337,3 +337,12 @@ class MessageViewSet(viewsets.ModelViewSet): class ShowViewSet(viewsets.ModelViewSet): queryset = Show.objects.all() serializer_class = serializers.ShowSerializer + + def perform_create(self, serializer): + try: + performer = UserProfile.objects.get(pk=self.request.data['performer']) + serializer.save(user=self.request.user.userprofile, performer=performer) + except UserProfile.DoesNotExist: + return Response(status=HTTP_400_BAD_REQUEST, data='Performer not found') + except Exception as ex: + return Response(status=HTTP_500_INTERNAL_SERVER_ERROR, data=ex) diff --git a/dss/settings.py b/dss/settings.py index ece7066..468e021 100755 --- a/dss/settings.py +++ b/dss/settings.py @@ -212,8 +212,8 @@ THUMBNAIL_PREFIX = '_tn/' # THUMBNAIL_STORAGE = 'storages.backends.azure_storage.AzureStorage' JWT_AUTH = { - #'JWT_EXPIRATION_DELTA': timedelta(seconds=900), - 'JWT_EXPIRATION_DELTA': timedelta(seconds=5), + 'JWT_EXPIRATION_DELTA': timedelta(seconds=900), + # 'JWT_EXPIRATION_DELTA': timedelta(seconds=5), 'JWT_ALLOW_REFRESH': True, 'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=30), } diff --git a/spa/management/commands/azure_util.py b/spa/management/commands/azure_util.py index 8c01923..420a0a1 100755 --- a/spa/management/commands/azure_util.py +++ b/spa/management/commands/azure_util.py @@ -1,5 +1,6 @@ import os -from django.core.management.base import BaseCommand +from django.core.management.base import LabelCommand, CommandError +import sys from core.utils import cdn from spa.models.mix import Mix @@ -8,8 +9,10 @@ from spa.models.mix import Mix def _update_azure_headers(): ms = Mix.objects.all() for m in ms: + print("Update headers for {0}".format(m.title)) cdn.set_azure_details('{0}.mp3'.format(m.uid), 'Deep South Sounds - {0}'.format(m.title), 'mixes') + def _check_missing_mixes(): ms = Mix.objects.all() found = 0 @@ -28,16 +31,12 @@ def _check_missing_mixes(): print(('{0} of {1} missing'.format(found, Mix.objects.count()))) -class Command(BaseCommand): - def add_arguments(self, parser): - parser.add_argument( - '--delete', - action='store_true', - dest='delete', - default=False, - help='Delete poll instead of closing it') +class Command(LabelCommand): - def handle_noargs(self, **options): + def handle_label(self, label, **options): + pass + + def upload_mix(self, **options): try: mixes = Mix.objects.filter(archive_updated=False) for mix in mixes: @@ -49,12 +48,28 @@ class Command(BaseCommand): except Exception as ex: print("Fatal error, bailing. {0}".format(ex.message)) - def handle(self, *args, **options): - if len(args) == 0: - print("Commands are \n\t_check_missing_mixes") - elif args[0] == 'check_missing_mix': + def handle(self, *labels, **options): + verbosity = int(options.get('verbosity')) + + # Django 1.4 compatibility fix + stdout = options.get('stdout', None) + stdout = stdout if stdout else sys.stdout + + stderr = options.get('stderr', None) + stderr = stderr if stderr else sys.stderr + + if not labels: + print(self.print_help('thumbnail', ''), file=stderr) + sys.exit(1) + + if len(labels) != 1: + raise CommandError('`%s` is not a valid argument' % labels) + label = labels[0] + + if label not in ['check_missing_mixes', 'update_azure_headers']: + raise CommandError('`%s` unknown action' % label) + + if label == 'check_missing_mixes': _check_missing_mixes() - elif args[0] == 'update_azure_headers': + if label == 'update_azure_headers': _update_azure_headers() - else: - print("Commands are \n\tcheck_missing_mix") diff --git a/spa/migrations/0010_auto_20150907_2238.py b/spa/migrations/0010_auto_20150907_2238.py new file mode 100644 index 0000000..f60865d --- /dev/null +++ b/spa/migrations/0010_auto_20150907_2238.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import recurrence.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0009_auto_20150821_1940'), + ] + + operations = [ + migrations.AlterField( + model_name='show', + name='end_date', + field=models.DateTimeField(blank=True), + ), + migrations.AlterField( + model_name='show', + name='mix', + field=models.ForeignKey(null=True, related_name='show', to='spa.Mix', blank=True), + ), + migrations.AlterField( + model_name='show', + name='recurrence', + field=recurrence.fields.RecurrenceField(blank=True), + ), + ] diff --git a/spa/migrations/0011_auto_20150910_1927.py b/spa/migrations/0011_auto_20150910_1927.py new file mode 100644 index 0000000..0f3b91e --- /dev/null +++ b/spa/migrations/0011_auto_20150910_1927.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0010_auto_20150907_2238'), + ] + + operations = [ + migrations.AddField( + model_name='show', + name='performer', + field=models.ForeignKey(related_name='shows', default=2, to='spa.UserProfile'), + preserve_default=False, + ), + migrations.AlterField( + model_name='show', + name='user', + field=models.ForeignKey(related_name='owned_shows', to='spa.UserProfile'), + ), + ] diff --git a/spa/migrations/0012_remove_show_recurrence.py b/spa/migrations/0012_remove_show_recurrence.py new file mode 100644 index 0000000..0246826 --- /dev/null +++ b/spa/migrations/0012_remove_show_recurrence.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0011_auto_20150910_1927'), + ] + + operations = [ + migrations.RemoveField( + model_name='show', + name='recurrence', + ), + ] diff --git a/spa/migrations/0013_show_recurrence_rrule.py b/spa/migrations/0013_show_recurrence_rrule.py new file mode 100644 index 0000000..a68884d --- /dev/null +++ b/spa/migrations/0013_show_recurrence_rrule.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import recurrence.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0012_remove_show_recurrence'), + ] + + operations = [ + migrations.AddField( + model_name='show', + name='recurrence_rrule', + field=recurrence.fields.RecurrenceField(blank=True), + ), + ] diff --git a/spa/migrations/0014_show_recurrence.py b/spa/migrations/0014_show_recurrence.py new file mode 100644 index 0000000..739c1c6 --- /dev/null +++ b/spa/migrations/0014_show_recurrence.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0013_show_recurrence_rrule'), + ] + + operations = [ + migrations.AddField( + model_name='show', + name='recurrence', + field=models.SmallIntegerField(default=2), + preserve_default=False, + ), + ] diff --git a/spa/migrations/0015_auto_20150910_2136.py b/spa/migrations/0015_auto_20150910_2136.py new file mode 100644 index 0000000..4e9b064 --- /dev/null +++ b/spa/migrations/0015_auto_20150910_2136.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0014_show_recurrence'), + ] + + operations = [ + migrations.AlterField( + model_name='show', + name='recurrence', + field=models.CharField(max_length=1), + ), + ] diff --git a/spa/migrations/0016_remove_show_recurrence_rrule.py b/spa/migrations/0016_remove_show_recurrence_rrule.py new file mode 100644 index 0000000..61e9a48 --- /dev/null +++ b/spa/migrations/0016_remove_show_recurrence_rrule.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0015_auto_20150910_2136'), + ] + + operations = [ + migrations.RemoveField( + model_name='show', + name='recurrence_rrule', + ), + ] diff --git a/spa/models/show.py b/spa/models/show.py index 0cc086a..459c798 100755 --- a/spa/models/show.py +++ b/spa/models/show.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timedelta from django.db import models from spa.models.mix import Mix from spa.models.userprofile import UserProfile @@ -12,11 +12,12 @@ class ShowOverlapException(Exception): class Show(BaseModel): - mix = models.ForeignKey(Mix, related_name='show') - user = models.ForeignKey(UserProfile, related_name='show') + mix = models.ForeignKey(Mix, related_name='show', blank=True, null=True) + user = models.ForeignKey(UserProfile, related_name='owned_shows') + performer = models.ForeignKey(UserProfile, related_name='shows') start_date = models.DateTimeField() - end_date = models.DateTimeField() - recurrence = recurrence.fields.RecurrenceField() + end_date = models.DateTimeField(blank=True) + recurrence = models.CharField(max_length=1) description = models.CharField(max_length=2048) class Meta: @@ -24,11 +25,10 @@ class Show(BaseModel): def save(self, force_insert=False, force_update=False, using=None, update_fields=None): # throw an exception if event overlaps with another event + if not self.end_date: + # Default show is one hour + self.end_date = self.start_date + timedelta(hours=1) - # DEBUG - self.start_date = datetime.now() - self.end_date = datetime.now() - # END DEBUG overlaps = Show.objects.filter( models.Q(start_date__gte=self.start_date, end_date__lte=self.start_date) | models.Q(start_date__gte=self.end_date, end_date__lte=self.end_date) @@ -36,10 +36,12 @@ class Show(BaseModel): if len(overlaps) != 0: raise ShowOverlapException() - self.recurrence = recurrence.Recurrence( - dtstart=datetime(2014, 1, 2, 0, 0, 0), + return super(Show, self).save(force_insert, force_update, using, update_fields) + + def get_recurrence_rrule(self): + r = recurrence.Recurrence( + dtstart=self.start_date, dtend=datetime(2014, 1, 3, 0, 0, 0), rrules=[recurrence.Rule(recurrence.WEEKLY), ] ) - - return super(Show, self).save(force_insert, force_update, using, update_fields) + return r