diff --git a/api/views.py b/api/views.py index fb5788f..633a492 100755 --- a/api/views.py +++ b/api/views.py @@ -1,10 +1,11 @@ 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 from django.core.files.storage import FileSystemStorage -from django.db.models import Count +from django.db.models import Count, Q from django.http.response import HttpResponse from rest_framework import viewsets from rest_framework import views @@ -147,15 +148,30 @@ class AttachedImageUploadView(views.APIView): class SearchResultsView(views.APIView): def get(self, request, format=None): q = request.GET.get('q', '') + q_type = request.GET.get('type', '') if len(q) > 0: - m = [{ - '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(m) + if q_type == 'user': + r_s = [ + { + 'title': user.display_name, + 'image': user.get_sized_avatar_image(64, 64), + 'slug': user.slug, + 'url': user.get_absolute_url(), + 'description': user.description + } for user in UserProfile.objects.filter( + Q(user__first_name__icontains=q) | + Q(user__last_name__icontains=q) | + Q(display_name__icontains=q))[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]] + return Response(r_s) return HttpResponse(status=HTTP_204_NO_CONTENT) diff --git a/core/utils/cdn.py b/core/utils/cdn.py index 46ce001..f8f6def 100755 --- a/core/utils/cdn.py +++ b/core/utils/cdn.py @@ -10,25 +10,16 @@ from dss.storagesettings import AZURE_ACCOUNT_NAME, AZURE_ACCOUNT_KEY, AZURE_CON def upload_file_to_azure(in_file, file_name, container_name=settings.AZURE_CONTAINER): - if os.path.isfile(in_file): - print("Uploading file for: %s" % in_file) - with open(in_file, 'rb') as iterator: - return upload_stream_to_azure(iterator, file_name, container_name=container_name) - else: - print("infile not found") - return None - - -def upload_stream_to_azure(iterator, file_name, container_name=settings.AZURE_CONTAINER): - cls = get_driver(Provider.AZURE_BLOBS) - driver = cls(settings.AZURE_ACCOUNT_NAME, settings.AZURE_ACCOUNT_KEY) - container = driver.get_container(container_name) - obj = driver.upload_object_via_stream( - iterator=iterator, - container=container, - object_name=file_name - ) - return obj + try: + blob_service = BlobService(AZURE_ACCOUNT_NAME, AZURE_ACCOUNT_KEY) + blob_service.put_block_blob_from_path( + container_name=container_name, + blob_name=file_name, + file_path=in_file, + x_ms_blob_content_type='application/octet-stream' + ) + except Exception as ex: + print("Failed to upload blob: {0}".format(ex)) def set_azure_details(blob_name, download_name, container_name=AZURE_CONTAINER): diff --git a/core/utils/waveform.py b/core/utils/waveform.py index 73e7392..106f5ca 100755 --- a/core/utils/waveform.py +++ b/core/utils/waveform.py @@ -20,9 +20,10 @@ def generate_waveform(input_file, output_file): from PIL import Image import glob + print(output_file) im = Image.open(output_file) w, h = im.size - im.crop((0, 0, w, h / 2)).save(output_file) + im.crop((0, 0, int(w), int(h / 2))).save(output_file) return output_file else: @@ -30,5 +31,5 @@ def generate_waveform(input_file, output_file): return "" except Exception as ex: - print("Error generating waveform %s" % (ex)) + print("Error generating waveform {0}".format(ex)) diff --git a/dss/settings.py b/dss/settings.py index 6d6a9f7..e2146d9 100755 --- a/dss/settings.py +++ b/dss/settings.py @@ -84,7 +84,7 @@ MIDDLEWARE_CLASSES = ( # 'htmlmin.middleware.MarkRequestMiddleware', 'django_user_agents.middleware.UserAgentMiddleware', # 'spa.middleware.uploadify.SWFUploadMiddleware', - # 'spa.middleware.sqlprinter.SqlPrintingMiddleware' if DEBUG else None, + 'spa.middleware.sqlprinter.SqlPrintingMiddleware' if DEBUG else None, # 'debug_toolbar.middleware.DebugToolbarMiddleware', ) diff --git a/requirements.txt b/requirements.txt index 4ffd456..4ad9c39 100755 --- a/requirements.txt +++ b/requirements.txt @@ -16,6 +16,7 @@ django-model_utils django-dbbackup django-user-agents redis +git+git://github.com/llazzaro/django-scheduler.git#django-scheduler django-celery django-scheduler azure diff --git a/spa/admin.py b/spa/admin.py index 9e91359..6b443d4 100755 --- a/spa/admin.py +++ b/spa/admin.py @@ -2,7 +2,6 @@ from django.contrib import admin from spa.models.genre import Genre from spa.models.userprofile import UserProfile from spa.models.chatmessage import ChatMessage -from spa.models.recurrence import Recurrence from spa.models.release import Release from spa.models.label import Label from spa.models.mix import Mix @@ -23,5 +22,4 @@ admin.site.register(Release, DefaultAdmin) admin.site.register(ReleaseAudio) admin.site.register(Venue) admin.site.register(UserProfile) -admin.site.register(Recurrence) admin.site.register(ChatMessage) diff --git a/spa/migrations/0001_initial.py b/spa/migrations/0001_initial.py index b02daf1..c9e7d8b 100644 --- a/spa/migrations/0001_initial.py +++ b/spa/migrations/0001_initial.py @@ -198,16 +198,6 @@ class Migration(migrations.Migration): ('release', models.ForeignKey(related_name='release_audio', blank=True, null=True, to='spa.Release')), ], ), - migrations.CreateModel( - name='Show', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)), - ('object_created', models.DateTimeField(auto_now_add=True)), - ('object_updated', models.DateTimeField(db_index=True, auto_now=True)), - ('test_field', models.CharField(max_length=400)), - ('mix', models.ForeignKey(related_name='show', to='spa.Mix')), - ], - ), migrations.CreateModel( name='Tracklist', fields=[ diff --git a/spa/migrations/0002_show.py b/spa/migrations/0002_show.py new file mode 100644 index 0000000..6436d5e --- /dev/null +++ b/spa/migrations/0002_show.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Show', + fields=[ + ('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID', primary_key=True)), + ('object_created', models.DateTimeField(auto_now_add=True)), + ('object_updated', models.DateTimeField(db_index=True, auto_now=True)), + ('test_field', models.CharField(max_length=400)), + ('mix', models.ForeignKey(related_name='show', to='spa.Mix')), + ], + ), + ] diff --git a/spa/migrations/0003_auto_20150820_2209.py b/spa/migrations/0003_auto_20150820_2209.py new file mode 100644 index 0000000..360f174 --- /dev/null +++ b/spa/migrations/0003_auto_20150820_2209.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0002_show'), + ] + + operations = [ + migrations.RemoveField( + model_name='show', + name='test_field', + ), + migrations.AddField( + model_name='show', + name='user', + field=models.ForeignKey(default=2, related_name='show', to='spa.UserProfile'), + preserve_default=False, + ), + ] diff --git a/spa/migrations/0004_auto_20150820_2257.py b/spa/migrations/0004_auto_20150820_2257.py new file mode 100644 index 0000000..7761fe8 --- /dev/null +++ b/spa/migrations/0004_auto_20150820_2257.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import datetime + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0003_auto_20150820_2209'), + ] + + operations = [ + migrations.AddField( + model_name='show', + name='description', + field=models.CharField(max_length=2048, default='New Event'), + preserve_default=False, + ), + migrations.AddField( + model_name='show', + name='recurrence', + field=models.CharField(max_length=30, default='R'), + preserve_default=False, + ), + migrations.AddField( + model_name='show', + name='start_date', + field=models.DateField(default=datetime.datetime(2015, 8, 20, 22, 57, 40, 815435)), + preserve_default=False, + ), + ] diff --git a/spa/migrations/0005_show_end_date.py b/spa/migrations/0005_show_end_date.py new file mode 100644 index 0000000..df35438 --- /dev/null +++ b/spa/migrations/0005_show_end_date.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import datetime + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0004_auto_20150820_2257'), + ] + + operations = [ + migrations.AddField( + model_name='show', + name='end_date', + field=models.DateField(default=datetime.datetime(2015, 8, 20, 23, 3, 54, 33809)), + preserve_default=False, + ), + ] diff --git a/spa/migrations/0006_auto_20150820_2347.py b/spa/migrations/0006_auto_20150820_2347.py new file mode 100644 index 0000000..d58ea27 --- /dev/null +++ b/spa/migrations/0006_auto_20150820_2347.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', '0005_show_end_date'), + ] + + operations = [ + migrations.RemoveField( + model_name='recurrence', + name='_lookup_ptr', + ), + migrations.AlterField( + model_name='show', + name='recurrence', + field=recurrence.fields.RecurrenceField(), + ), + migrations.DeleteModel( + name='_Lookup', + ), + migrations.DeleteModel( + name='Recurrence', + ), + ] diff --git a/spa/migrations/0007_auto_20150821_1928.py b/spa/migrations/0007_auto_20150821_1928.py new file mode 100644 index 0000000..0bc4746 --- /dev/null +++ b/spa/migrations/0007_auto_20150821_1928.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0006_auto_20150820_2347'), + ] + + operations = [ + migrations.AlterField( + model_name='show', + name='end_date', + field=models.DateTimeField(), + ), + migrations.AlterField( + model_name='show', + name='start_date', + field=models.DateTimeField(), + ), + ] diff --git a/spa/migrations/0008_auto_20150821_1931.py b/spa/migrations/0008_auto_20150821_1931.py new file mode 100644 index 0000000..e91ea70 --- /dev/null +++ b/spa/migrations/0008_auto_20150821_1931.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0007_auto_20150821_1928'), + ] + + operations = [ + migrations.AlterField( + model_name='show', + name='end_date', + field=models.DateTimeField(auto_now_add=True), + ), + migrations.AlterField( + model_name='show', + name='start_date', + field=models.DateTimeField(auto_now_add=True), + ), + ] diff --git a/spa/migrations/0009_auto_20150821_1940.py b/spa/migrations/0009_auto_20150821_1940.py new file mode 100644 index 0000000..663cb33 --- /dev/null +++ b/spa/migrations/0009_auto_20150821_1940.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('spa', '0008_auto_20150821_1931'), + ] + + operations = [ + migrations.AlterField( + model_name='show', + name='end_date', + field=models.DateTimeField(), + ), + migrations.AlterField( + model_name='show', + name='start_date', + field=models.DateTimeField(), + ), + ] diff --git a/spa/models/__init__.py b/spa/models/__init__.py index 580a86c..338e671 100755 --- a/spa/models/__init__.py +++ b/spa/models/__init__.py @@ -1,7 +1,6 @@ from .basemodel import BaseModel from .userprofile import UserProfile from .chatmessage import ChatMessage -from .recurrence import Recurrence from .comment import Comment from .venue import Venue from .label import Label diff --git a/spa/models/__pycache__/__init__.cpython-34.pyc.139657446244720 b/spa/models/__pycache__/__init__.cpython-34.pyc.139657446244720 new file mode 100644 index 0000000..e69de29 diff --git a/spa/models/mix.py b/spa/models/mix.py index ceb8d21..3fc887d 100755 --- a/spa/models/mix.py +++ b/spa/models/mix.py @@ -91,6 +91,9 @@ class Mix(BaseModel): favourites = models.ManyToManyField(UserProfile, related_name='favourites', blank=True) likes = models.ManyToManyField(UserProfile, related_name='likes', blank=True) + def __str__(self): + return self.__unicode__() + def __unicode__(self): return self.title diff --git a/spa/models/recurrence.py b/spa/models/recurrence.py deleted file mode 100755 index 275898a..0000000 --- a/spa/models/recurrence.py +++ /dev/null @@ -1,4 +0,0 @@ -from spa.models._lookup import _Lookup - -class Recurrence(_Lookup): - pass diff --git a/spa/models/show.py b/spa/models/show.py index c385f3e..0cc086a 100755 --- a/spa/models/show.py +++ b/spa/models/show.py @@ -1,37 +1,45 @@ -<<<<<<< HEAD -======= +from datetime import datetime from django.db import models ->>>>>>> master -from django.db.models import Q, ForeignKey -# from schedule.models import Event from spa.models.mix import Mix +from spa.models.userprofile import UserProfile from spa.models.basemodel import BaseModel +import recurrence +import recurrence.fields class ShowOverlapException(Exception): pass -class Show(BaseModel): # Event): - mix = ForeignKey(Mix, related_name='show') - test_field = models.CharField(max_length=400) +class Show(BaseModel): + mix = models.ForeignKey(Mix, related_name='show') + user = models.ForeignKey(UserProfile, related_name='show') + start_date = models.DateTimeField() + end_date = models.DateTimeField() + recurrence = recurrence.fields.RecurrenceField() + description = models.CharField(max_length=2048) class Meta: app_label = 'spa' -<<<<<<< HEAD def save(self, force_insert=False, force_update=False, using=None, update_fields=None): - -======= - def save(self, force_insert=False, force_update=False, using=None, - update_fields=None): # throw an exception if event overlaps with another event ->>>>>>> master + + # DEBUG + self.start_date = datetime.now() + self.end_date = datetime.now() + # END DEBUG overlaps = Show.objects.filter( - Q(start__gte=self.start, end__lte=self.start) | - Q(start__gte=self.end, end__lte=self.end) + 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) ) if len(overlaps) != 0: raise ShowOverlapException() + self.recurrence = recurrence.Recurrence( + dtstart=datetime(2014, 1, 2, 0, 0, 0), + 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) diff --git a/spa/models/userprofile.py b/spa/models/userprofile.py index 58d4896..c6c3242 100755 --- a/spa/models/userprofile.py +++ b/spa/models/userprofile.py @@ -1,7 +1,7 @@ import logging import os -import urllib.parse +import urllib.parse from bitfield.models import BitField from django.contrib.auth.models import User from django.core.exceptions import SuspiciousOperation @@ -9,7 +9,6 @@ from django.db import models from django.db.models import Count from django_gravatar.helpers import has_gravatar, get_gravatar_url from sorl import thumbnail -from sorl.thumbnail import get_thumbnail from core.utils.file import generate_save_file_name from core.utils.url import unique_slugify @@ -70,6 +69,9 @@ class UserProfile(BaseModel): last_known_session = models.CharField(max_length=250, blank=True, null=True) + def __str__(self): + return self.__unicode__() + def __unicode__(self): return "%s - %s" % (self.user.get_full_name(), self.slug) diff --git a/spa/tasks.py b/spa/tasks.py index 48dc168..aad980b 100755 --- a/spa/tasks.py +++ b/spa/tasks.py @@ -30,12 +30,13 @@ def create_waveform_task(in_file, uid): logger.error("Outfile is missing") -@task(timse_limit=3600) +@task(time_limit=3600) def upload_to_cdn_task(filetype, uid, container_name): source_file = os.path.join(settings.CACHE_ROOT, '{0}/{1}.{2}'.format(container_name, uid, filetype)) logger.info("Sending {0} to azure".format(uid)) try: file_name = "{0}.{1}".format(uid, filetype) + print(source_file) cdn.upload_file_to_azure(source_file, file_name, container_name) return source_file except Exception as ex: