Removed login_required from annotation detail view + prep work on merge view (context is set for get method + blank template) + Corrected 404 logic for checking kwargs
authordurandn
Tue, 05 Jul 2016 14:28:04 +0200
changeset 59 b30fa6fabee8
parent 58 9f7e484baf73
child 60 8f1af46307e1
Removed login_required from annotation detail view + prep work on merge view (context is set for get method + blank template) + Corrected 404 logic for checking kwargs
src/iconolab/templates/iconolab/merge_revision.html
src/iconolab/templates/partials/header.html
src/iconolab/urls.py
src/iconolab/views.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iconolab/templates/iconolab/merge_revision.html	Tue Jul 05 14:28:04 2016 +0200
@@ -0,0 +1,3 @@
+{{ current_revision.title }} - {{ current_revision.description }} - {{ current_tags_data }} - {{ current_comment }}<br><br>
+{{ parent_revision.title }} - {{ parent_revision.description }} - {{ parent_tags_data }} - {{ parent_comment }}<br>
+{{ proposal_revision.title }} - {{ proposal_revision.description }} - {{ proposal_tags_data }} - {{ proposal_comment }}<br>
\ No newline at end of file
--- a/src/iconolab/templates/partials/header.html	Mon Jul 04 12:11:12 2016 +0200
+++ b/src/iconolab/templates/partials/header.html	Tue Jul 05 14:28:04 2016 +0200
@@ -11,7 +11,7 @@
     </div>
     <div id="navbar" class="navbar-collapse collapse">
       <ul class="nav navbar-nav">
-        <li class="active"><a href="#">Accueil</a></li>
+        <li><a href="#">Accueil</a></li>
         <li><a href="#">Le projet</a></li>
         {% if collection_name %}<li><a href="{% url 'collection_home' collection_name %}">Contribuer</a></li>{% endif %}
       </ul>
--- a/src/iconolab/urls.py	Mon Jul 04 12:11:12 2016 +0200
+++ b/src/iconolab/urls.py	Tue Jul 05 14:28:04 2016 +0200
@@ -30,7 +30,7 @@
     url(r'^collections/(?P<collection_name>[a-z]+)/images/(?P<image_guid>[^/]+)/annotations/create$', login_required(views.CreateAnnotationView.as_view()), name='annotation_create'),
     url(r'^collections/(?P<collection_name>[a-z]+)/images/(?P<image_guid>[^/]+)/annotations/(?P<annotation_guid>[^/]+)/detail$', views.ShowAnnotationView.as_view(), name='annotation_detail'),
     url(r'^collections/(?P<collection_name>[a-z]+)/images/(?P<image_guid>[^/]+)/annotations/(?P<annotation_guid>[^/]+)/edit$', login_required(views.EditAnnotationView.as_view()), name='annotation_edit'),
-    url(r'^collections/(?P<collection_name>[a-z]+)/images/(?P<image_guid>[^/]+)/annotations/(?P<annotation_guid>[^/]+)/revisions/(?P<revision_guid>[^/]+)/detail', login_required(views.ShowRevisionView.as_view()), name='revision_detail'),
+    url(r'^collections/(?P<collection_name>[a-z]+)/images/(?P<image_guid>[^/]+)/annotations/(?P<annotation_guid>[^/]+)/revisions/(?P<revision_guid>[^/]+)/detail', views.ShowRevisionView.as_view(), name='revision_detail'),
     url(r'^collections/(?P<collection_name>[a-z]+)/images/(?P<image_guid>[^/]+)/annotations/(?P<annotation_guid>[^/]+)/revisions/(?P<revision_guid>[^/]+)/merge$', login_required(views.MergeProposalView.as_view()), name='annotation_merge'),
     url(r'errors/404', views.NotFoundErrorView.as_view(), name="404error"),
     url(r'^rest', include('restapi.urls')),
--- a/src/iconolab/views.py	Mon Jul 04 12:11:12 2016 +0200
+++ b/src/iconolab/views.py	Tue Jul 05 14:28:04 2016 +0200
@@ -30,11 +30,15 @@
         try:
             collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
         except Collection.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
-        return collection
+            return False, RedirectView.as_view(url=reverse('404error'))
+        return True, (collection)
     
     def get(self, request, *args, **kwargs):
-        collection = self.check_kwargs(kwargs)
+        success, result = self.check_kwargs(kwargs)
+        if success:
+            (collection) = result
+        else:
+            return result(request)
         context = super(CollectionHomepageView, self).get_context_data(**kwargs)
         context['collection_name'] = self.kwargs.get('collection_name', '')
         context['collection'] = collection
@@ -47,15 +51,19 @@
         try:
             collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
         except Collection.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
+            return False, RedirectView.as_view(url=reverse('404error'))
         try:
             image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
         except Image.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
-        return collection, image
+            return False, RedirectView.as_view(url=reverse('404error'))
+        return True, (collection, image)
     
     def get(self, request, *args, **kwargs):
-        collection, image = self.check_kwargs(kwargs)
+        success, result = self.check_kwargs(kwargs)
+        if success:
+            (collection, image) = result
+        else:
+            return result(request)
         context = super(ShowImageView, self).get_context_data(**kwargs)
         context['collection_name'] = self.kwargs.get('collection_name', '')
         context['image_guid'] = self.kwargs.get('image_guid', '')
@@ -75,15 +83,19 @@
         try:
             collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
         except Collection.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
+            return False, RedirectView.as_view(url=reverse('404error'))
         try:
             image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
         except Image.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
-        return collection, image
+            return False, RedirectView.as_view(url=reverse('404error'))
+        return True, (collection, image)
     
     def get(self, request, *args, **kwargs):
-        collection, image = self.check_kwargs(kwargs)
+        success, result = self.check_kwargs(kwargs)
+        if success:
+            (collection, image) = result
+        else:
+            return result(request)
         annotation_form = AnnotationRevisionForm()
         context = self.get_context_data(**kwargs)
         context['image'] = image
@@ -92,7 +104,11 @@
         return render(request, 'iconolab/change_annotation.html', context) 
     
     def post(self, request, *args, **kwargs):
-        collection, image = self.check_kwargs(kwargs)
+        success, result = self.check_kwargs(kwargs)
+        if success:
+            (collection, image) = result
+        else:
+            return result(request)
         collection_name = kwargs['collection_name']
         image_guid = kwargs['image_guid']
         annotation_form = AnnotationRevisionForm(request.POST)
@@ -134,20 +150,23 @@
         try:
             collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
         except Collection.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
+            return False, RedirectView.as_view(url=reverse('404error'))
         try:
             image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
         except Image.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
+            return False, RedirectView.as_view(url=reverse('404error'))
         try:
             annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
         except Annotation.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
-        return collection, image, annotation
+            return False, RedirectView.as_view(url=reverse('404error'))
+        return True, (collection, image, annotation)
     
     def get(self, request, *args, **kwargs):
-        collection, image, annotation = self.check_kwargs(kwargs)
-        self.check_kwargs(kwargs)
+        success, result = self.check_kwargs(kwargs)
+        if success:
+            (collection, image, annotation) = result
+        else:
+            return result(request)
         context = self.get_context_data(**kwargs)
         context['collection'] = collection
         context['image'] = image
@@ -169,19 +188,23 @@
         try:
             collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
         except Collection.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
+            return False, RedirectView.as_view(url=reverse('404error'))
         try:
             image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
         except Image.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
+            return False, RedirectView.as_view(url=reverse('404error'))
         try:
             annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
         except Annotation.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
-        return collection, image, annotation
+            return False, RedirectView.as_view(url=reverse('404error'))
+        return True, (collection, image, annotation)
     
     def get(self, request, *args, **kwargs):
-        collection, image, annotation = self.check_kwargs(kwargs)
+        success, result = self.check_kwargs(kwargs)
+        if success:
+            (collection, image, annotation) = result
+        else:
+            return result(request)
         annotation_form = AnnotationRevisionForm(instance=annotation.current_revision)
         context = self.get_context_data(**kwargs)
         context['image'] = image
@@ -191,7 +214,11 @@
         return render(request, 'iconolab/change_annotation.html', context) 
     
     def post(self, request, *args, **kwargs):
-        collection, image, annotation = self.check_kwargs(kwargs)
+        success, result = self.check_kwargs(kwargs)
+        if success:
+            (collection, image, annotation) = result
+        else:
+            return result(request)
         collection_name = kwargs['collection_name']
         image_guid = kwargs['image_guid']
         annotation_guid = kwargs['annotation_guid']
@@ -237,40 +264,101 @@
         try:
             collection = Collection.objects.prefetch_related("items", "items__images").get(name=kwargs.get('collection_name'))
         except Collection.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
+            return False, RedirectView.as_view(url=reverse('404error'))
         try:
             image = Image.objects.prefetch_related("annotations").get(image_guid=kwargs.get('image_guid'))
         except Image.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
+            return False, RedirectView.as_view(url=reverse('404error'))
         try:
             annotation = Annotation.objects.select_related('current_revision').get(annotation_guid=kwargs.get('annotation_guid'))
         except Annotation.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
+            return False, RedirectView.as_view(url=reverse('404error'))
         try:
             revision = AnnotationRevision.objects.select_related('parent_revision').get(revision_guid=kwargs.get('revision_guid'))
         except AnnotationRevision.DoesNotExist:
-            return RedirectView.as_view(url=reverse('404error'))
-        return collection, image, annotation, revision
+            return False, RedirectView.as_view(url=reverse('404error'))
+        return True, (collection, image, annotation, revision)
     
     def get(self, request, *args, **kwargs):
-        collection, image, annotation, revision = self.check_kwargs(kwargs)
-        self.check_kwargs(kwargs)
+        success, result = self.check_kwargs(kwargs)
+        if success:
+            (collection, image, annotation, revision) = result
+        else:
+            return result(request)
         context = self.get_context_data(**kwargs)
         context['collection'] = collection
         context['image'] = image
         context['annotation'] = annotation
         context['revision'] = revision
         context['tags_data'] = revision.get_tags_json()
-        print(revision.creation_comment)
         context['comment'] = revision.creation_comment.first()
         return render(request, 'iconolab/detail_revision.html', context)
 
         
-class MergeProposalView(View):
+class MergeProposalView(View, ContextMixin):
+    
+    def get_context_data(self, **kwargs):
+        context = super(MergeProposalView, self).get_context_data(**kwargs)
+        context['collection_name'] = self.kwargs.get('collection_name', '')
+        context['image_guid'] = self.kwargs.get('image_guid', '')
+        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 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 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 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 AnnotationRevision.DoesNotExist:
+            return False, RedirectView.as_view(url=reverse('404error'))
+        return True, (collection, image, annotation, revision)
     
     def get(self, request, *args, **kwargs):
-        # Handle merge form display here
-        pass
+        success, result = self.check_kwargs(kwargs)
+        if success:
+            (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
+        if revision.state != AnnotationRevision.AWAITING or request.user != annotation.author:
+            return RedirectView.as_view(
+                url=reverse('revision_detail', 
+                    kwargs={
+                        'collection_name': collection.name, 
+                        'image_guid': image.image_guid, 
+                        'annotation_guid': annotation.annotation_guid,
+                        'revision_guid': revision.revision_guid
+                    }
+                )
+            )
+        context = self.get_context_data(**kwargs)
+        context['collection'] = collection
+        context['image'] = image
+        context['annotation'] = annotation
+        # Proposal data
+        context['proposal_revision'] = revision
+        context['proposal_tags_data'] = revision.get_tags_json()
+        context['proposal_comment'] = revision.creation_comment.first()
+        # Parent data
+        context['parent_revision'] = revision.parent_revision
+        context['parent_tags_data'] = revision.parent_revision.get_tags_json()
+        context['parent_comment'] = revision.parent_revision.creation_comment.first()
+        # Current data
+        context['current_revision'] = revision
+        context['current_tags_data'] = revision.get_tags_json()
+        context['current_comment'] = revision.creation_comment.first()
+        return render(request, 'iconolab/merge_revision.html', context)
     
     def post(self, request, *args, **kwargs):
         # Handle merge form submit here
@@ -282,6 +370,7 @@
         # Handle image display here
         pass
     
+
 @csrf_protect
 @require_POST
 def post_comment_iconolab(request, next=None, using=None):