diff --git a/pandora/clip/models.py b/pandora/clip/models.py index 0045c16c..57858f3e 100644 --- a/pandora/clip/models.py +++ b/pandora/clip/models.py @@ -11,6 +11,36 @@ from archive import extract import managers +def get_layers(item, interval=None, user=None): + from annotation.models import Annotation + + if user and user.is_anonymous(): + user = None + + layers = {} + private = [] + for l in settings.CONFIG['layers']: + name = l['id'] + layers[name] = [] + if l.get('private'): + private.append(name) + + qs = Annotation.objects.filter(item=item).exclude(value='') + qs = qs.order_by('start', 'end', 'sortvalue') + + if interval: + start, end = interval + qs = qs.filter(start__lt=end, end__gt=start) + + for a in qs.order_by('start').select_related('user'): + if a.layer in private: + if a.user == user: + layers[a.layer].append(a.json(user=user)) + else: + layers[a.layer].append(a.json(user=user)) + return layers + + class MetaClip: def update_calculated_values(self): start = self.start @@ -113,27 +143,7 @@ class MetaClip: return data def get_layers(self, user=None): - from annotation.models import Annotation - start = self.start - end = self.end - item = self.item - layers = {} - private = [] - for l in settings.CONFIG['layers']: - name = l['id'] - layers[name] = [] - if l.get('private'): - private.append(name) - qs = Annotation.objects.filter(item=item).exclude(value='') - qs = qs.order_by('start', 'end', 'sortvalue') - qs = qs.filter(start__lt=end, end__gt=start) - for a in qs.order_by('start'): - if a.layer in private: - if a.user == user: - layers[a.layer].append(a.json(user=user)) - else: - layers[a.layer].append(a.json(user=user)) - return layers + return get_layers(item=self.item, interval=(self.start, self.end), user=user) @classmethod def get_or_create(cls, item, start, end): diff --git a/pandora/edit/models.py b/pandora/edit/models.py index 05d97091..713ec7c2 100644 --- a/pandora/edit/models.py +++ b/pandora/edit/models.py @@ -511,22 +511,8 @@ class Clip(models.Model): start = self.start end = self.end item = self.item - layers = {} - for l in settings.CONFIG['layers']: - name = l['id'] - ll = layers.setdefault(name, []) - qs = Annotation.objects.filter(layer=name, item=item).order_by( - 'start', 'end', 'sortvalue') - if name == 'subtitles': - qs = qs.exclude(value='') - qs = qs.filter(start__lt=end, end__gt=start) - if l.get('private'): - if user and user.is_anonymous(): - user = None - qs = qs.filter(user=user) - for a in qs.order_by('start').select_related('user'): - ll.append(a.json(user=user)) - return layers + + return clip.models.get_layers(item=item, interval=(start, end), user=user) class Position(models.Model): diff --git a/pandora/item/models.py b/pandora/item/models.py index b0ed9fdc..0dad146e 100644 --- a/pandora/item/models.py +++ b/pandora/item/models.py @@ -34,7 +34,7 @@ from data_api import external_data from annotation.models import Annotation from archive import extract -from clip.models import Clip +from clip.models import Clip, get_layers from person.models import get_name_sort from sequence.tasks import get_sequences from title.models import get_title_sort @@ -547,21 +547,8 @@ class Item(models.Model): return s.json() def get_layers(self, user=None): - layers = {} - for l in settings.CONFIG['layers']: - name = l['id'] - ll = layers.setdefault(name, []) - qs = Annotation.objects.filter(layer=name, item=self).order_by( - 'start', 'end', 'sortvalue') - qs = qs.exclude(value='') - if l.get('private'): - if user and user.is_anonymous(): - user = None - qs = qs.filter(user=user) - for a in qs.order_by('start'): - ll.append(a.json(user=user)) - return layers - + return get_layers(item=self, user=user) + def get_documents(self, user=None): qs = self.documents.all() documents = [d.json(item=self) for d in qs]