diff --git a/pandora/item/models.py b/pandora/item/models.py index c9153f4..1b9b552 100644 --- a/pandora/item/models.py +++ b/pandora/item/models.py @@ -125,18 +125,12 @@ class Item(models.Model): return default def access(self, user): - if user.is_authenticated(): - access, created = Access.objects.get_or_create(item=self, user=user) - else: - access, created = Access.objects.get_or_create(item=self, user=None) - access.save() - if self.public and self.available: return True - elif user.is_staff or \ - self.user == user or \ - self.groups.filter(id__in=user.groups.all()).count() > 0: - return True + elif user.is_authenticated() and \ + (user.is_staff or self.user == user or \ + self.groups.filter(id__in=user.groups.all()).count() > 0): + return True return False def editable(self, user): @@ -431,13 +425,18 @@ class Item(models.Model): sort_value = u'' return sort_value + def set_value(s, name, value): + if not value: + value = None + setattr(s, name, value) + base_keys = ( 'id', 'aspectratio', 'duration', - 'color', + 'hue', 'saturation', - 'brightness', + 'lightness', 'volume', 'clips', 'cuts', @@ -448,24 +447,19 @@ class Item(models.Model): 'pixels', 'size', 'bitrate', - 'files', - 'filename', + 'numberoffiles', 'published', 'modified', - 'popularity' + 'popularity', ) - max_int = 9223372036854775807L - def set_value(s, name, value): - if not value: - value = None - setattr(s, name, value) - - for key in filter(lambda k: 'sort' in k, config['itemKeys']): + for key in filter(lambda k: 'columnWidth' in k, config['itemKeys']): name = key['id'] source = name - sort_type = key['sort'].get('type', key['type']) + sort_type = key.get('sort', key['type']) if 'value' in key: + if 'layer' in key['value']: + continue source = key['value']['key'] sort_type = key['value'].get('type', sort_type) @@ -525,8 +519,7 @@ class Item(models.Model): if 'bitrate' in videos[0].info: s.bitrate = videos[0].info['bitrate'] s.pixels = sum([v.pixels for v in videos]) - s.filename = ' '.join([v.name for v in videos])[:955] - s.files = self.files.all().count() + s.numberoffiles = self.files.all().count() s.size = sum([v.size for v in videos]) #FIXME: only size of movies? s.volume = 0 else: @@ -540,10 +533,12 @@ class Item(models.Model): s.size = None s.volume = None - s.color = int(sum(self.data.get('color', []))) - s.saturation = None #FIXME - s.brightness = None #FIXME - + if 'color' in self.data: + s.hue, s.saturation, s.brightness = self.data['color'] + else: + s.hue = None + s.saturation = None + s.brighness = None s.cuts = len(self.data.get('cuts', [])) if s.duration: s.cutsperminute = s.cuts / (s.duration/60) @@ -559,7 +554,7 @@ class Item(models.Model): if not isinstance(current_values, list): current_values = [current_values] saved_values = [i.value for i in Facet.objects.filter(item=self, key=key)] - removed_values = filter(lambda x: x not in current_values, saved_values) + removed_values = filter(lambda i: i not in current_values, saved_values) if removed_values: Facet.objects.filter(item=self, key=key, value__in=removed_values).delete() for value in current_values: @@ -570,12 +565,6 @@ class Item(models.Model): f = Facet(key=key, value=value, value_sort=value_sort) f.item = self f.save() - year = self.get('year', None) - if year: - f, created = Facet.objects.get_or_create(key='year', value=year, - value_sort=year, item=self) - else: - Facet.objects.filter(item=self, key='year').delete() def path(self, name=''): h = self.itemId @@ -789,13 +778,13 @@ class Item(models.Model): config = site_config() Item.facet_keys = [] -for key in filter(lambda k: 'find' in k, config['itemKeys']): - if 'autocomplete' in key['find'] and not 'autocompleteSortKey' in key['find']: +for key in config['itemKeys']: + if 'autocomplete' in key and not 'autocompleteSortKey' in key: Item.facet_keys.append(key['id']) Item.person_keys = [] -for key in filter(lambda k: 'sort' in k, config['itemKeys']): - if key['sort'].get('type', '') == 'person': +for key in config['itemKeys']: + if 'sort' in key and key['sort'] == 'person': Item.person_keys.append(key['id']) class ItemFind(models.Model): @@ -822,10 +811,12 @@ attrs = { '__module__': 'item.models', 'item': models.OneToOneField('Item', related_name='sort', primary_key=True), } -for key in filter(lambda k: 'sort' in k, config['itemKeys']): +for key in filter(lambda k: 'columnWidth' in k, config['itemKeys']): name = key['id'] name = {'id': 'itemId'}.get(name, name) - sort_type = key['sort'].get('type', key['type']) + sort_type = key.get('sort', key['type']) + if isinstance(sort_type, list): + sort_type = sort_type[0] model = { 'char': (models.CharField, dict(null=True, max_length=1000, db_index=True)), 'year': (models.CharField, dict(null=True, max_length=4, db_index=True)), @@ -840,6 +831,7 @@ for key in filter(lambda k: 'sort' in k, config['itemKeys']): 'words': 'integer', 'length': 'integer', 'date': 'date', + 'hue': 'float', }.get(sort_type, sort_type)] attrs[name] = model[0](**model[1]) @@ -854,7 +846,14 @@ class Access(models.Model): access = models.DateTimeField(auto_now=True) item = models.ForeignKey(Item, related_name='accessed') user = models.ForeignKey(User, null=True, related_name='accessed_items') - + accessed = models.IntegerField(default=0) + + def save(self, *args, **kwargs): + if not self.accessed: + self.accessed = 0 + self.accessed += 1 + super(Access, self).save(*args, **kwargs) + def __unicode__(self): if self.user: return u"%s/%s/%s" % (self.user, self.item, self.access) diff --git a/pandora/item/views.py b/pandora/item/views.py index 58eeefd..0e77c5a 100644 --- a/pandora/item/views.py +++ b/pandora/item/views.py @@ -2,8 +2,9 @@ # vi:si:et:sw=4:sts=4:ts=4 from __future__ import division import os.path +from datetime import datetime -from django.db.models import Count, Sum +from django.db.models import Count, Sum, Max from django.http import HttpResponse, Http404 from django.shortcuts import get_object_or_404, redirect from django.conf import settings @@ -48,8 +49,14 @@ def _order_query(qs, sort, prefix='sort__'): operator = e['operator'] if operator != '-': operator = '' - key = {'id': 'itemId'}.get(e['key'], e['key']) - order = '%s%s%s' % (operator, prefix, key) + key = { + 'id': 'itemId', + 'accessed': 'accessed__access', + 'viewed': 'accessed__access' + }.get(e['key'], e['key']) + if key not in ('accessed__access', ): + key = "%s%s" % (prefix, key) + order = '%s%s' % (operator, key) order_by.append(order) if order_by: qs = qs.order_by(*order_by, nulls_last=True) @@ -189,6 +196,18 @@ Positions response['data']['items'] = [] qs = _order_query(query['qs'], query['sort']) _p = query['keys'] + def only_p_sums(m): + r = {} + for p in _p: + if p in ('accessed', 'viewed'): + r[p] = getattr(m, 'viewed') + elif p == 'popularity': + r[p] = getattr(m, p) + else: + r[p] = m.json.get(p, '') + if isinstance(r[p], datetime): + r[p] = r[p].strftime('%Y-%m-%dT%H:%M:%SZ') + return r def only_p(m): r = {} if m: @@ -196,9 +215,21 @@ Positions for p in _p: r[p] = m.get(p, '') return r + if 'viewed' in _p and request.user.is_authenticated(): + qs = qs.filter(accessed__user=request.user) qs = qs[query['range'][0]:query['range'][1]] #response['data']['items'] = [m.get_json(_p) for m in qs] - response['data']['items'] = [only_p(m['json']) for m in qs.values('json')] + if 'popularity' in _p: + qs = qs.annotate(popularity=Sum('accessed__accessed')) + response['data']['items'] = [only_p_sums(m) for m in qs] + elif 'viewed' in _p and request.user.is_authenticated(): + qs = qs.annotate(viewed=Max('accessed__access')) + response['data']['items'] = [only_p_sums(m) for m in qs] + elif 'accessed' in _p: + qs = qs.annotate(viewed=Max('accessed__access')) + response['data']['items'] = [only_p_sums(m) for m in qs] + else: + response['data']['items'] = [only_p(m['json']) for m in qs.values('json')] else: # otherwise stats items = query['qs'] files = File.objects.all().filter(item__in=items).filter(size__gt=0)