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