--- 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