correct rest api resource after tastypie and django update.
Find a way to go around django bugs with ~ in urls
--- 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