forked from 0x2620/pandora
accessed/viewed/update to new site.json syntax
This commit is contained in:
parent
62301135ce
commit
a7b84e2b7f
2 changed files with 77 additions and 47 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue