refactoring view code so there is less copypasta
authordurandn
Tue, 16 Aug 2016 16:04:51 +0200
changeset 130 ee7be54edd3e
parent 129 1eb1d082b9cc
child 131 b15c0b977eab
refactoring view code so there is less copypasta
src/iconolab/views/iconolab.py
--- a/src/iconolab/views/iconolab.py	Tue Aug 16 16:04:18 2016 +0200
+++ b/src/iconolab/views/iconolab.py	Tue Aug 16 16:04:51 2016 +0200
@@ -13,7 +13,9 @@
 from notifications.models import Notification
 from iconolab.models import Annotation, AnnotationRevision, Collection, Item, Image, IconolabComment, MetaCategory, MetaCategoryInfo
 from iconolab.forms.annotations import AnnotationRevisionForm
+import logging
 
+logger = logging.getLogger(__name__)
 
 class GlobalHomepageView(View):
     def get(self, request, *args, **kwargs):
@@ -81,19 +83,46 @@
         context["notifications"] = notifications_list
         return render(request, 'iconolab/user_notifications.html', context)
 
-
-class CollectionHomepageView(View, ContextMixin):
+# Class with check_kwargs method to fetch objects from database depending on what level in the app we're currently at
+class IconolabObjectView(object):
     def check_kwargs(self, kwargs):
-        try:
-            collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
-        except (ValueError, Collection.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        return True, (collection)
-    
+        """
+            Returns a boolean depending on wether (True) or not (False) the objects were found and a tuple containing the objects, with a select_related/prefetch_related on relevant related objects
+            following this ordering: (collection, item, image, annotation, revision)
+        """
+        objects_tuple = ()
+        if "collection_name" in kwargs.keys():
+            try:
+                objects_tuple += (Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name')),)
+            except (ValueError, Collection.DoesNotExist):
+                return False, RedirectView.as_view(url=reverse('404error'))
+        if "item_guid" in kwargs.keys():
+            try:
+                objects_tuple += (Item.objects.prefetch_related("images").get(item_guid=kwargs.get('item_guid')),)
+            except (ValueError, Item.DoesNotExist):
+                return False, RedirectView.as_view(url=reverse('404error'))
+        if "image_guid" in kwargs.keys():
+            try:
+                objects_tuple += (Image.objects.prefetch_related("annotations", "item").get(image_guid=kwargs.get('image_guid')),)
+            except (ValueError, Image.DoesNotExist):
+                return False, RedirectView.as_view(url=reverse('404error'))
+        if "annotation_guid" in kwargs.keys():
+            try:
+                objects_tuple += (Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid')),)
+            except (ValueError, Annotation.DoesNotExist):
+                return False, RedirectView.as_view(url=reverse('404error'))
+        if "revision_guid" in kwargs.keys():
+            try:
+                objects_tuple += (AnnotationRevision.objects.select_related('parent_revision').get(revision_guid=kwargs.get('revision_guid')),)
+            except (ValueError, AnnotationRevision.DoesNotExist):
+                return False, RedirectView.as_view(url=reverse('404error'))
+        return True, objects_tuple
+
+class CollectionHomepageView(View, ContextMixin, IconolabObjectView):
     def get(self, request, *args, **kwargs):
         success, result = self.check_kwargs(kwargs)
         if success:
-            (collection) = result
+            (collection,) = result
         else:
             return result(request)
         context = super(CollectionHomepageView, self).get_context_data(**kwargs)
@@ -103,19 +132,7 @@
     
 
 
-class ShowItemView(View, ContextMixin):
-    
-    def check_kwargs(self, kwargs):
-        try:
-            collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
-        except (ValueError, Collection.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            item = Item.objects.prefetch_related("images").get(item_guid=kwargs.get('item_guid'))
-        except (ValueError, Item.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        return True, (collection, item)
-    
+class ShowItemView(View, ContextMixin, IconolabObjectView):
     def get(self, request, *args, **kwargs):
         success, result = self.check_kwargs(kwargs)
         if success:
@@ -132,19 +149,7 @@
             image.stats.save()
         return render(request, 'iconolab/detail_item.html', context);
 
-class ShowImageView(View, ContextMixin):
-    
-    def check_kwargs(self, kwargs):
-        try:
-            collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
-        except (ValueError, Collection.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
-        except (ValueError, Image.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        return True, (collection, image)
-    
+class ShowImageView(View, ContextMixin, IconolabObjectView):
     def get(self, request, *args, **kwargs):
         success, result = self.check_kwargs(kwargs)
         if success:
@@ -158,7 +163,7 @@
         context['image'] = image
         return render(request, 'iconolab/detail_image.html', context)
     
-class CreateAnnotationView(View, ContextMixin):
+class CreateAnnotationView(View, ContextMixin, IconolabObjectView):
     
     def get_context_data(self, **kwargs):
         context = super(CreateAnnotationView, self).get_context_data(**kwargs)
@@ -166,21 +171,10 @@
         context['image_guid'] = self.kwargs.get('image_guid', '')
         return context
     
-    def check_kwargs(self, kwargs):
-        try:
-            collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
-        except (ValueError, Collection.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
-        except (ValueError, Image.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        return True, (collection, image)
-    
     def get(self, request, *args, **kwargs):
         success, result = self.check_kwargs(kwargs)
         if success:
-            (collection, image) = result
+            (collection, image,) = result
         else:
             return result(request)
         annotation_form = AnnotationRevisionForm()
@@ -224,7 +218,7 @@
         context['tags_data'] = '[]'
         render(request, 'iconolab/change_annotation.html', context)
 
-class ShowAnnotationView(View, ContextMixin):
+class ShowAnnotationView(View, ContextMixin, IconolabObjectView):
     
     def get_context_data(self, **kwargs):
         context = super(ShowAnnotationView, self).get_context_data(**kwargs)
@@ -232,26 +226,11 @@
         context['image_guid'] = self.kwargs.get('image_guid', '')
         context['annotation_guid'] = self.kwargs.get('annotation_guid', '')
         return context
-    
-    def check_kwargs(self, kwargs):
-        try:
-            collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
-        except (ValueError, Collection.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
-        except (ValueError, Image.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
-        except (ValueError, Annotation.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        return True, (collection, image, annotation)
-    
+
     def get(self, request, *args, **kwargs):
         success, result = self.check_kwargs(kwargs)
         if success:
-            (collection, image, annotation) = result
+            (collection, image, annotation,) = result
         else:
             return result(request)
         context = self.get_context_data(**kwargs)
@@ -294,7 +273,7 @@
         return render(request, 'iconolab/detail_annotation.html', context)
 
 
-class EditAnnotationView(View, ContextMixin):
+class EditAnnotationView(View, ContextMixin, IconolabObjectView):
     
     def get_context_data(self, **kwargs):
         context = super(EditAnnotationView, self).get_context_data(**kwargs)
@@ -303,25 +282,10 @@
         context['annotation_guid'] = self.kwargs.get('annotation_guid', '')
         return context
     
-    def check_kwargs(self, kwargs):
-        try:
-            collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
-        except (ValueError, Collection.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
-        except (ValueError, Image.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
-        except (ValueError, Annotation.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        return True, (collection, image, annotation)
-    
     def get(self, request, *args, **kwargs):
         success, result = self.check_kwargs(kwargs)
         if success:
-            (collection, image, annotation) = result
+            (collection, image, annotation,) = result
         else:
             return result(request)
         annotation_form = AnnotationRevisionForm(instance=annotation.current_revision)
@@ -369,7 +333,7 @@
         return render(request, 'iconolab/change_annotation.html', context)
 
 
-class ShowRevisionView(View, ContextMixin):
+class ShowRevisionView(View, ContextMixin, IconolabObjectView):
     
     def get_context_data(self, **kwargs):
         context = super(ShowRevisionView, self).get_context_data(**kwargs)
@@ -378,30 +342,11 @@
         context['annotation_guid'] = self.kwargs.get('annotation_guid', '')
         context['revision_guid'] = self.kwargs.get('revision_guid', '')
         return context
-    
-    def check_kwargs(self, kwargs):
-        try:
-            collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
-        except (ValueError, Collection.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
-        except (ValueError, Image.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
-        except (ValueError, Annotation.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            revision = AnnotationRevision.objects.select_related('parent_revision').get(revision_guid=kwargs.get('revision_guid'))
-        except (ValueError, AnnotationRevision.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        return True, (collection, image, annotation, revision)
-    
+ 
     def get(self, request, *args, **kwargs):
         success, result = self.check_kwargs(kwargs)
         if success:
-            (collection, image, annotation, revision) = result
+            (collection, image, annotation, revision,) = result
         else:
             return result(request)
         context = self.get_context_data(**kwargs)
@@ -440,7 +385,7 @@
         return render(request, 'iconolab/detail_revision.html', context)
 
         
-class MergeProposalView(View, ContextMixin):
+class MergeProposalView(View, ContextMixin, IconolabObjectView):
     
     def get_context_data(self, **kwargs):
         context = super(MergeProposalView, self).get_context_data(**kwargs)
@@ -449,30 +394,11 @@
         context['annotation_guid'] = self.kwargs.get('annotation_guid', '')
         context['revision_guid'] = self.kwargs.get('revision_guid', '')
         return context
-    
-    def check_kwargs(self, kwargs):
-        try:
-            collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
-        except (ValueError, Collection.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
-        except (ValueError, Image.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
-        except (ValueError, Annotation.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        try:
-            revision = AnnotationRevision.objects.select_related('parent_revision').get(revision_guid=kwargs.get('revision_guid'))
-        except (ValueError, AnnotationRevision.DoesNotExist):
-            return False, RedirectView.as_view(url=reverse('404error'))
-        return True, (collection, image, annotation, revision)
-    
+
     def get(self, request, *args, **kwargs):
         success, result = self.check_kwargs(kwargs)
         if success:
-            (collection, image, annotation, revision) = result
+            (collection, image, annotation, revision,) = result
         else:
             return result(request)
         # Only show merge form if there is a revision to merge AND the current user is the annotation author