# HG changeset patch # User cavaliet # Date 1352206614 -3600 # Node ID e76df6d34e6f3f1adaef9e4eaa8bc7e8fde94249 # Parent c430d169ecc33f482dbf4461bdf88fce525ec238# Parent bd5f9dea97910caae6c2fb1ef8fc2e119e47d248 Merge with bd5f9dea97910caae6c2fb1ef8fc2e119e47d248 diff -r bd5f9dea9791 -r e76df6d34e6f src/ldt/ldt/api/ldt/resources/__init__.py --- 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"] diff -r bd5f9dea9791 -r e76df6d34e6f src/ldt/ldt/api/ldt/resources/project.py --- 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 diff -r bd5f9dea9791 -r e76df6d34e6f src/ldt/ldt/api/ldt/resources/user.py --- /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%s)/(?P[\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 diff -r bd5f9dea9791 -r e76df6d34e6f src/ldt/ldt/api/ldt/serializers/cinelabserializer.py --- 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*": "...............", + "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": "", "000ldt_id": "gen_by_tc","title": "aaa GEN BY TC"}' + #s = '{"description": "", "ldt": "", "title": "aaaGEN BY TC"}' + return simplejson.loads(simplejson.dumps(s)) + + \ No newline at end of file diff -r bd5f9dea9791 -r e76df6d34e6f src/ldt/ldt/api/ldt/urls.py --- 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)),