diff --git a/pandora/annotation/models.py b/pandora/annotation/models.py index 4eba78f57..74e76eff2 100644 --- a/pandora/annotation/models.py +++ b/pandora/annotation/models.py @@ -32,8 +32,8 @@ def create_or_update_layer(data): class Layer(models.Model): - class Meta: - ordering = ('position', ) + #class Meta: + # ordering = ('position', ) enabled = models.BooleanField(default=True) diff --git a/pandora/clip/models.py b/pandora/clip/models.py index 5b9eda3d3..1d3e54d0c 100644 --- a/pandora/clip/models.py +++ b/pandora/clip/models.py @@ -79,17 +79,6 @@ class Clip(models.Model): for key in j.keys(): if key not in keys: del j[key] - public_layers = [l['id'] - for l in filter(lambda l: not l.get('private', False), - settings.CONFIG['layers'])] - if 'annotations' in keys: - j['annotations'] = [a.json(keys=['value', 'id', 'layer']) - for a in self.annotations.filter(layer__name__in=public_layers).select_related()] - - for layer in filter(lambda l: l in keys, public_layers): - j[layer] = [a.json(keys=['id', 'value']) - for a in self.annotations.filter(layer__name=layer)] - for key in keys: if key not in clip_keys and key not in j: value = self.item.get(key) diff --git a/pandora/clip/views.py b/pandora/clip/views.py index d53ed253e..a4660c4ce 100644 --- a/pandora/clip/views.py +++ b/pandora/clip/views.py @@ -75,12 +75,39 @@ def findClips(request): response = json_response() query = parse_query(data, request.user) - qs = order_query(query['qs'], query['sort']) + qs = query['qs'] if 'keys' in data: + qs = order_query(qs, query['sort']) qs = qs[query['range'][0]:query['range'][1]] - qs = qs.select_related() + qs = qs.select_related('item__sort') response['data']['items'] = [p.json(keys=data['keys']) for p in qs] + from django.conf import settings + from annotation.models import Annotation + + keys = data['keys'] + public_layers = [l['id'] + for l in filter(lambda l: not l.get('private', False), + settings.CONFIG['layers'])] + + def merge_annotations(layer, qs): + for a in qs.values('public_id', 'value', 'clip__public_id'): + for i in response['data']['items']: + if i['id'] == a['clip__public_id']: + if not i[layer]: + i[layer] = [] + i[layer].append({ + 'id': a['public_id'], + 'value': a['value'], + }) + + if 'annotations' in keys: + merge_annotations('annotations', + Annotation.objects.filter(layer__name__in=public_layers, clip__in=qs)) + for layer in filter(lambda l: l in keys, public_layers): + merge_annotations(layer, + Annotation.objects.filter(layer__name=layer, clip__in=qs)) elif 'position' in query: + qs = order_query(qs, query['sort']) ids = [i.public_id for i in qs] data['conditions'] = data['conditions'] + { 'value': data['position'], @@ -92,6 +119,7 @@ def findClips(request): if qs.count() > 0: response['data']['position'] = utils.get_positions(ids, [qs[0].itemId])[0] elif 'positions' in data: + qs = order_query(qs, query['sort']) ids = [i.public_id for i in qs] response['data']['positions'] = utils.get_positions(ids, data['positions']) else: