src/iconolab/views/objects.py
author Alexandre Segura <mex.zktk@gmail.com>
Mon, 17 Apr 2017 14:42:38 +0200
changeset 470 6c43539e5c67
parent 467 5d0879ffa7de
child 479 71cad12c0862
permissions -rw-r--r--
Use browser history instead of hash for annotation URL.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
     1
from django.shortcuts import HttpResponse, get_object_or_404, render, redirect
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
     2
from django.http import Http404
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
     3
from django.db.models import Count
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
     4
from django.contrib.auth.decorators import login_required
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
     5
from django.contrib.auth.models import User
461
4701ee4556e3 Display message when revision needs approval.
Alexandre Segura <mex.zktk@gmail.com>
parents: 416
diff changeset
     6
from django.contrib import messages
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
     7
from django.views.generic import View, DetailView, RedirectView, TemplateView
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
     8
from django.views.generic.base import ContextMixin
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
     9
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    10
from django.core.urlresolvers import reverse
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    11
from django.core.exceptions import ObjectDoesNotExist
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    12
from django.contrib.contenttypes.models import ContentType
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    13
from django.contrib.sites.models import Site
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    14
from django.conf import settings
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    15
from notifications.models import Notification
337
db6c41f04e79 Move serializers to dedicated file, do not create comment on revision creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 323
diff changeset
    16
from iconolab.models import Annotation, AnnotationRevision, Collection, Item, Image, IconolabComment, MetaCategory, MetaCategoryInfo
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    17
from iconolab.forms.annotations import AnnotationRevisionForm
337
db6c41f04e79 Move serializers to dedicated file, do not create comment on revision creation.
Alexandre Segura <mex.zktk@gmail.com>
parents: 323
diff changeset
    18
from iconolab.serializers import AnnotationRevisionSerializer
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    19
import logging
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    20
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    21
logger = logging.getLogger(__name__)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    22
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    23
class GlobalHomepageView(View):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    24
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    25
        View for the opening page of Iconolab.
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    26
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    27
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    28
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    29
            Template is iconolab/home.html
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    30
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    31
            Context variables provided to the template are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    32
                collections_primary: list of collections to display as big images
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    33
                collections_secondary: list of collections to display as small links at the bottom
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    34
                homepage = True: used to pass checks in the partials/header.html
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    35
                    template to adjust the navbar to the homepage
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    36
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    37
        context = {}
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    38
        context['collections_primary'] = Collection.objects.filter(show_image_on_home=True).all()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    39
        context['collections_secondary'] = Collection.objects.filter(show_image_on_home=False).all()
376
3d48f9520c8d adds contact email as a setting variable from the app (instead of raw in the template
duong tam kien <tk@deveha.com>
parents: 343
diff changeset
    40
        context['contact'] = settings.CONTACT_EMAIL
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    41
        context['homepage'] = True
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    42
        return render(request, 'iconolab/home.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    43
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    44
class TestView(View):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    45
    template_name = 'iconolab/compare.html'
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    46
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    47
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    48
        return render(request, self.template_name)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    49
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    50
# Class with check_kwargs method to fetch objects from database depending on what level in the app we're currently at
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    51
class IconolabObjectView(object):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    52
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    53
        Superclass that defines method used in all object display views.
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    54
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    55
    def check_kwargs(self, kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    56
        '''
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    57
            Returns a boolean depending on wether (True) or not (False) the objects
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    58
            were found and a tuple containing the objects, with a select_related/prefetch_related
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    59
            on relevant related objects following this ordering:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    60
            (collection, item, image, annotation, revision)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    61
        '''
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    62
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    63
        objects_tuple = ()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    64
        if 'collection_name' in kwargs.keys():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    65
            try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    66
                objects_tuple += (Collection.objects.prefetch_related('items', 'items__images').get(name=kwargs.get('collection_name')),)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    67
            except (ValueError, Collection.DoesNotExist):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    68
                return False, RedirectView.as_view(url=reverse('404error'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    69
        if 'item_guid' in kwargs.keys():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    70
            try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    71
                objects_tuple += (Item.objects.prefetch_related('images', 'metadatas', 'images__stats').get(item_guid=kwargs.get('item_guid')),)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    72
            except (ValueError, Item.DoesNotExist):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    73
                return False, RedirectView.as_view(url=reverse('404error'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    74
        if 'image_guid' in kwargs.keys():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    75
            try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    76
                objects_tuple += (Image.objects.prefetch_related('annotations', 'item', 'stats').get(image_guid=kwargs.get('image_guid')),)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    77
            except (ValueError, Image.DoesNotExist):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    78
                return False, RedirectView.as_view(url=reverse('404error'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    79
        if 'annotation_guid' in kwargs.keys():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    80
            try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    81
                objects_tuple += (Annotation.objects.prefetch_related('current_revision', 'stats', 'image').get(annotation_guid=kwargs.get('annotation_guid')),)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    82
            except (ValueError, Annotation.DoesNotExist):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    83
                return False, RedirectView.as_view(url=reverse('404error'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    84
        if 'revision_guid' in kwargs.keys():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    85
            try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    86
                objects_tuple += (AnnotationRevision.objects.prefetch_related('parent_revision').get(revision_guid=kwargs.get('revision_guid')),)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    87
            except (ValueError, AnnotationRevision.DoesNotExist):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    88
                return False, RedirectView.as_view(url=reverse('404error'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    89
        return True, objects_tuple
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    90
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    91
    def get_pagination_data(self, list_to_paginate, page, perpage, adjacent_pages_count, perpage_range=[5, 10, 25, 100], trailing_qarg=""):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    92
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    93
            Takes a queryset or a list and returns a dict with pagination data for display purposes
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    94
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    95
            Dict will be of the format:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    96
            {
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    97
                page: the page to load (integer)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    98
                perpage_range: a list of the page links to display (list of integers)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
    99
                perpage: the item count per page (integer)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   100
                perpage_range: a list of the perpage values to display next to the page list (list of integers)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   101
                trailing_qarg: optional trailing qarg for the paginations links (used in collection home to remember the state of each list between page loads) (string)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   102
                list: the item list to display (list of objects)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   103
                show_first: used in template to display links, will be True if 1 is not in page_range
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   104
                show_last: used in template to display links, will be True if page_count is not in page_range
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   105
                ellipsis_first: used in template to display links, will be True if page_range starts at 3 or more
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   106
                ellipsis_last: used in template to display links, will be True if page_range ends at last_page - 2 or less
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   107
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   108
            }
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   109
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   110
        pagination_data = {}
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   111
        pagination_data["page"] = page
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   112
        pagination_data["perpage"] = perpage
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   113
        pagination_data["perpage_range"] = perpage_range
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   114
        pagination_data["trailing_qarg"] = trailing_qarg
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   115
        paginator = Paginator(list_to_paginate, perpage)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   116
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   117
            pagination_data["list"] = paginator.page(page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   118
        except PageNotAnInteger:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   119
            pagination_data["list"] = paginator.page(1)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   120
        except EmptyPage:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   121
            pagination_data["list"] = paginator.page(paginator.num_pages)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   122
        pagination_data["page_range"] = [
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   123
            n for n in \
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   124
            range(page - adjacent_pages_count, page + adjacent_pages_count + 1) \
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   125
                if n > 0 and n <= paginator.num_pages
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   126
        ]
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   127
        pagination_data["show_first"] = page - adjacent_pages_count > 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   128
        pagination_data["ellipsis_first"] = pagination_data["show_first"] and (page - adjacent_pages_count != 2)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   129
        pagination_data["show_last"] = page + adjacent_pages_count < paginator.num_pages
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   130
        pagination_data["ellipsis_last"] = pagination_data["show_last"] and (page + adjacent_pages_count != paginator.num_pages - 1)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   131
        return pagination_data
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   132
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   133
class CollectionHomepageView(View, ContextMixin, IconolabObjectView):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   134
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   135
        View that displays a collection and four panels to show relevant paginated lists for collection:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   136
        * item lists
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   137
        * annotations ordered by creation date
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   138
        * annotations ordered by revisions count
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   139
        * annotations where a metacategory that notifies contributors was called
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   140
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   141
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   142
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   143
            Template is iconolab/collection_home.html
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   144
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   145
            Url args are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   146
                - collection_name: 'name' attribute of the requested collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   147
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   148
            Queryargs understood by the view are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   149
                - show : panel that will be shown on page load, one of ['items', 'recent', 'revised', 'contributions'], default to "items"
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   150
                - items_page : item list page to load
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   151
                - items_perpage : item count per page
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   152
                - recent_page : recent annotations list page to load
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   153
                - recent_perpage : recent annotations count per page
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   154
                - revised_page : most revised annotations list page to load
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   155
                - revised_perpage : most revised annotations count per page
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   156
                - contributions_page : annotations with the most contribution calls list page to load
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   157
                - contributions_perpage : annotations with the most contribution calls count per page for item list
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   158
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   159
            Context variables provided to the template are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   160
                - collection: the collection object for the requested collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   161
                - collection_name : the collection_name url arg
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   162
                - items_pagination_data: pagination data dict in the format of the IconolabObjectView.get_pagination_data() method for the items list
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   163
                - recent_pagination_data: pagination data dict in the format of the IconolabObjectView.get_pagination_data() method for the recent annotations list
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   164
                - revised_pagination_data: pagination data dict in the format of the IconolabObjectView.get_pagination_data() method for the revised annotations list
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   165
                - contributions_pagination_data: pagination data dict in the format of the IconolabObjectView.get_pagination_data() method for the contribution calls annotations list
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   166
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   167
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   168
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   169
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   170
            (collection,) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   171
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   172
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   173
        context = super(CollectionHomepageView, self).get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   174
        context['collection_name'] = self.kwargs.get('collection_name', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   175
        context['collection'] = collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   176
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   177
        # get Pagination and navigation query args
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   178
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   179
            items_page = int(request.GET.get('items_page', '1'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   180
        except ValueError:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   181
            items_page = 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   182
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   183
            items_per_page = int(request.GET.get('items_perpage', '12'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   184
        except ValueError:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   185
            items_per_page = 12
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   186
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   187
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   188
            recent_page = int(request.GET.get('recent_page', '1'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   189
        except ValueError:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   190
            recent_page = 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   191
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   192
            recent_per_page = int(request.GET.get('recent_perpage', '10'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   193
        except ValueError:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   194
            recent_per_page = 10
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   195
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   196
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   197
            revised_page = int(request.GET.get('revised_page', '1'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   198
        except ValueError:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   199
            revised_page = 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   200
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   201
            revised_per_page = int(request.GET.get('revised_perpage', '10'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   202
        except ValueError:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   203
            revised_per_page = 10
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   204
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   205
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   206
            contributions_page = int(request.GET.get('contributions_page', '1'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   207
        except ValueError:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   208
            contributions_page = 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   209
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   210
            contributions_per_page = int(request.GET.get('contributions_perpage', '10'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   211
        except ValueError:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   212
            contributions_per_page = 10
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   213
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   214
        active_list = request.GET.get('show', 'items')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   215
        if active_list not in ['items', 'recent', 'revised', 'contributions']:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   216
            active_list = 'items'
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   217
        context["active_list"] = active_list
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   218
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   219
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   220
        # Pagination values
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   221
        adjacent_pages_count = 2
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   222
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   223
        # Paginated objects list
416
5daa15b87404 Introduce folders.
Alexandre Segura <mex.zktk@gmail.com>
parents: 407
diff changeset
   224
        items_list = collection.items.order_by("metadatas__inventory_number")
5daa15b87404 Introduce folders.
Alexandre Segura <mex.zktk@gmail.com>
parents: 407
diff changeset
   225
5daa15b87404 Introduce folders.
Alexandre Segura <mex.zktk@gmail.com>
parents: 407
diff changeset
   226
        folder = request.GET.get('folder', None)
5daa15b87404 Introduce folders.
Alexandre Segura <mex.zktk@gmail.com>
parents: 407
diff changeset
   227
5daa15b87404 Introduce folders.
Alexandre Segura <mex.zktk@gmail.com>
parents: 407
diff changeset
   228
        if folder is not None:
467
5d0879ffa7de Use folder GUID instead of primary key.
Alexandre Segura <mex.zktk@gmail.com>
parents: 465
diff changeset
   229
            items_list = items_list.filter(folders__folder_guid=folder)
416
5daa15b87404 Introduce folders.
Alexandre Segura <mex.zktk@gmail.com>
parents: 407
diff changeset
   230
467
5d0879ffa7de Use folder GUID instead of primary key.
Alexandre Segura <mex.zktk@gmail.com>
parents: 465
diff changeset
   231
        context['folder_guid'] = folder
416
5daa15b87404 Introduce folders.
Alexandre Segura <mex.zktk@gmail.com>
parents: 407
diff changeset
   232
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   233
        context["items_pagination_data"] = self.get_pagination_data(
416
5daa15b87404 Introduce folders.
Alexandre Segura <mex.zktk@gmail.com>
parents: 407
diff changeset
   234
            items_list.all(),
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   235
            items_page,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   236
            items_per_page,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   237
            adjacent_pages_count,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   238
            perpage_range=[6, 12, 48, 192],
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   239
            trailing_qarg="&recent_page="+str(recent_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   240
            +"&recent_perpage="+str(recent_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   241
            +"&revised_page="+str(revised_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   242
            +"&revised_perpage="+str(revised_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   243
            +"&contributions_page="+str(contributions_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   244
            +"&contributions_perpage="+str(contributions_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   245
        )
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   246
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   247
        # Paginated recent annotations list
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   248
        recent_annotations = Annotation.objects.filter(image__item__collection__name=collection.name).prefetch_related(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   249
            'current_revision',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   250
            'stats'
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   251
        ).order_by('-current_revision__created')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   252
        context["recent_pagination_data"] = self.get_pagination_data(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   253
            recent_annotations,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   254
            recent_page,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   255
            recent_per_page,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   256
            adjacent_pages_count,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   257
            trailing_qarg="&items_page="+str(items_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   258
            +"&items_perpage="+str(items_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   259
            +"&revised_page="+str(revised_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   260
            +"&revised_perpage="+str(revised_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   261
            +"&contributions_page="+str(contributions_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   262
            +"&contributions_perpage="+str(contributions_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   263
        )
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   264
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   265
        # Paginated revised annotations list
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   266
        revised_annotations = Annotation.objects.filter(image__item__collection__name=collection.name).prefetch_related(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   267
            'current_revision',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   268
            'stats'
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   269
        ).annotate(revision_count=Count('revisions')).order_by('-revision_count')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   270
        context["revised_pagination_data"] = self.get_pagination_data(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   271
            revised_annotations,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   272
            revised_page,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   273
            revised_per_page,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   274
            adjacent_pages_count,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   275
            trailing_qarg="&items_page="+str(items_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   276
            +"&items_perpage="+str(items_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   277
            +"&recent_page="+str(recent_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   278
            +"&recent_perpage="+str(recent_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   279
            +"&contributions_page="+str(contributions_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   280
            +"&contributions_perpage="+str(contributions_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   281
        )
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   282
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   283
        # Paginated contribution calls annotation list
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   284
        contrib_calls_annotations_ids = list(set(MetaCategoryInfo.objects.filter(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   285
            metacategory__collection__name=collection.name,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   286
            metacategory__triggers_notifications=MetaCategory.CONTRIBUTORS
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   287
        ).order_by('comment__submit_date').values_list('comment__object_pk', flat=True)))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   288
        collection_annotations = Annotation.objects.filter(id__in=contrib_calls_annotations_ids).all()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   289
        collection_ann_dict = dict([(str(annotation.id), annotation) for annotation in collection_annotations])
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   290
        contributions_annotations = [collection_ann_dict[id] for id in contrib_calls_annotations_ids]
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   291
        context["contributions_pagination_data"] = self.get_pagination_data(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   292
            contributions_annotations,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   293
            contributions_page,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   294
            contributions_per_page,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   295
            adjacent_pages_count,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   296
            trailing_qarg="&items_page="+str(items_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   297
            +"&items_perpage="+str(items_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   298
            +"&recent_page="+str(recent_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   299
            +"&recent_perpage="+str(recent_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   300
            +"&revised_page="+str(revised_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   301
            +"&revised_perpage="+str(revised_per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   302
        )
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   303
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   304
        return render(request, 'iconolab/collection_home.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   305
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   306
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   307
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   308
class ShowItemView(View, ContextMixin, IconolabObjectView):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   309
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   310
        View that displays informations on an item with associated metadatas and stats. Also displays images and annotation list for each image.
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   311
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   312
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   313
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   314
            Template is iconolab/item_detail.html
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   315
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   316
            Url args are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   317
                - collection_name : name of the collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   318
                - item_guid: 'item_guid' attribute of the requested item
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   319
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   320
            Queryargs understood by the view are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   321
                - show: image_guid for the image to show on load
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   322
                - page: annotation list page on load for displayed image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   323
                - perpage: annotation count per page on load for displayed image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   324
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   325
            Context variables provided to the template are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   326
                - collection_name : the collection_name url arg
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   327
                - item_guid: the item_guid url arg
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   328
                - collection: the collection object for the requested collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   329
                - item: the item object for the requested item
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   330
                - display_image: the image_guid for the image to display on load
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   331
                - images: a list of dict for the item images data in the format:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   332
                    {
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   333
                        'obj': the image object,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   334
                        'annotations': the list of annotations on that image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   335
                    }
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   336
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   337
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   338
        success, result = self.check_kwargs(kwargs)
323
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 298
diff changeset
   339
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   340
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   341
            (collection, item) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   342
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   343
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   344
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   345
        context = super(ShowItemView, self).get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   346
        image_guid_to_display = request.GET.get("show", str(item.images.first().image_guid))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   347
        if image_guid_to_display not in [str(guid) for guid in item.images.all().values_list("image_guid", flat=True)]:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   348
            image_guid_to_display = str(item.images.first().image_guid)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   349
        context['display_image'] = image_guid_to_display
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   350
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   351
            displayed_annotations_page = int(request.GET.get('page', '1'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   352
        except ValueError:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   353
            displayed_annotations_page = 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   354
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   355
            displayed_annotations_per_page = int(request.GET.get('perpage', '10'))
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   356
        except ValueError:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   357
            displayed_annotations_per_page = 10
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   358
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   359
        context['collection_name'] = self.kwargs.get('collection_name', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   360
        context['item_guid'] = self.kwargs.get('image_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   361
        context['collection'] = collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   362
        context['item'] = item
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   363
        context['images'] = []
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   364
        for image in item.images.all():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   365
            if str(image.image_guid) == image_guid_to_display:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   366
                page = displayed_annotations_page
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   367
                per_page = displayed_annotations_per_page
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   368
            else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   369
                page = 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   370
                per_page = 10
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   371
            annotations_paginator = Paginator(image.annotations.all(), per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   372
            try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   373
                annotations = annotations_paginator.page(page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   374
            except PageNotAnInteger:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   375
                annotations = annotations_paginator.page(1)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   376
            except EmptyPage:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   377
                annotations = annotations_paginator.page(recent_paginator.num_pages)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   378
            context['images'].append({
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   379
                'obj' : image,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   380
                'annotations': annotations
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   381
            })
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   382
            image.stats.views_count += 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   383
            image.stats.save()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   384
        return render(request, 'iconolab/detail_item.html', context);
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   385
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   386
class ShowImageView(View, ContextMixin, IconolabObjectView):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   387
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   388
        View that only displays an image and the associated annotations
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   389
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   390
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   391
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   392
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   393
            (collection, image) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   394
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   395
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   396
        context = super(ShowImageView, self).get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   397
        context['collection_name'] = self.kwargs.get('collection_name', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   398
        context['image_guid'] = self.kwargs.get('image_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   399
        context['collection'] = collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   400
        context['image'] = image
407
74e0a5ea614a Display item metadata below image.
Alexandre Segura <mex.zktk@gmail.com>
parents: 376
diff changeset
   401
        context['item'] = image.item
323
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 298
diff changeset
   402
        context['form'] = AnnotationRevisionForm()
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   403
        return render(request, 'iconolab/detail_image.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   404
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   405
class CreateAnnotationView(View, ContextMixin, IconolabObjectView):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   406
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   407
        View that displays annotation forms and handles annotation creation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   408
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   409
    def get_context_data(self, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   410
        context = super(CreateAnnotationView, self).get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   411
        context['collection_name'] = self.kwargs.get('collection_name', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   412
        context['image_guid'] = self.kwargs.get('image_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   413
        return context
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   414
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   415
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   416
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   417
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   418
            (collection, image,) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   419
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   420
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   421
        annotation_form = AnnotationRevisionForm()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   422
        context = self.get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   423
        context['image'] = image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   424
        context['form'] = annotation_form
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   425
        context['tags_data'] = '[]'
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   426
        return render(request, 'iconolab/change_annotation.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   427
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   428
    def post(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   429
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   430
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   431
            (collection, image) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   432
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   433
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   434
        collection_name = kwargs['collection_name']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   435
        image_guid = kwargs['image_guid']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   436
        annotation_form = AnnotationRevisionForm(request.POST)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   437
        if annotation_form.is_valid():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   438
            author = request.user
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   439
            title = annotation_form.cleaned_data['title']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   440
            description = annotation_form.cleaned_data['description']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   441
            fragment = annotation_form.cleaned_data['fragment']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   442
            tags_json = annotation_form.cleaned_data['tags']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   443
            new_annotation = Annotation.objects.create_annotation(author, image, title=title, description=description, fragment=fragment, tags_json=tags_json)
323
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 298
diff changeset
   444
            redirect_url = reverse('image_detail', kwargs={'collection_name': collection_name, 'image_guid': image_guid})
343
6f901f3b1510 Redirect to annotation using hash.
Alexandre Segura <mex.zktk@gmail.com>
parents: 337
diff changeset
   445
            return redirect(redirect_url + '#' + str(new_annotation.annotation_guid))
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   446
        context = self.get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   447
        context['image'] = image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   448
        context['form'] = annotation_form
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   449
        context['tags_data'] = '[]'
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   450
        return render(request, 'iconolab/change_annotation.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   451
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   452
class ShowAnnotationView(View, ContextMixin, IconolabObjectView):
470
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   453
    def get(self, request, *args, **kwargs):
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   454
        success, result = self.check_kwargs(kwargs)
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   455
        if success:
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   456
            (collection, image, annotation) = result
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   457
        else:
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   458
            return result(request)
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   459
        context = super(ShowAnnotationView, self).get_context_data(**kwargs)
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   460
        context['collection_name'] = self.kwargs.get('collection_name', '')
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   461
        context['image_guid'] = self.kwargs.get('image_guid', '')
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   462
        context['collection'] = collection
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   463
        context['image'] = image
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   464
        context['item'] = image.item
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   465
        context['annotation'] = annotation
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   466
        context['form'] = AnnotationRevisionForm()
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   467
        return render(request, 'iconolab/detail_image.html', context)
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   468
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   469
class ShowAnnotationViewOld(View, ContextMixin, IconolabObjectView):
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   470
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   471
        View that show a given annotation with the corresponding data, links to
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   472
        submit new revisions and the paginated comments thread.
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   473
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   474
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   475
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   476
    def get_context_data(self, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   477
        context = super(ShowAnnotationView, self).get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   478
        context['collection_name'] = self.kwargs.get('collection_name', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   479
        context['image_guid'] = self.kwargs.get('image_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   480
        context['annotation_guid'] = self.kwargs.get('annotation_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   481
        return context
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   482
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   483
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   484
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   485
            Template is iconolab/detail_annotations.html
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   486
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   487
            Url args are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   488
                - collection_name: 'name' attribute of the requested collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   489
                - item_guid: 'item_guid' attribute of the requested item
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   490
                - annotation_guid: 'annotation_guid' attribute of the requested annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   491
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   492
            Queryargs understood by the view are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   493
                - page: comment thread page on load
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   494
                - perpage: comment count per page on load
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   495
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   496
            Context variables provided to the template are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   497
                - collection: the collection object for the requested collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   498
                - image: the image object for the requested image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   499
                - annotation: the annotation object for the requested annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   500
                - tags_data: a json string describing tags for the annotation current revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   501
                - comments: the paginated comments list for the annotation according page and perpage queryargs
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   502
                - notification_comments_ids: the ids of the comments that are referenced by a notification for the authenticated user; This allows
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   503
                us to highlight comments that triggered a notification in the page
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   504
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   505
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   506
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   507
            (collection, image, annotation,) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   508
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   509
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   510
        context = self.get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   511
        context['collection'] = collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   512
        context['image'] = image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   513
        context['annotation'] = annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   514
        context['tags_data'] = annotation.current_revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   515
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   516
        page = request.GET.get('page', 1)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   517
        per_page = request.GET.get('perpage', 10)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   518
        full_comments_list = IconolabComment.objects.for_app_models('iconolab.annotation').filter(object_pk = annotation.pk).order_by('thread_id', '-order')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   519
        paginator = Paginator(full_comments_list, per_page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   520
        try:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   521
            comments_list = paginator.page(page)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   522
        except PageNotAnInteger:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   523
            comments_list = paginator.page(1)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   524
        except EmptyPage:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   525
            comments_list = paginator.page(paginator.num_pages)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   526
        context['comments'] = comments_list
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   527
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   528
        if request.user.is_authenticated():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   529
            user_comment_notifications = Notification.objects.filter(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   530
                recipient=request.user,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   531
                action_object_content_type__app_label='iconolab',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   532
                action_object_content_type__model='iconolabcomment',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   533
                target_content_type__app_label='iconolab',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   534
                target_content_type__model='annotation',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   535
                target_object_id=annotation.id
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   536
            ).unread()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   537
            context['notifications_comments_ids'] = [int(val) for val in user_comment_notifications.values_list('action_object_object_id', flat=True)]
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   538
            comment_list_ids = [comment.id for comment in context['comments'] ]
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   539
            for notification in user_comment_notifications.all():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   540
                if int(notification.action_object_object_id) in comment_list_ids:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   541
                    notification.mark_as_read()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   542
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   543
        image.stats.views_count += 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   544
        image.stats.save()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   545
        annotation.stats.views_count += 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   546
        annotation.stats.save()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   547
        return render(request, 'iconolab/detail_annotation.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   548
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   549
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   550
class ReadonlyAnnotationView(View, ContextMixin, IconolabObjectView):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   551
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   552
        Same view as ShowAnnotationView but without the comments and links to the forms
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   553
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   554
    def get_context_data(self, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   555
        context = super(ReadonlyAnnotationView, self).get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   556
        context['collection_name'] = self.kwargs.get('collection_name', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   557
        context['image_guid'] = self.kwargs.get('image_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   558
        context['annotation_guid'] = self.kwargs.get('annotation_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   559
        return context
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   560
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   561
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   562
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   563
            Exactly the same as ShowAnnotationView but without all the data around comments
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   564
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   565
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   566
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   567
            (collection, image, annotation,) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   568
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   569
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   570
        context = self.get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   571
        context['collection'] = collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   572
        context['image'] = image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   573
        context['annotation'] = annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   574
        context['tags_data'] = annotation.current_revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   575
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   576
        image.stats.views_count += 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   577
        image.stats.save()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   578
        annotation.stats.views_count += 1
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   579
        annotation.stats.save()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   580
        return render(request, 'iconolab/detail_annotation_readonly.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   581
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   582
class EditAnnotationView(View, ContextMixin, IconolabObjectView):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   583
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   584
        View that handles displaying the edition form and editing an annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   585
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   586
    def get_context_data(self, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   587
        context = super(EditAnnotationView, self).get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   588
        context['collection_name'] = self.kwargs.get('collection_name', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   589
        context['image_guid'] = self.kwargs.get('image_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   590
        context['annotation_guid'] = self.kwargs.get('annotation_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   591
        return context
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   592
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   593
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   594
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   595
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   596
            (collection, image, annotation,) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   597
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   598
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   599
        annotation_form = AnnotationRevisionForm(instance=annotation.current_revision)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   600
        context = self.get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   601
        context['image'] = image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   602
        context['annotation'] = annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   603
        context['form'] = annotation_form
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   604
        context['tags_data'] = annotation.current_revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   605
        return render(request, 'iconolab/change_annotation.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   606
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   607
    def post(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   608
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   609
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   610
            (collection, image, annotation) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   611
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   612
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   613
        collection_name = kwargs['collection_name']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   614
        image_guid = kwargs['image_guid']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   615
        annotation_guid = kwargs['annotation_guid']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   616
        annotation_form = AnnotationRevisionForm(request.POST)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   617
        if annotation_form.is_valid():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   618
            revision_author = request.user
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   619
            revision_title = annotation_form.cleaned_data['title']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   620
            revision_description = annotation_form.cleaned_data['description']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   621
            revision_fragment = annotation_form.cleaned_data['fragment']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   622
            revision_tags_json = annotation_form.cleaned_data['tags']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   623
            new_revision = annotation.make_new_revision(revision_author, revision_title, revision_description, revision_fragment, revision_tags_json)
461
4701ee4556e3 Display message when revision needs approval.
Alexandre Segura <mex.zktk@gmail.com>
parents: 416
diff changeset
   624
4701ee4556e3 Display message when revision needs approval.
Alexandre Segura <mex.zktk@gmail.com>
parents: 416
diff changeset
   625
            if (annotation.author != revision_author):
465
ce9947e45d04 Fix typo.
Alexandre Segura <mex.zktk@gmail.com>
parents: 461
diff changeset
   626
                messages.add_message(request, messages.INFO, "Votre modification a été prise en compte. Le créateur de l'annotation a été notifié.")
461
4701ee4556e3 Display message when revision needs approval.
Alexandre Segura <mex.zktk@gmail.com>
parents: 416
diff changeset
   627
470
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   628
            redirect_url = reverse('annotation_detail', kwargs={'collection_name': collection_name, 'image_guid': image_guid, 'annotation_guid': str(annotation.annotation_guid)})
6c43539e5c67 Use browser history instead of hash for annotation URL.
Alexandre Segura <mex.zktk@gmail.com>
parents: 467
diff changeset
   629
            return redirect(redirect_url)
298
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   630
        context = self.get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   631
        context['image'] = image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   632
        context['form'] = annotation_form
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   633
        context['annotation'] = annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   634
        context['tags_data'] = annotation.current_revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   635
        return render(request, 'iconolab/change_annotation.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   636
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   637
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   638
class ShowRevisionView(View, ContextMixin, IconolabObjectView):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   639
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   640
        View that displays a given revision with its associated data and comment
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   641
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   642
    def get_context_data(self, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   643
        context = super(ShowRevisionView, self).get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   644
        context['collection_name'] = self.kwargs.get('collection_name', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   645
        context['image_guid'] = self.kwargs.get('image_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   646
        context['annotation_guid'] = self.kwargs.get('annotation_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   647
        context['revision_guid'] = self.kwargs.get('revision_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   648
        return context
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   649
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   650
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   651
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   652
            Template is iconolab/detail_annotations.html
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   653
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   654
            Url args are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   655
                - collection_name: 'name' attribute of the requested collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   656
                - item_guid: 'item_guid' attribute of the requested item
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   657
                - annotation_guid: 'annotation_guid' attribute of the requested annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   658
                - revision_guid: 'revision_guid' attribute of the requested revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   659
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   660
            Context variables provided to the template are:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   661
                - collection: the collection object for the requested collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   662
                - image: the image object for the requested image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   663
                - annotation: the annotation object for the requested annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   664
                - revision: the revision object for the requested annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   665
                - tags_data: a json string describing tags for the annotation current revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   666
                - comment: the comment that was posted alongside the revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   667
                - notified_revision: if True, the revision is linked from one or more unread notifications for the
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   668
                current user, allowing us to highlight it in the template.
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   669
        """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   670
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   671
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   672
            (collection, image, annotation, revision,) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   673
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   674
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   675
        context = self.get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   676
        context['collection'] = collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   677
        context['image'] = image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   678
        context['annotation'] = annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   679
        context['revision'] = revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   680
        context['tags_data'] = revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   681
        context['comment'] = revision.creation_comment.first()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   682
        if request.user.is_authenticated() and annotation.author == request.user:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   683
            ann_author_notified = Notification.objects.filter(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   684
                    recipient=request.user,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   685
                    action_object_content_type__app_label='iconolab',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   686
                    action_object_content_type__model='annotationrevision',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   687
                    action_object_object_id=revision.id,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   688
                    target_content_type__app_label='iconolab',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   689
                    target_content_type__model='annotation',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   690
                    target_object_id=annotation.id
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   691
                ).unread()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   692
            if ann_author_notified:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   693
                ann_author_notified.first().mark_as_read()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   694
                context['notified_revision'] = True
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   695
        if request.user.is_authenticated() and revision.author == request.user:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   696
            rev_author_notified = Notification.objects.filter(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   697
                    recipient=request.user,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   698
                    action_object_content_type__app_label='iconolab',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   699
                    action_object_content_type__model='annotationrevision',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   700
                    action_object_object_id=revision.id,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   701
                    target_content_type__app_label='iconolab',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   702
                    target_content_type__model='annotation',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   703
                    target_object_id=annotation.id
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   704
                ).unread()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   705
            if rev_author_notified:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   706
                rev_author_notified.first().mark_as_read()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   707
                context['notified_revision'] = True
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   708
        return render(request, 'iconolab/detail_revision.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   709
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   710
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   711
class MergeProposalView(View, ContextMixin, IconolabObjectView):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   712
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   713
        View that displays the merge form, used when a user wants to "study" a revision because it was submitted from an older revision than the current revision (thus
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   714
        the two revisions don't have the same parents and there is a conflict)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   715
    """
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   716
    def get_context_data(self, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   717
        context = super(MergeProposalView, self).get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   718
        context['collection_name'] = self.kwargs.get('collection_name', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   719
        context['image_guid'] = self.kwargs.get('image_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   720
        context['annotation_guid'] = self.kwargs.get('annotation_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   721
        context['revision_guid'] = self.kwargs.get('revision_guid', '')
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   722
        return context
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   723
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   724
    def get(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   725
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   726
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   727
            (collection, image, annotation, revision,) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   728
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   729
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   730
        # Only show merge form if there is a revision to merge AND the current user is the annotation author
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   731
        if revision.state != AnnotationRevision.AWAITING or request.user != annotation.author:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   732
            return RedirectView.as_view(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   733
                url=reverse('revision_detail',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   734
                    kwargs={
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   735
                        'collection_name': collection.name,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   736
                        'image_guid': image.image_guid,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   737
                        'annotation_guid': annotation.annotation_guid,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   738
                        'revision_guid': revision.revision_guid
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   739
                    }
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   740
                )
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   741
            )(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   742
        # Auto-accepts the revision only if the proper query arg is set and only if the revision parent is the current revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   743
        if 'auto_accept' in request.GET and request.GET['auto_accept'] in ['True', 'true', '1', 'yes'] and revision.parent_revision == annotation.current_revision:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   744
            annotation.validate_existing_revision(revision)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   745
            return RedirectView.as_view(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   746
                url=reverse('annotation_detail',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   747
                    kwargs={
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   748
                        'collection_name': collection.name,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   749
                        'image_guid': image.image_guid,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   750
                        'annotation_guid': annotation.annotation_guid
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   751
                    }
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   752
                )
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   753
            )(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   754
        # Auto-reject the revision only if the proper query arg is set
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   755
        if 'auto_reject' in request.GET and request.GET['auto_reject'] in ['True', 'true', '1', 'yes']:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   756
            annotation.reject_existing_revision(revision)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   757
            return RedirectView.as_view(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   758
                url=reverse('annotation_detail',
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   759
                    kwargs={
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   760
                        'collection_name': collection.name,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   761
                        'image_guid': image.image_guid,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   762
                        'annotation_guid': annotation.annotation_guid
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   763
                    }
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   764
                )
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   765
            )(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   766
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   767
        context = self.get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   768
        context['collection'] = collection
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   769
        context['image'] = image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   770
        context['annotation'] = annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   771
        # Proposal data
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   772
        context['proposal_revision'] = revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   773
        context['proposal_tags_data'] = revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   774
        context['proposal_comment'] = revision.creation_comment.first()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   775
        # Parent data
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   776
        context['parent_revision'] = revision.parent_revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   777
        context['parent_tags_data'] = revision.parent_revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   778
        context['parent_comment'] = revision.parent_revision.creation_comment.first()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   779
        # Current data
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   780
        context['current_revision'] = annotation.current_revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   781
        context['current_tags_data'] = annotation.current_revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   782
        context['current_comment'] = annotation.current_revision.creation_comment.first()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   783
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   784
        merge_form = AnnotationRevisionForm(instance=revision)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   785
        context['merge_form'] = merge_form
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   786
        return render(request, 'iconolab/merge_revision.html', context)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   787
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   788
    def post(self, request, *args, **kwargs):
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   789
        # Handle merge form submit here
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   790
        success, result = self.check_kwargs(kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   791
        if success:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   792
            (collection, image, annotation, revision) = result
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   793
        else:
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   794
            return result(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   795
        collection_name = kwargs['collection_name']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   796
        image_guid = kwargs['image_guid']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   797
        annotation_guid = kwargs['annotation_guid']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   798
        revision_guid = kwargs['revision_guid']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   799
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   800
        merge_revision_form = AnnotationRevisionForm(request.POST)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   801
        if merge_revision_form.is_valid():
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   802
            revision_title = merge_revision_form.cleaned_data['title']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   803
            revision_description = merge_revision_form.cleaned_data['description']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   804
            revision_fragment = merge_revision_form.cleaned_data['fragment']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   805
            revision_tags_json = merge_revision_form.cleaned_data['tags']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   806
            new_revision = annotation.merge_existing_revision(revision_title, revision_description, revision_fragment, revision_tags_json, revision)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   807
            revision_comment = merge_revision_form.cleaned_data['comment']
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   808
            comment = IconolabComment.objects.create(
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   809
                comment = revision_comment,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   810
                revision = new_revision,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   811
                content_type = ContentType.objects.get(app_label='iconolab', model='annotation'),
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   812
                content_object = annotation,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   813
                site = Site.objects.get(id=settings.SITE_ID),
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   814
                object_pk = annotation.id,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   815
                user = request.user,
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   816
                user_name = request.user.username
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   817
            )
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   818
            return RedirectView.as_view(url=reverse('annotation_detail', kwargs={'collection_name': collection_name, 'image_guid': image_guid, 'annotation_guid': annotation_guid}))(request)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   819
        context = self.get_context_data(**kwargs)
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   820
        context['image'] = image
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   821
        context['merge_form'] = merge_revision_form
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   822
        context['annotation'] = annotation
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   823
        # Proposal data
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   824
        context['proposal_revision'] = revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   825
        context['proposal_tags_data'] = revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   826
        context['proposal_comment'] = revision.creation_comment.first()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   827
        # Parent data
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   828
        context['parent_revision'] = revision.parent_revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   829
        context['parent_tags_data'] = revision.parent_revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   830
        context['parent_comment'] = revision.parent_revision.creation_comment.first()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   831
        # Current data
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   832
        context['current_revision'] = annotation.current_revision
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   833
        context['current_tags_data'] = annotation.current_revision.get_tags_json()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   834
        context['current_comment'] = annotation.current_revision.creation_comment.first()
97b805fc88f0 force unix line ending
ymh <ymh.work@gmail.com>
parents: 288
diff changeset
   835
        return render(request, 'iconolab/merge_revision.html', context)