diff --git a/oxdb/backend/models.py b/oxdb/backend/models.py index caf3f28a..6161c103 100644 --- a/oxdb/backend/models.py +++ b/oxdb/backend/models.py @@ -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) diff --git a/oxdb/backend/views.py b/oxdb/backend/views.py index 5374f888..9dbc8e94 100644 --- a/oxdb/backend/views.py +++ b/oxdb/backend/views.py @@ -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': {}} ''' - 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) @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': 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) @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... -''' -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 - } -''' -def file_info(request): - oshash = request.GET['oshash'] +def api_getFileInfo(request): + ''' + param data + oshash string + return {'status': {'code': int, 'text': string}, + 'data': {imdbId:string }} + ''' + 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 > { diff --git a/oxdb/oxuser/models.py b/oxdb/oxuser/models.py index aa14d662..662a4a39 100644 --- a/oxdb/oxuser/models.py +++ b/oxdb/oxuser/models.py @@ -40,4 +40,3 @@ def setPreference(user, key, value): else: p = Preference(user=user, key=key, value=value) p.save() - diff --git a/oxdb/settings.py b/oxdb/settings.py index c67eb309..60ad3d64 100644 --- a/oxdb/settings.py +++ b/oxdb/settings.py @@ -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'), diff --git a/oxdb/templates/404.html b/oxdb/templates/404.html new file mode 100644 index 00000000..4b95b1e0 --- /dev/null +++ b/oxdb/templates/404.html @@ -0,0 +1,2 @@ +{'status': {'code': 404, 'text': 'not found'}} + diff --git a/oxdb/templates/500.html b/oxdb/templates/500.html new file mode 100644 index 00000000..0ee00ad0 --- /dev/null +++ b/oxdb/templates/500.html @@ -0,0 +1 @@ +500 error diff --git a/oxdb/templates/api.html b/oxdb/templates/api.html new file mode 100644 index 00000000..2dce85f1 --- /dev/null +++ b/oxdb/templates/api.html @@ -0,0 +1,22 @@ + + + + 0xdb.org API + + + + +

Public API

+ look inside +
+ {% for f in api %} +
+

function: {{f.name}}

+
+{{f.doc|safe}}
+			
+
+ {% endfor %} +
+ +