Updated azure headers management command

This commit is contained in:
Fergal Moran
2015-09-13 14:53:52 +01:00
parent 51568f79dd
commit 42b30b8e3a
12 changed files with 236 additions and 46 deletions

View File

@@ -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'
)
"""

View File

@@ -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)

View File

@@ -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),
}

View File

@@ -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")

View File

@@ -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),
),
]

View File

@@ -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'),
),
]

View File

@@ -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',
),
]

View File

@@ -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),
),
]

View File

@@ -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,
),
]

View File

@@ -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),
),
]

View File

@@ -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',
),
]

View File

@@ -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