--- a/src/ldt/ldt/api/ldt/resources/__init__.py Tue Nov 06 11:57:19 2012 +0100
+++ b/src/ldt/ldt/api/ldt/resources/__init__.py Tue Nov 06 13:56:54 2012 +0100
@@ -2,5 +2,6 @@
from content import ContentResource
from project import ProjectResource
from segment import SegmentResource
+from user import UserResource
-__all__ = ["AnnotationResource", "ContentResource", "ProjectResource", "SegmentResource"]
+__all__ = ["AnnotationResource", "ContentResource", "ProjectResource", "SegmentResource", "UserResource"]
--- a/src/ldt/ldt/api/ldt/resources/project.py Tue Nov 06 11:57:19 2012 +0100
+++ b/src/ldt/ldt/api/ldt/resources/project.py Tue Nov 06 13:56:54 2012 +0100
@@ -1,14 +1,19 @@
from django.conf.urls.defaults import url
from ldt.ldt_utils.models import Project
from ldt.api.ldt.serializers.cinelabserializer import CinelabSerializer
+from ldt.api.ldt.resources import ContentResource
+from ldt.api.ldt.resources.user import UserResource
from tastypie.authorization import Authorization
from tastypie.resources import Bundle, ModelResource
-
+from tastypie import fields
+from ldt.security import protect_models, unprotect_models
class ProjectResource(ModelResource):
+ contents = fields.ManyToManyField(ContentResource, 'contents')
+ owner = fields.ForeignKey(UserResource, 'owner')
class Meta:
allowed_methods = ['get', 'post']
- authorization= Authorization() # BE CAREFUL WITH THAT, it's unsecure
+ authorization = Authorization() # BE CAREFUL WITH THAT, it's unsecure
resource_name = 'projects'
queryset = Project.objects.all()
serializer = CinelabSerializer()
@@ -35,4 +40,10 @@
else:
kwargs['ldt_id'] = bundle_or_obj.ldt_id
return self._build_reverse_url("api_dispatch_detail", kwargs=kwargs)
+
+ # TEMPORARY (used before authentication/authorization, because saving a project modifies a Content (via ContentStat))
+ def save_m2m(self, bundle):
+ unprotect_models()
+ super(ProjectResource, self).save_m2m(bundle)
+ protect_models()
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ldt/ldt/api/ldt/resources/user.py Tue Nov 06 13:56:54 2012 +0100
@@ -0,0 +1,26 @@
+from django.contrib.auth.models import User
+from django.conf.urls.defaults import url
+from tastypie.resources import Bundle, ModelResource
+
+class UserResource(ModelResource):
+ class Meta:
+ allowed_methods = ['get']
+ queryset = User.objects.all()
+ resource_name = 'users'
+
+ def override_urls(self):
+ # WARNING : in tastypie <= 1.0, override_urls is used instead of prepend_urls. From 1.0.0, prepend_urls will be prefered and override_urls deprecated
+ return [
+ url(r"^(?P<resource_name>%s)/(?P<username>[\w\d_.-]+)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
+ ]
+
+ def get_resource_uri(self, bundle_or_obj):
+ kwargs = {
+ 'resource_name': self._meta.resource_name,
+ 'api_name': self._meta.api_name
+ }
+ if isinstance(bundle_or_obj, Bundle):
+ kwargs['username'] = bundle_or_obj.obj.username
+ else:
+ kwargs['username'] = bundle_or_obj.username
+ return self._build_reverse_url("api_dispatch_detail", kwargs=kwargs)
\ No newline at end of file
--- a/src/ldt/ldt/api/ldt/serializers/cinelabserializer.py Tue Nov 06 11:57:19 2012 +0100
+++ b/src/ldt/ldt/api/ldt/serializers/cinelabserializer.py Tue Nov 06 13:56:54 2012 +0100
@@ -1,9 +1,12 @@
from django.core.serializers import json
+from django.core.urlresolvers import reverse
from django.utils import simplejson
from ldt.ldt_utils.models import Project
from ldt.ldt_utils.projectserializer import ProjectJsonSerializer
+from ldt.ldt_utils.utils import generate_uuid
from tastypie.serializers import Serializer
from tastypie.exceptions import NotFound
+import lxml.etree
import logging
@@ -24,9 +27,10 @@
def to_cinelab(self, data, options=None):
"""
- Given some Python data, produces JSON output.
+ Given some Python data, produces Cinelab/JSON output.
+ N.B. : for the moment, this serializer works with api_dispatch_detail only.
+ It does not work with api_dispatch_list. Only from_cinelab deals with api_dispatch_list's multiple objects like {"objects":[...]}
"""
- logging.debug("TO cinelab data " + repr(data))
options = options or {}
if hasattr(data, 'obj') :
if isinstance(data.obj, Project) :
@@ -39,8 +43,32 @@
def from_cinelab(self, content):
"""
This function takes cinelab/json and transform it into a regular REST API json project data.
+ All fields are (* required at rebuilt json) :
+ "changed_by": "admin",
+ "created_by": "admin",
+ "creation_date": "2012-02-11T01:18:48.028534",
+ "description": "",
+ "image": "/pf/static/media/thumbnails/contents/content_default_icon.png",
+ "ldt*": "<iri><project>...<medias>...<annotations>...<displays>...<edits>...</iri>",
+ "ldt_id*": "594dc612-544e-11e1-96e5-00145ea49a02",
+ "modification_date": "2012-02-11T01:19:40.203322",
+ "state": 2,
+ "title*": "front project : test DailyMotion"
+ "contents": ["IRI_ID_1","IRI_ID_2"]
"""
logging.debug("FROM cinelab content = " + content)
- #a = simplejson.loads(content)
- logging.debug("msg")
- return simplejson.loads(content)
\ No newline at end of file
+
+ cinelab = simplejson.loads(content)
+ meta = cinelab["meta"]
+ ldt_id = generate_uuid()
+ contents = [reverse("api_dispatch_detail", kwargs={"api_name":"1.0", "resource_name":"contents", "iri_id":c["id"]}) for c in cinelab["medias"]]
+ owner_uri = reverse("api_dispatch_detail", kwargs={"api_name":"1.0", "resource_name":"users", "username":meta["dc:creator"]})
+ s = {"description": meta["dc:description"], "ldt_id": "000_GEN_BY_TC3", "title": meta["dc:title"],
+ "created_by": meta["dc:creator"], "changed_by": meta["dc:contributor"], "created_by": meta["dc:creator"], "changed_by": meta["dc:contributor"],
+ "contents": contents, "owner": owner_uri}
+
+ #s = '{"description": "", "ldt": "<iri><project/><medias/><annotations/><displays/><edits/></iri>", "000ldt_id": "gen_by_tc","title": "aaa GEN BY TC"}'
+ #s = '{"description": "", "ldt": "<iri><project/><medias/><annotations/><displays/><edits/></iri>", "title": "aaaGEN BY TC"}'
+ return simplejson.loads(simplejson.dumps(s))
+
+
\ No newline at end of file
--- a/src/ldt/ldt/api/ldt/urls.py Tue Nov 06 11:57:19 2012 +0100
+++ b/src/ldt/ldt/api/ldt/urls.py Tue Nov 06 13:56:54 2012 +0100
@@ -1,5 +1,5 @@
from django.conf.urls.defaults import patterns, include
-from ldt.api.ldt.resources import ProjectResource, ContentResource, SegmentResource, AnnotationResource
+from ldt.api.ldt.resources import ProjectResource, ContentResource, SegmentResource, AnnotationResource, UserResource
from tastypie.api import Api
v1_api = Api(api_name='1.0')
@@ -7,6 +7,7 @@
v1_api.register(ContentResource())
v1_api.register(SegmentResource())
v1_api.register(AnnotationResource())
+v1_api.register(UserResource())
urlpatterns = patterns('',
(r'', include(v1_api.urls)),