editable, getFileInfo, getItem, templates

This commit is contained in:
j 2010-01-27 12:13:17 +05:30
parent 228cb1f851
commit 2bff8f8045
7 changed files with 109 additions and 60 deletions

View file

@ -162,6 +162,18 @@ class Movie(models.Model):
return getattr(self.imdb, key) return getattr(self.imdb, key)
return default return default
def editable(user):
#FIXME: make permissions work
return False
def edit(self, data):
#FIXME: how to map the keys to the right place to write them to?
for key in data:
if key != 'id':
setattr(self.oxdb, key, data[key])
self.oxdb.save()
self.save()
def _manual(self, qs, f='manual'): def _manual(self, qs, f='manual'):
if qs.filter(**{f:True}).count() > 0: if qs.filter(**{f:True}).count() > 0:
return qs.exclude(**{f:False}) return qs.exclude(**{f:False})
@ -966,6 +978,10 @@ class List(models.Model):
def __unicode__(self): def __unicode__(self):
return u'%s (%s)' % (self.title, unicode(self.user)) return u'%s (%s)' % (self.title, unicode(self.user))
def editable(user):
#FIXME: make permissions work
return False
class ListItem(models.Model): class ListItem(models.Model):
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)
@ -1007,8 +1023,8 @@ class File(models.Model):
type = models.IntegerField(default=0, choices=FILE_TYPES) type = models.IntegerField(default=0, choices=FILE_TYPES)
info = fields.DictField(default={}) info = fields.DictField(default={})
#FIMXE: why do i need those in the db? could jsut have them in info
#FIXME: why do i need those in the db? could just have them in info
path = models.CharField(blank=True, max_length=2048) path = models.CharField(blank=True, max_length=2048)
size = models.BigIntegerField(default=-1) size = models.BigIntegerField(default=-1)
duration = models.FloatField(default=-1) duration = models.FloatField(default=-1)
@ -1117,6 +1133,10 @@ class File(models.Model):
#FIXME: do stuff, like create timeline or create smaller videos etc #FIXME: do stuff, like create timeline or create smaller videos etc
return return
def editable(user):
#FIXME: make permissions work
return False
class Still(models.Model): class Still(models.Model):
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)
@ -1127,29 +1147,6 @@ class Still(models.Model):
def __unicode__(self): def __unicode__(self):
return '%s at %s' % (self.file, self.position) return '%s at %s' % (self.file, self.position)
class Subtitle(models.Model):
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
user = models.ForeignKey(User)
file = models.ForeignKey(File, related_name="subtitles")
language = models.CharField(max_length=16)
srt = models.TextField(blank=True)
def get_or_create(model, user, oshash, language):
q = model.objects.filter(file__oshash=oshash, language=language, user=user)
if q.count() > 0:
s = q[0]
else:
f = models.File.get_or_create(oshash=oshash)
s = model.objects.create(user=user, language=language, file=f)
s.save()
return s
get_or_create = classmethod(get_or_create)
def __unicode__(self):
return '%s.%s.srt' % (os.path.splitext(self.movie_file.path)[0], self.language)
class Layer(models.Model): class Layer(models.Model):
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)
@ -1163,8 +1160,14 @@ class Layer(models.Model):
type = models.CharField(blank=True, max_length=255) type = models.CharField(blank=True, max_length=255)
value = models.TextField() value = models.TextField()
#FIXME: relational layers, Locations, clips etc
#location = models.ForeignKey('Location', default=None) #location = models.ForeignKey('Location', default=None)
def editable(user):
#FIXME: make permissions work
return False
class Archive(models.Model): class Archive(models.Model):
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)
@ -1175,6 +1178,11 @@ class Archive(models.Model):
def __unicode__(self): def __unicode__(self):
return '%s' % (self.name) return '%s' % (self.name)
def editable(user):
#FIXME: make permissions work
return False
class ArchiveFile(models.Model): class ArchiveFile(models.Model):
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)

View file

@ -18,7 +18,7 @@ try:
import simplejson as json import simplejson as json
except ImportError: except ImportError:
from django.utils import simplejson as json from django.utils import simplejson as json
from oxdjango.shortcuts import render_to_json_response from oxdjango.shortcuts import render_to_json_response, get_object_or_404_json
from oxdjango.decorators import login_required_json from oxdjango.decorators import login_required_json
import models import models
@ -199,35 +199,50 @@ def api_find(request):
def api_getItem(request): def api_getItem(request):
''' '''
api('getItem', id) param data
return item with id string id
return item dict
''' '''
response = {'status': {'code': 200, 'text': 'ok'}} response = {'status': {'code': 200, 'text': 'ok'}}
itemId = json.loads(request.POST['data']) itemId = json.loads(request.POST['data'])
item = models.Movie.objects.get(movieId=itemId) item = get_object_or_404_json(models.Movie, movieId=itemId)
response['item'] = item.json() #FIXME: check permissions
response['data'] = {'item': item.json}
return render_to_json_response(response) return render_to_json_response(response)
@login_required_json @login_required_json
def api_editItem(request): def api_editItem(request):
''' '''
param data param data
{key: value} {id: string, key: value,..}
return {'status': {'code': int, 'text': string}, return {'status': {'code': int, 'text': string},
'data': {}} 'data': {}}
''' '''
response = {'status': {'code': 500, 'text': 'not implemented'}} data = json.loads(request.POST['data'])
item = get_object_or_404_json(models.Movie, movieId=data['id'])
if item.editable(request.user):
response = {'status': {'code': 500, 'text': 'not implemented'}}
item.edit(data)
else:
response = {'status': {'code': 403, 'text': 'permission denied'}}
return render_to_json_response(response) return render_to_json_response(response)
@login_required_json @login_required_json
def api_removeItem(request): def api_removeItem(request):
''' '''
param data param data
{key: value} string id
return {'status': {'code': int, 'text': string},
'data': {}} return {'status': {'code': int, 'text': string}}
''' '''
response = {'status': {'code': 500, 'text': 'not implemented'}} response = {'status': {'code': 200, 'text': 'ok'}}
itemId = json.loads(request.POST['data'])
item = get_object_or_404_json(models.Movie, movieId=itemId)
if item.editable(request.user):
response = {'status': {'code': 500, 'text': 'not implemented'}}
else:
response = {'status': {'code': 403, 'text': 'permission denied'}}
return render_to_json_response(response) return render_to_json_response(response)
@login_required_json @login_required_json
@ -260,6 +275,15 @@ def api_editLayer(request):
return {'status': {'code': int, 'text': string}, return {'status': {'code': int, 'text': string},
'data': {}} 'data': {}}
''' '''
response = {'status': {'code': 200, 'text': 'ok'}}
data = json.loads(request.POST['data'])
layer = get_object_or_404_json(models.Layer, pk=data['id'])
if layer.editable(request.user):
response = {'status': {'code': 500, 'text': 'not implemented'}}
else:
response = {'status': {'code': 403, 'text': 'permission denied'}}
return render_to_json_response(response)
response = {'status': {'code': 500, 'text': 'not implemented'}} response = {'status': {'code': 500, 'text': 'not implemented'}}
return render_to_json_response(response) return render_to_json_response(response)
@ -368,6 +392,10 @@ def api_upload(request): #video, timeline, frame
return {'status': {'code': int, 'text': string}, return {'status': {'code': int, 'text': string},
'data': {}} 'data': {}}
''' '''
data = json.loads(request.POST['data'])
if data['item'] == 'timeline':
print "not implemented"
response = {'status': {'code': 500, 'text': 'not implemented'}} response = {'status': {'code': 500, 'text': 'not implemented'}}
return render_to_json_response(response) return render_to_json_response(response)
@ -406,33 +434,21 @@ def api_getImdbId(request):
response = {'status': {'code': 404, 'text': 'not found'}} response = {'status': {'code': 404, 'text': 'not found'}}
return render_to_json_response(response) return render_to_json_response(response)
def api_getFileInfo(request):
'''
param data
oshash string
return {'status': {'code': int, 'text': string},
#FIXME: old stuff below... 'data': {imdbId:string }}
''' '''
GET info?oshash=a41cde31c581e11d if 'data' in request.POST:
> { oshash = json.loads(request.POST['data'])
"movie_id": 0123456, ?? elif 'oshash' in request.GET:
"oshash": "a41cde31c581e11d", oshash = request.GET['oshash']
"sha1":..,
"md5":..
"duration": 5.266667,
"video": [],
"audio": [],
"path": "E/Example, The/An Example.avi",
"size": 1646274
}
'''
def file_info(request):
oshash = request.GET['oshash']
f = models.MovieFile.objects.get(oshash=oshash) f = models.MovieFile.objects.get(oshash=oshash)
response = f.json() response = {'data': f.json()}
return render_to_json_response(response) return render_to_json_response(response)
''' '''
GET subtitles?oshash=a41cde31c581e11d GET subtitles?oshash=a41cde31c581e11d
> { > {

View file

@ -40,4 +40,3 @@ def setPreference(user, key, value):
else: else:
p = Preference(user=user, key=key, value=value) p = Preference(user=user, key=key, value=value)
p.save() p.save()

View file

@ -8,6 +8,7 @@ PROJECT_ROOT = os.path.normpath(os.path.dirname(__file__))
DEBUG = True DEBUG = True
TEMPLATE_DEBUG = DEBUG TEMPLATE_DEBUG = DEBUG
JSON_DEBUG = False
ADMINS = ( ADMINS = (
# ('Your Name', 'your_email@domain.com'), # ('Your Name', 'your_email@domain.com'),

2
oxdb/templates/404.html Normal file
View file

@ -0,0 +1,2 @@
{'status': {'code': 404, 'text': 'not found'}}

1
oxdb/templates/500.html Normal file
View file

@ -0,0 +1 @@
500 error

22
oxdb/templates/api.html Normal file
View file

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<title>0xdb.org API</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script type="text/javascript" src="/static/js/jquery/jquery.js"></script>
</head>
<body>
<h1>Public API</h1>
<a href="http://code.0xdb.org/oxdb2/annotate/head%3A/oxdb/backend/views.py">look inside</a>
<div>
{% for f in api %}
<div>
<h2><a name="{{f.name}}">function: {{f.name}}</a></h2>
<pre style="padding-left: 24px">
{{f.doc|safe}}
</pre>
</div>
{% endfor %}
</div>
</body>
</html>