groups
This commit is contained in:
parent
43c623e953
commit
5a844b0a14
6 changed files with 37 additions and 23 deletions
|
@ -65,9 +65,9 @@ class Annotation(models.Model):
|
||||||
|
|
||||||
def editable(self, user):
|
def editable(self, user):
|
||||||
if user.is_authenticated():
|
if user.is_authenticated():
|
||||||
if self.user == user or user.has_perm('0x.admin'):
|
if user.is_staff or \
|
||||||
return True
|
self.user == user or \
|
||||||
if user.groups.filter(id__in=self.groups.all()).count() > 0:
|
user.groups.filter(id__in=self.groups.all()).count() > 0:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -117,12 +117,6 @@ class File(models.Model):
|
||||||
|
|
||||||
super(File, self).save(*args, **kwargs)
|
super(File, self).save(*args, **kwargs)
|
||||||
|
|
||||||
def json(self):
|
|
||||||
r = {}
|
|
||||||
for k in self:
|
|
||||||
r[k] = unicode(self[k])
|
|
||||||
return r
|
|
||||||
|
|
||||||
#upload and data handling
|
#upload and data handling
|
||||||
video = models.FileField(null=True, blank=True, upload_to=lambda f, x: f.path('%s.webm'%settings.VIDEO_PROFILE))
|
video = models.FileField(null=True, blank=True, upload_to=lambda f, x: f.path('%s.webm'%settings.VIDEO_PROFILE))
|
||||||
data = models.FileField(null=True, blank=True, upload_to=lambda f, x: f.path('data.bin'))
|
data = models.FileField(null=True, blank=True, upload_to=lambda f, x: f.path('data.bin'))
|
||||||
|
@ -227,7 +221,8 @@ class File(models.Model):
|
||||||
'audio_codec': self.audio_codec,
|
'audio_codec': self.audio_codec,
|
||||||
'name': self.name,
|
'name': self.name,
|
||||||
'size': self.size,
|
'size': self.size,
|
||||||
'info': self.info
|
'info': self.info,
|
||||||
|
'instances': self.instances.count()
|
||||||
}
|
}
|
||||||
if keys:
|
if keys:
|
||||||
for k in data.keys():
|
for k in data.keys():
|
||||||
|
@ -235,6 +230,7 @@ class File(models.Model):
|
||||||
del data[k]
|
del data[k]
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
class Volume(models.Model):
|
class Volume(models.Model):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -240,9 +240,12 @@ class ItemManager(Manager):
|
||||||
conditions = parseConditions(data['query'].get('conditions', []),
|
conditions = parseConditions(data['query'].get('conditions', []),
|
||||||
data['query'].get('operator', '&'))
|
data['query'].get('operator', '&'))
|
||||||
qs = qs.filter(conditions)
|
qs = qs.filter(conditions)
|
||||||
|
|
||||||
#FIXME: lists are part of query now
|
#anonymous can only see public items
|
||||||
# filter list, works for own or public lists
|
if user.is_anonymous():
|
||||||
l = data.get('list', 'all')
|
qs = qs.filter(public=True)
|
||||||
qs = self.filter_list(qs, l, user)
|
#users can see public items, there own items and items of there groups
|
||||||
|
elif not user.is_staff:
|
||||||
|
qs = qs.filter(Q(public=True)|Q(user=user)|Q(groups__in=user.groups.all()))
|
||||||
|
#admins can see all available items
|
||||||
return qs
|
return qs
|
||||||
|
|
|
@ -12,6 +12,7 @@ from django.db import models
|
||||||
from django.core.files.base import ContentFile
|
from django.core.files.base import ContentFile
|
||||||
from django.utils import simplejson as json
|
from django.utils import simplejson as json
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.contrib.auth.models import User, Group
|
||||||
|
|
||||||
import ox
|
import ox
|
||||||
from ox.django import fields
|
from ox.django import fields
|
||||||
|
@ -89,9 +90,14 @@ class Item(models.Model):
|
||||||
modified = models.DateTimeField(auto_now=True)
|
modified = models.DateTimeField(auto_now=True)
|
||||||
published = models.DateTimeField(default=datetime.now, editable=False)
|
published = models.DateTimeField(default=datetime.now, editable=False)
|
||||||
|
|
||||||
|
user = models.ForeignKey(User, related_name='items')
|
||||||
|
groups = models.ManyToManyField(Group, related_name='items')
|
||||||
|
|
||||||
#only items that have data from files are available,
|
#only items that have data from files are available,
|
||||||
#this is indicated by setting available to True
|
#this is indicated by setting available to True
|
||||||
available = models.BooleanField(default=False, db_index=True)
|
available = models.BooleanField(default=False, db_index=True)
|
||||||
|
public = models.BooleanField(default=False, db_index=True)
|
||||||
|
|
||||||
itemId = models.CharField(max_length=128, unique=True, blank=True)
|
itemId = models.CharField(max_length=128, unique=True, blank=True)
|
||||||
oxdbId = models.CharField(max_length=42, unique=True, blank=True)
|
oxdbId = models.CharField(max_length=42, unique=True, blank=True)
|
||||||
external_data = fields.DictField(default={}, editable=False)
|
external_data = fields.DictField(default={}, editable=False)
|
||||||
|
@ -118,15 +124,27 @@ class Item(models.Model):
|
||||||
return default
|
return default
|
||||||
|
|
||||||
def editable(self, user):
|
def editable(self, user):
|
||||||
#FIXME: make permissions work
|
if user.is_staff or \
|
||||||
|
self.user == user or \
|
||||||
|
self.groups.filter(id__in=user.groups.all()).count() > 0:
|
||||||
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def edit(self, data):
|
def edit(self, data):
|
||||||
#FIXME: how to map the keys to the right place to write them to?
|
#FIXME: how to map the keys to the right place to write them to?
|
||||||
|
if 'id' in data:
|
||||||
|
#FIXME: check if id is valid and exists and move/merge items accordingly
|
||||||
|
del data['id']
|
||||||
|
if 'id' in data:
|
||||||
|
groups = data.pop('groups')
|
||||||
|
self.groups.exclude(name__in=groups).delete()
|
||||||
|
for g in groups:
|
||||||
|
group, created = Group.objects.get_or_create(name=g)
|
||||||
|
self.groups.add(group)
|
||||||
for key in data:
|
for key in data:
|
||||||
if key != 'id':
|
if key != 'id':
|
||||||
setattr(self.data, key, data[key])
|
setattr(self.data, key, data[key])
|
||||||
self.oxdb.save()
|
self.data.save()
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
def reviews(self):
|
def reviews(self):
|
||||||
|
|
|
@ -62,7 +62,7 @@ def _parse_query(data, user):
|
||||||
query = {}
|
query = {}
|
||||||
query['range'] = [0, 100]
|
query['range'] = [0, 100]
|
||||||
query['sort'] = [{'key':'title', 'operator':'+'}]
|
query['sort'] = [{'key':'title', 'operator':'+'}]
|
||||||
for key in ('sort', 'keys', 'group', 'list', 'range', 'ids'):
|
for key in ('sort', 'keys', 'group', 'range', 'ids'):
|
||||||
if key in data:
|
if key in data:
|
||||||
query[key] = data[key]
|
query[key] = data[key]
|
||||||
query['qs'] = models.Item.objects.find(data, user)
|
query['qs'] = models.Item.objects.find(data, user)
|
||||||
|
|
|
@ -89,11 +89,8 @@ def get_user_json(user):
|
||||||
result = {}
|
result = {}
|
||||||
for key in ('username', ):
|
for key in ('username', ):
|
||||||
result[key] = getattr(user, key)
|
result[key] = getattr(user, key)
|
||||||
result['group'] = 'user'
|
result['admin'] = user.is_staff
|
||||||
if user.is_staff:
|
result['groups'] = [g.name for g in user.groups.all()]
|
||||||
result['group'] = 'admin'
|
|
||||||
elif user.has_perm('0x.vip'): #FIXME: permissions
|
|
||||||
result['group'] = 'vip'
|
|
||||||
result['preferences'] = profile.get_preferences()
|
result['preferences'] = profile.get_preferences()
|
||||||
result['ui'] = profile.get_ui()
|
result['ui'] = profile.get_ui()
|
||||||
return result
|
return result
|
||||||
|
|
Loading…
Reference in a new issue