mirror of
https://github.com/fergalmoran/dss.api.git
synced 2026-01-27 02:45:42 +00:00
Fixed CDN upload
This commit is contained in:
34
api/views.py
34
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)
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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',
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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=[
|
||||
|
||||
24
spa/migrations/0002_show.py
Normal file
24
spa/migrations/0002_show.py
Normal file
@@ -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')),
|
||||
],
|
||||
),
|
||||
]
|
||||
24
spa/migrations/0003_auto_20150820_2209.py
Normal file
24
spa/migrations/0003_auto_20150820_2209.py
Normal file
@@ -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,
|
||||
),
|
||||
]
|
||||
33
spa/migrations/0004_auto_20150820_2257.py
Normal file
33
spa/migrations/0004_auto_20150820_2257.py
Normal file
@@ -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,
|
||||
),
|
||||
]
|
||||
21
spa/migrations/0005_show_end_date.py
Normal file
21
spa/migrations/0005_show_end_date.py
Normal file
@@ -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,
|
||||
),
|
||||
]
|
||||
30
spa/migrations/0006_auto_20150820_2347.py
Normal file
30
spa/migrations/0006_auto_20150820_2347.py
Normal 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', '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',
|
||||
),
|
||||
]
|
||||
24
spa/migrations/0007_auto_20150821_1928.py
Normal file
24
spa/migrations/0007_auto_20150821_1928.py
Normal file
@@ -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(),
|
||||
),
|
||||
]
|
||||
24
spa/migrations/0008_auto_20150821_1931.py
Normal file
24
spa/migrations/0008_auto_20150821_1931.py
Normal file
@@ -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),
|
||||
),
|
||||
]
|
||||
24
spa/migrations/0009_auto_20150821_1940.py
Normal file
24
spa/migrations/0009_auto_20150821_1940.py
Normal file
@@ -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(),
|
||||
),
|
||||
]
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
from spa.models._lookup import _Lookup
|
||||
|
||||
class Recurrence(_Lookup):
|
||||
pass
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user