# HG changeset patch # User ymh # Date 1369354846 -7200 # Node ID 8e20df96315b8a411c8b1cb3af576296c7b991c9 # Parent cd67b17d257dae9e663c5fde6a035821597a1b15 correct rest api resource after tastypie and django update. Find a way to go around django bugs with ~ in urls diff -r cd67b17d257d -r 8e20df96315b src/ldt/ldt/api/ldt/resources/annotation.py --- a/src/ldt/ldt/api/ldt/resources/annotation.py Thu May 23 00:17:02 2013 +0200 +++ b/src/ldt/ldt/api/ldt/resources/annotation.py Fri May 24 02:20:46 2013 +0200 @@ -44,11 +44,10 @@ always_return_data = True include_resource_uri = False - def obj_delete_list(self, request=None, **kwargs): + def obj_delete_list(self, bundle, **kwargs): return True - def obj_create(self, bundle, request=None, **kwargs): - #logging.debug("ICI 0-1 bundle.data = " + repr(bundle.data)) + def obj_create(self, bundle, **kwargs): # Here the a has the datas for only one annotation. Tastypie's post allows only one resource addition a = bundle.data project_id = "" @@ -126,7 +125,7 @@ bundle.obj = AnnotationObject(id = a["id"], project = a["project"], type = a["type"], type_title = a["type_title"], ensemble=a['ensemble'], media = a["media"], begin = a["begin"], end = a["end"], content = a['content'], tags = a['tags'], meta = a['meta']) return bundle - def get_resource_uri(self, bundle_or_obj): + def get_resource_uri(self, bundle_or_obj=None, url_name='api_dispatch_list'): return '' \ No newline at end of file diff -r cd67b17d257d -r 8e20df96315b src/ldt/ldt/api/ldt/resources/content.py --- a/src/ldt/ldt/api/ldt/resources/content.py Thu May 23 00:17:02 2013 +0200 +++ b/src/ldt/ldt/api/ldt/resources/content.py Fri May 24 02:20:46 2013 +0200 @@ -12,8 +12,10 @@ resource_name = 'medias' queryset = Media.objects.all() - def get_resource_uri(self, bundle_or_obj): - if isinstance(bundle_or_obj, Bundle): + def get_resource_uri(self, bundle_or_obj=None, url_name='api_dispatch_list'): + if not bundle_or_obj: + return super(MediaResource, self).get_resource_uri(bundle_or_obj,url_name) + elif isinstance(bundle_or_obj, Bundle): return bundle_or_obj.obj.videopath + bundle_or_obj.obj.stream_src else: return bundle_or_obj.videopath + bundle_or_obj.stream_src @@ -36,13 +38,15 @@ def get_object_list(self, request): return Content.safe_objects.select_related('front_project', 'media_obj').all() - 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 + def prepend_urls(self): return [ url(r"^(?P%s)/recommended/$" % self._meta.resource_name, self.wrap_view('get_recommended'), name="api_contents_recommended"), 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): + + def get_resource_uri(self, bundle_or_obj=None, url_name='api_dispatch_list'): + if bundle_or_obj is None: + return super(ContentResource, self).get_resource_uri(bundle_or_obj, url_name) kwargs = { 'resource_name': self._meta.resource_name, 'api_name': self._meta.api_name diff -r cd67b17d257d -r 8e20df96315b src/ldt/ldt/api/ldt/resources/project.py --- a/src/ldt/ldt/api/ldt/resources/project.py Thu May 23 00:17:02 2013 +0200 +++ b/src/ldt/ldt/api/ldt/resources/project.py Fri May 24 02:20:46 2013 +0200 @@ -39,13 +39,14 @@ def get_object_list(self, request): return Project.safe_objects.all() - 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 + def prepend_urls(self): 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): + def get_resource_uri(self, bundle_or_obj=None, url_name='api_dispatch_list'): + if bundle_or_obj is None: + return super(ProjectResource, self).get_resource_uri(bundle_or_obj,url_name) kwargs = { 'resource_name': self._meta.resource_name, 'api_name': self._meta.api_name @@ -57,9 +58,12 @@ return self._build_reverse_url("api_dispatch_detail", kwargs=kwargs) # Create a new project. Used with post_detail and with no ldt_id in the url - def obj_create(self, bundle, request=None, **kwargs): + def obj_create(self, bundle, **kwargs): + request = bundle.request + if request is None: + raise BadRequest("Request object must be passed as an argument") unprotect_models() - bundle = super(ProjectResource, self).obj_create(bundle, request) + bundle = super(ProjectResource, self).obj_create(bundle, **kwargs) # Assign permission for the owner assign('view_project', request.user, bundle.obj) assign('change_project', request.user, bundle.obj) @@ -71,7 +75,7 @@ # Prevent for put_list and delete all objects. - def obj_delete_list(self, request=None, **kwargs): + def obj_delete_list(self, bundle, **kwargs): raise BadRequest("PUT with a list of projects is forbidden.") diff -r cd67b17d257d -r 8e20df96315b src/ldt/ldt/api/ldt/resources/segment.py --- a/src/ldt/ldt/api/ldt/resources/segment.py Thu May 23 00:17:02 2013 +0200 +++ b/src/ldt/ldt/api/ldt/resources/segment.py Fri May 24 02:20:46 2013 +0200 @@ -28,8 +28,7 @@ # def determine_format(self, request): # return "application/json" - def override_urls(self): - # WARNING : in tastypie <= 0.9.11, override_urls is used instead of prepend_urls. From 0.9.12, prepend_urls will be prefered and override_urls deprecated + def prepend_urls(self): return [ url(r"^(?P%s)/search%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_search'), name="api_get_search"), url(r"^(?P%s)/bytimecode%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_segments_by_timecode'), name='segment_api_empty'), diff -r cd67b17d257d -r 8e20df96315b src/ldt/ldt/api/ldt/resources/tag.py --- a/src/ldt/ldt/api/ldt/resources/tag.py Thu May 23 00:17:02 2013 +0200 +++ b/src/ldt/ldt/api/ldt/resources/tag.py Fri May 24 02:20:46 2013 +0200 @@ -14,8 +14,7 @@ resource_name = 'tags' queryset = Tag.objects.all() - def override_urls(self): - # WARNING : in tastypie <= 0.9.11, override_urls is used instead of prepend_urls. From 0.9.12, prepend_urls will be prefered and override_urls deprecated + def prepend_urls(self): return [ url(r"^(?P%s)/search%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_search'), name="api_get_search"), ] diff -r cd67b17d257d -r 8e20df96315b src/ldt/ldt/api/ldt/resources/user.py --- a/src/ldt/ldt/api/ldt/resources/user.py Thu May 23 00:17:02 2013 +0200 +++ b/src/ldt/ldt/api/ldt/resources/user.py Fri May 24 02:20:46 2013 +0200 @@ -10,13 +10,14 @@ 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 + def prepend_urls(self): 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): + def get_resource_uri(self, bundle_or_obj=None, url_name='api_dispatch_list'): + if bundle_or_obj is None: + return super(UserResource, self).get_resource_uri(bundle_or_obj, url_name) kwargs = { 'resource_name': self._meta.resource_name, 'api_name': self._meta.api_name diff -r cd67b17d257d -r 8e20df96315b src/ldt/ldt/api/ldt/serializers/cinelabserializer.py --- a/src/ldt/ldt/api/ldt/serializers/cinelabserializer.py Thu May 23 00:17:02 2013 +0200 +++ b/src/ldt/ldt/api/ldt/serializers/cinelabserializer.py Fri May 24 02:20:46 2013 +0200 @@ -1,15 +1,15 @@ from django.conf import settings from django.core.serializers import json -from django.core.urlresolvers import reverse from django.utils import simplejson from ldt.ldt_utils.models import Content, Project from ldt.ldt_utils.projectserializer import ProjectJsonSerializer from ldt.ldt_utils.utils import generate_uuid +from ldt.utils.url import reverse_prefix from tastypie.exceptions import NotFound, BadRequest from tastypie.serializers import Serializer import lxml.etree import math - + class CinelabSerializer(Serializer): # Thanks to the this serializer, the api will be able to serialize and deserialize a project in cinelab json format @@ -67,8 +67,9 @@ ldt_id = generate_uuid() # default state = (1, 'edition') OR (2, 'published') state = 2 - 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"]}) + + contents = [reverse_prefix("api_dispatch_detail", kwargs={"api_name":"1.0", "resource_name":"contents", "iri_id":c["id"]}) for c in cinelab["medias"]] + owner_uri = reverse_prefix("api_dispatch_detail", kwargs={"api_name":"1.0", "resource_name":"users", "username":meta["dc:creator"]}) ldt = lxml.etree.tostring(self.cinelab_to_ldt(cinelab), pretty_print=True) diff -r cd67b17d257d -r 8e20df96315b src/ldt/ldt/utils/url.py --- a/src/ldt/ldt/utils/url.py Thu May 23 00:17:02 2013 +0200 +++ b/src/ldt/ldt/utils/url.py Fri May 24 02:20:46 2013 +0200 @@ -1,11 +1,13 @@ from django.contrib.staticfiles.storage import staticfiles_storage -from django.core.urlresolvers import reverse +from django.core.urlresolvers import reverse, get_script_prefix +from django.utils.encoding import iri_to_uri from ldt.utils.web_url_management import get_web_url from ldt import settings from django.conf import settings as djangosettings import httplib2 import re import urlparse +from django.utils.http import urlquote def static(path): return staticfiles_storage.url(path) @@ -45,4 +47,19 @@ def is_absolute(url): - return bool(urlparse.urlparse(url).scheme) \ No newline at end of file + return bool(urlparse.urlparse(url).scheme) + +### +# +# +def reverse_prefix(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None): + + url = reverse(viewname,urlconf,args,kwargs,prefix,current_app) + prefix = get_script_prefix() + quoted_prefix = urlquote(prefix) + clean_prefix = iri_to_uri(prefix) + + if url.startswith(quoted_prefix): + return clean_prefix + url[len(quoted_prefix):] + else: + return url