forked from 0x2620/pandora
editable, getFileInfo, getItem, templates
This commit is contained in:
parent
228cb1f851
commit
2bff8f8045
7 changed files with 109 additions and 60 deletions
|
@ -162,6 +162,18 @@ class Movie(models.Model):
|
|||
return getattr(self.imdb, key)
|
||||
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'):
|
||||
if qs.filter(**{f:True}).count() > 0:
|
||||
return qs.exclude(**{f:False})
|
||||
|
@ -966,6 +978,10 @@ class List(models.Model):
|
|||
def __unicode__(self):
|
||||
return u'%s (%s)' % (self.title, unicode(self.user))
|
||||
|
||||
def editable(user):
|
||||
#FIXME: make permissions work
|
||||
return False
|
||||
|
||||
class ListItem(models.Model):
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
modified = models.DateTimeField(auto_now=True)
|
||||
|
@ -1007,8 +1023,8 @@ class File(models.Model):
|
|||
|
||||
type = models.IntegerField(default=0, choices=FILE_TYPES)
|
||||
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)
|
||||
size = models.BigIntegerField(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
|
||||
return
|
||||
|
||||
def editable(user):
|
||||
#FIXME: make permissions work
|
||||
return False
|
||||
|
||||
class Still(models.Model):
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
modified = models.DateTimeField(auto_now=True)
|
||||
|
@ -1127,29 +1147,6 @@ class Still(models.Model):
|
|||
def __unicode__(self):
|
||||
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):
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
modified = models.DateTimeField(auto_now=True)
|
||||
|
@ -1163,8 +1160,14 @@ class Layer(models.Model):
|
|||
type = models.CharField(blank=True, max_length=255)
|
||||
value = models.TextField()
|
||||
|
||||
#FIXME: relational layers, Locations, clips etc
|
||||
#location = models.ForeignKey('Location', default=None)
|
||||
|
||||
def editable(user):
|
||||
#FIXME: make permissions work
|
||||
return False
|
||||
|
||||
|
||||
class Archive(models.Model):
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
modified = models.DateTimeField(auto_now=True)
|
||||
|
@ -1175,6 +1178,11 @@ class Archive(models.Model):
|
|||
def __unicode__(self):
|
||||
return '%s' % (self.name)
|
||||
|
||||
def editable(user):
|
||||
#FIXME: make permissions work
|
||||
return False
|
||||
|
||||
|
||||
class ArchiveFile(models.Model):
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
modified = models.DateTimeField(auto_now=True)
|
||||
|
|
|
@ -18,7 +18,7 @@ try:
|
|||
import simplejson as json
|
||||
except ImportError:
|
||||
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
|
||||
|
||||
import models
|
||||
|
@ -199,35 +199,50 @@ def api_find(request):
|
|||
|
||||
def api_getItem(request):
|
||||
'''
|
||||
api('getItem', id)
|
||||
return item with id
|
||||
param data
|
||||
string id
|
||||
|
||||
return item dict
|
||||
'''
|
||||
response = {'status': {'code': 200, 'text': 'ok'}}
|
||||
itemId = json.loads(request.POST['data'])
|
||||
item = models.Movie.objects.get(movieId=itemId)
|
||||
response['item'] = item.json()
|
||||
item = get_object_or_404_json(models.Movie, movieId=itemId)
|
||||
#FIXME: check permissions
|
||||
response['data'] = {'item': item.json}
|
||||
return render_to_json_response(response)
|
||||
|
||||
@login_required_json
|
||||
def api_editItem(request):
|
||||
'''
|
||||
param data
|
||||
{key: value}
|
||||
{id: string, key: value,..}
|
||||
return {'status': {'code': int, 'text': string},
|
||||
'data': {}}
|
||||
'''
|
||||
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)
|
||||
|
||||
@login_required_json
|
||||
def api_removeItem(request):
|
||||
'''
|
||||
param data
|
||||
{key: value}
|
||||
return {'status': {'code': int, 'text': string},
|
||||
'data': {}}
|
||||
string id
|
||||
|
||||
return {'status': {'code': int, 'text': string}}
|
||||
'''
|
||||
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)
|
||||
|
||||
@login_required_json
|
||||
|
@ -260,6 +275,15 @@ def api_editLayer(request):
|
|||
return {'status': {'code': int, 'text': string},
|
||||
'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'}}
|
||||
return render_to_json_response(response)
|
||||
|
||||
|
@ -368,6 +392,10 @@ def api_upload(request): #video, timeline, frame
|
|||
return {'status': {'code': int, 'text': string},
|
||||
'data': {}}
|
||||
'''
|
||||
data = json.loads(request.POST['data'])
|
||||
if data['item'] == 'timeline':
|
||||
print "not implemented"
|
||||
|
||||
response = {'status': {'code': 500, 'text': 'not implemented'}}
|
||||
return render_to_json_response(response)
|
||||
|
||||
|
@ -406,33 +434,21 @@ def api_getImdbId(request):
|
|||
response = {'status': {'code': 404, 'text': 'not found'}}
|
||||
return render_to_json_response(response)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#FIXME: old stuff below...
|
||||
def api_getFileInfo(request):
|
||||
'''
|
||||
GET info?oshash=a41cde31c581e11d
|
||||
> {
|
||||
"movie_id": 0123456, ??
|
||||
"oshash": "a41cde31c581e11d",
|
||||
"sha1":..,
|
||||
"md5":..
|
||||
"duration": 5.266667,
|
||||
"video": [],
|
||||
"audio": [],
|
||||
"path": "E/Example, The/An Example.avi",
|
||||
"size": 1646274
|
||||
}
|
||||
param data
|
||||
oshash string
|
||||
return {'status': {'code': int, 'text': string},
|
||||
'data': {imdbId:string }}
|
||||
'''
|
||||
def file_info(request):
|
||||
if 'data' in request.POST:
|
||||
oshash = json.loads(request.POST['data'])
|
||||
elif 'oshash' in request.GET:
|
||||
oshash = request.GET['oshash']
|
||||
f = models.MovieFile.objects.get(oshash=oshash)
|
||||
response = f.json()
|
||||
response = {'data': f.json()}
|
||||
return render_to_json_response(response)
|
||||
|
||||
|
||||
'''
|
||||
GET subtitles?oshash=a41cde31c581e11d
|
||||
> {
|
||||
|
|
|
@ -40,4 +40,3 @@ def setPreference(user, key, value):
|
|||
else:
|
||||
p = Preference(user=user, key=key, value=value)
|
||||
p.save()
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ PROJECT_ROOT = os.path.normpath(os.path.dirname(__file__))
|
|||
|
||||
DEBUG = True
|
||||
TEMPLATE_DEBUG = DEBUG
|
||||
JSON_DEBUG = False
|
||||
|
||||
ADMINS = (
|
||||
# ('Your Name', 'your_email@domain.com'),
|
||||
|
|
2
oxdb/templates/404.html
Normal file
2
oxdb/templates/404.html
Normal file
|
@ -0,0 +1,2 @@
|
|||
{'status': {'code': 404, 'text': 'not found'}}
|
||||
|
1
oxdb/templates/500.html
Normal file
1
oxdb/templates/500.html
Normal file
|
@ -0,0 +1 @@
|
|||
500 error
|
22
oxdb/templates/api.html
Normal file
22
oxdb/templates/api.html
Normal 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>
|
Loading…
Reference in a new issue