image url management.
authorcavaliet
Wed, 29 May 2013 18:40:39 +0200
changeset 59 4f0e84a8fff8
parent 58 9e14b6f964fe
child 60 58f5d9d76fad
image url management.
src/metadatacomposer/urls.py
src/metadatacomposer/views.py
--- a/src/metadatacomposer/urls.py	Wed May 29 18:14:23 2013 +0200
+++ b/src/metadatacomposer/urls.py	Wed May 29 18:40:39 2013 +0200
@@ -4,7 +4,7 @@
     MetadataComposerModalContent, MetadataComposerModalImage,\
     MetadataComposerImagePagination, MetadataComposerModalImageLibrary,\
     MetadataComposerRemoveImage, MetadataComposerRemoveContent,\
-    MetadataComposerRemoveProject
+    MetadataComposerRemoveProject, MetadataComposerImage
 
 urlpatterns = patterns('',
     url(r'^jsi18n/(?P<packages>\S+?)/$', 'django.views.i18n.javascript_catalog', name='jsi18n'),
@@ -12,13 +12,14 @@
     url(r'^(?P<branding>.*)/resourcelist/$', MetadataComposerResourceList.as_view(), name="composer_resource_list"),
     url(r'^(?P<branding>.*)/imagepage/$', MetadataComposerImagePagination.as_view(), name="composer_image_page"),
     url(r'^(?P<branding>.*)/contentpage/$', MetadataComposerContentPagination.as_view(), name="composer_content_page"),
-    url(r'^(?P<branding>.*)/modalcontent/(?P<iri_id>[\w-]+)$', MetadataComposerModalContent.as_view(), name="composer_modal_content"),
+    url(r'^(?P<branding>.*)/modalcontent/(?P<iri_id>[\w-]+)/$', MetadataComposerModalContent.as_view(), name="composer_modal_content"),
     url(r'^(?P<branding>.*)/modalcontent/$', MetadataComposerModalContent.as_view(), name="composer_modal_content"),
     url(r'^(?P<branding>.*)/modalimage/$', MetadataComposerModalImage.as_view(), name="composer_modal_image"),
     url(r'^(?P<branding>.*)/modalimagelibrary/$', MetadataComposerModalImageLibrary.as_view(), name="composer_modal_image_library"),
     url(r'^(?P<branding>.*)/removecontent/$', MetadataComposerRemoveContent.as_view(), name="composer_remove_content"),
     url(r'^(?P<branding>.*)/removeimage/$', MetadataComposerRemoveImage.as_view(), name="composer_remove_image"),
     url(r'^(?P<branding>.*)/removeproject/$', MetadataComposerRemoveProject.as_view(), name="composer_remove_project"),
+    url(r'^(?P<branding>.*)/image/(?P<image_pk>[\w-]+)/$', MetadataComposerImage.as_view(), name="composer_image"),
     url(r'^(?P<branding>.*)/$', MetadataComposerHome.as_view(), name="composer_home"),
     url(r'^$', MetadataComposerHome.as_view(), name="composer_home"),
 )
--- a/src/metadatacomposer/views.py	Wed May 29 18:14:23 2013 +0200
+++ b/src/metadatacomposer/views.py	Wed May 29 18:40:39 2013 +0200
@@ -1,6 +1,7 @@
 from django.conf import settings
 from django.contrib.auth.decorators import login_required
 from django.core.paginator import Paginator, InvalidPage, EmptyPage
+from django.http import HttpResponse, HttpResponseBadRequest
 from django.shortcuts import redirect, get_object_or_404
 from django.utils.decorators import method_decorator
 from django.views.decorators.cache import never_cache
@@ -11,6 +12,8 @@
 from ldt.security.permissionchecker import check_object_perm_for_user
 from metadatacomposer.forms import ImageUploadModelForm
 from metadatacomposer.models import Image
+from sorl.thumbnail import get_thumbnail
+import os
 
 
 import logging #@UnresolvedImport
@@ -346,3 +349,67 @@
 
 
 
+class MetadataComposerImage(View):
+    
+    @method_decorator(login_required)
+    def get(self, request, branding="iri", image_pk=None, **kwargs):
+        self.branding = branding
+        image_data = None
+        if image_pk:
+            image = get_object_or_404(Image, pk=image_pk)
+            width = request.GET.get("width") or None
+            height = request.GET.get("height") or None
+            maxwidth = request.GET.get("maxwidth") or None
+            maxheight = request.GET.get("maxheight") or None
+            image_file = None
+            image_data = None
+            # Check w and h
+            if width:
+                try:
+                    width = str(int(width))
+                except:
+                    return HttpResponseBadRequest("width parameter must be integer.")
+            if height:
+                try:
+                    height = str(int(height))
+                except:
+                    return HttpResponseBadRequest("height parameter must be integer.")
+            if maxwidth:
+                try:
+                    maxwidth = int(maxwidth)
+                except:
+                    return HttpResponseBadRequest("maxwidth parameter must be integer.")
+            if maxheight:
+                try:
+                    maxheight = int(maxheight)
+                except:
+                    return HttpResponseBadRequest("maxheight parameter must be integer.")
+            if (maxwidth and not maxheight) or (not maxwidth and maxheight):
+                return HttpResponseBadRequest("maxwidth AND maxheight parameters must be set.")
+            if not width and not height and not maxwidth and not maxheight:
+                # No w and no h parameter : raw file 200px width
+                image_file = get_thumbnail(os.path.join(settings.MEDIA_ROOT, image.image_file.path), '200', crop='center', format='PNG', quality=99)
+                #image_data = open(os.path.join(settings.MEDIA_ROOT, image.image_file.path), "rb").read()
+            elif width and not height:
+                # W and no h parameter : thumbnail with fixed width
+                image_file = get_thumbnail(os.path.join(settings.MEDIA_ROOT, image.image_file.path), width, crop='center', format='PNG', quality=99)
+            elif not width and height:
+                # H and no w parameter : thumbnail with fixed height
+                image_file = get_thumbnail(os.path.join(settings.MEDIA_ROOT, image.image_file.path), 'x'+height, crop='center', format='PNG', quality=99)
+            elif width and height:
+                # H and no w parameter : thumbnail with fixed height
+                image_file = get_thumbnail(os.path.join(settings.MEDIA_ROOT, image.image_file.path), width+'x'+height, crop='center', format='PNG', quality=99)
+            elif maxwidth and maxheight:
+                # We compare wanted format with image's format and we resize W or H
+                if (image.image_file.width/image.image_file.width) < (maxwidth/maxheight):
+                    # Image ratio < wanted ratio, we resize with fixed height
+                    image_file = get_thumbnail(os.path.join(settings.MEDIA_ROOT, image.image_file.path), 'x'+str(maxheight), crop='center', format='PNG', quality=99)
+                else:
+                    # Image ratio > wanted ratio, we resize with fixed width
+                    image_file = get_thumbnail(os.path.join(settings.MEDIA_ROOT, image.image_file.path), str(maxwidth), crop='center', format='PNG', quality=99)
+            if image_file:
+                image_data = image_file.read()
+        return HttpResponse(image_data, mimetype="image/png")
+
+
+