From 687738ff46f228ccb9d02086bfa8b0d139d9bc57 Mon Sep 17 00:00:00 2001 From: j Date: Thu, 15 Nov 2018 10:28:30 +0000 Subject: [PATCH] make sure settings are dicts --- pandora/clip/managers.py | 6 +++- pandora/clip/views.py | 2 +- pandora/edit/models.py | 63 ++++++++++++++++++++++------------------ pandora/settings.py | 7 +++++ pandora/user/views.py | 2 +- requirements.txt | 1 + update.py | 3 ++ 7 files changed, 53 insertions(+), 31 deletions(-) diff --git a/pandora/clip/managers.py b/pandora/clip/managers.py index d69fb7c66..729624d57 100644 --- a/pandora/clip/managers.py +++ b/pandora/clip/managers.py @@ -145,7 +145,11 @@ class ClipManager(Manager): keys = layer_ids + ['annotations', 'text', '*'] conditions = data.get('query', {}).get('conditions', []) conditions = flatten_conditions(conditions) - conditions = list(filter(lambda c: c.get('key') in keys, conditions)) + conditions_ = [] + for c in conditions: + if c.get('key') in keys and c not in conditions_: + conditions_.append(c) + conditions = conditions_ operator = data.get('query', {}).get('operator', '&') def parse(condition): diff --git a/pandora/clip/views.py b/pandora/clip/views.py index b37427c26..df2c9103f 100644 --- a/pandora/clip/views.py +++ b/pandora/clip/views.py @@ -95,7 +95,7 @@ def findClips(request, data): if 'keys' in data: qs = order_query(qs, query['sort']) qs = qs[query['range'][0]:query['range'][1]] - qs = qs.select_related('item') + #qs = qs.select_related('item') layers = settings.CONFIG['layers'] entity_layer_ids = [k['id'] for k in layers if k['type'] == 'entity'] diff --git a/pandora/edit/models.py b/pandora/edit/models.py index 2dfe2ee03..a407d69a3 100644 --- a/pandora/edit/models.py +++ b/pandora/edit/models.py @@ -11,9 +11,10 @@ import tempfile from six.moves.urllib.parse import quote import ox from django.conf import settings +from django.contrib.auth import get_user_model +from django.core.cache import cache from django.db import models, transaction from django.db.models import Max -from django.contrib.auth import get_user_model from django.utils.encoding import python_2_unicode_compatible from oxdjango.fields import JSONField @@ -118,7 +119,7 @@ class Edit(models.Model): c = self.add_clip(data) if c: ids.insert(index, c.id) - added.append(c.json(user)) + added.append(c.json(user=user)) added[-1]['index'] = index index += 1 else: @@ -488,32 +489,38 @@ class Clip(models.Model): self.sortvolume = 0 def json(self, user=None): - data = { - 'id': self.get_id(), - 'index': self.index, - 'volume': self.volume, - } - if self.annotation: - data['annotation'] = self.annotation.public_id - data['item'] = self.item.public_id - data['in'] = self.annotation.start - data['out'] = self.annotation.end - data['parts'] = self.annotation.item.cache['parts'] - data['durations'] = self.annotation.item.cache['durations'] - else: - data['item'] = self.item.public_id - data['in'] = self.start - data['out'] = self.end - data['parts'] = self.item.cache['parts'] - data['durations'] = self.item.cache['durations'] - for key in ('title', 'director', 'year', 'videoRatio'): - value = self.item.cache.get(key) - if value: - data[key] = value - data['duration'] = data['out'] - data['in'] - data['cuts'] = tuple([c for c in self.item.get('cuts', []) if c > self.start and c < self.end]) - data['layers'] = self.get_layers(user) - data['streams'] = [s.file.oshash for s in self.item.streams()] + cache_key = 'edit:clip:' + str(self.get_id()) + if user: + cache_key += ':' + user.username + data = cache.get(cache_key) + if not data: + data = { + 'id': self.get_id(), + 'index': self.index, + 'volume': self.volume, + } + if self.annotation: + data['annotation'] = self.annotation.public_id + data['item'] = self.item.public_id + data['in'] = self.annotation.start + data['out'] = self.annotation.end + data['parts'] = self.annotation.item.cache['parts'] + data['durations'] = self.annotation.item.cache['durations'] + else: + data['item'] = self.item.public_id + data['in'] = self.start + data['out'] = self.end + data['parts'] = self.item.cache['parts'] + data['durations'] = self.item.cache['durations'] + for key in ('title', 'director', 'year', 'videoRatio'): + value = self.item.cache.get(key) + if value: + data[key] = value + data['duration'] = data['out'] - data['in'] + data['cuts'] = tuple([c for c in self.item.get('cuts', []) if c > self.start and c < self.end]) + data['layers'] = self.get_layers(user) + data['streams'] = [s.file.oshash for s in self.item.streams()] + cache.set(cache_key, data, 180) return data def get_annotations(self): diff --git a/pandora/settings.py b/pandora/settings.py index a8e59fed0..4f24c8fc6 100644 --- a/pandora/settings.py +++ b/pandora/settings.py @@ -170,6 +170,13 @@ LOGGING = { } } +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', + 'LOCATION': 'cache', + } +} + AUTH_PROFILE_MODULE = 'user.UserProfile' AUTH_CHECK_USERNAME = True FFMPEG = 'ffmpeg' diff --git a/pandora/user/views.py b/pandora/user/views.py index 17ce76da6..d9639d70a 100644 --- a/pandora/user/views.py +++ b/pandora/user/views.py @@ -785,7 +785,7 @@ def setUI(request, data): if isinstance(p, list): p = p[getPositionById(p, key)] else: - if key not in p: + if key not in p or not isinstance(p[key], dict): p[key] = {} p = p[key] if value == None and keys[0] in p: diff --git a/requirements.txt b/requirements.txt index a3936b666..a3b5c98f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,3 +10,4 @@ requests==2.19.1 tornado<5 geoip2==2.9.0 youtube-dl +python-memcached diff --git a/update.py b/update.py index 72ad1db8e..e5a41f06c 100755 --- a/update.py +++ b/update.py @@ -249,6 +249,9 @@ if __name__ == "__main__": update_service('pandora-tasks') if old < 5975: run('./bin/pip', 'install', '-r', 'requirements.txt') + if old <= 6064: + run('./bin/pip', 'install', '-r', 'requirements.txt') + run('./pandora/manage.py', 'createcachetable') else: if len(sys.argv) == 1: release = get_release()