correct rest api resource after tastypie and django update.
authorymh <ymh.work@gmail.com>
Fri, 24 May 2013 02:20:46 +0200
changeset 1194 8e20df96315b
parent 1193 cd67b17d257d
child 1195 81e5be7f10f9
correct rest api resource after tastypie and django update. Find a way to go around django bugs with ~ in urls
src/ldt/ldt/api/ldt/resources/annotation.py
src/ldt/ldt/api/ldt/resources/content.py
src/ldt/ldt/api/ldt/resources/project.py
src/ldt/ldt/api/ldt/resources/segment.py
src/ldt/ldt/api/ldt/resources/tag.py
src/ldt/ldt/api/ldt/resources/user.py
src/ldt/ldt/api/ldt/serializers/cinelabserializer.py
src/ldt/ldt/utils/url.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
--- 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<resource_name>%s)/recommended/$" % self._meta.resource_name, self.wrap_view('get_recommended'), name="api_contents_recommended"),
             url(r"^(?P<resource_name>%s)/(?P<iri_id>[\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
--- 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<resource_name>%s)/(?P<ldt_id>[\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.")
     
     
--- 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<resource_name>%s)/search%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_search'), name="api_get_search"),
             url(r"^(?P<resource_name>%s)/bytimecode%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_segments_by_timecode'), name='segment_api_empty'),
--- 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<resource_name>%s)/search%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_search'), name="api_get_search"),
         ]
--- 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<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):
+    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
--- 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)
         
--- 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