# HG changeset patch # User durandn # Date 1471356291 -7200 # Node ID ee7be54edd3efc1a0fb95e6b7f7d7e07bfc6d1d0 # Parent 1eb1d082b9cc85444c35ee98fe03dabcf3cf664a refactoring view code so there is less copypasta diff -r 1eb1d082b9cc -r ee7be54edd3e 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