Prepare Project POST api.
authorcavaliet
Tue, 06 Nov 2012 13:55:56 +0100
changeset 894 c430d169ecc3
parent 891 c45987bbfb4e
child 895 e76df6d34e6f
Prepare Project POST api.
src/ldt/ldt/api/ldt/resources/__init__.py
src/ldt/ldt/api/ldt/resources/project.py
src/ldt/ldt/api/ldt/resources/user.py
src/ldt/ldt/api/ldt/serializers/cinelabserializer.py
src/ldt/ldt/api/ldt/urls.py
--- a/src/ldt/ldt/api/ldt/resources/__init__.py	Mon Nov 05 19:15:12 2012 +0100
+++ b/src/ldt/ldt/api/ldt/resources/__init__.py	Tue Nov 06 13:55:56 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	Mon Nov 05 19:15:12 2012 +0100
+++ b/src/ldt/ldt/api/ldt/resources/project.py	Tue Nov 06 13:55:56 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:55:56 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	Mon Nov 05 19:15:12 2012 +0100
+++ b/src/ldt/ldt/api/ldt/serializers/cinelabserializer.py	Tue Nov 06 13:55:56 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	Mon Nov 05 19:15:12 2012 +0100
+++ b/src/ldt/ldt/api/ldt/urls.py	Tue Nov 06 13:55:56 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)),