diff options
| -rw-r--r-- | archaeological_files/ishtar_menu.py | 2 | ||||
| -rw-r--r-- | archaeological_finds/forms.py | 31 | ||||
| -rw-r--r-- | archaeological_finds/ishtar_menu.py | 10 | ||||
| -rw-r--r-- | archaeological_finds/models.py | 12 | ||||
| -rw-r--r-- | archaeological_finds/urls.py | 19 | ||||
| -rw-r--r-- | archaeological_finds/views.py | 82 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/basket_list.html | 5 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/manage_basket.html | 38 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/simple_form.html | 11 | 
9 files changed, 198 insertions, 12 deletions
| diff --git a/archaeological_files/ishtar_menu.py b/archaeological_files/ishtar_menu.py index 326fec23b..dfff7d0ab 100644 --- a/archaeological_files/ishtar_menu.py +++ b/archaeological_files/ishtar_menu.py @@ -1,6 +1,6 @@  #!/usr/bin/env python  # -*- coding: utf-8 -*- -# Copyright (C) 2010-2014 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2016 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet>  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU Affero General Public License as diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 3c06af375..95af01719 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -24,6 +24,7 @@ Finds forms definitions  from django import forms  from django.conf import settings  from django.core import validators +from django.core.exceptions import PermissionDenied  from django.forms.formsets import formset_factory  from django.utils.safestring import mark_safe  from django.utils.translation import ugettext_lazy as _ @@ -412,16 +413,18 @@ class NewFindBasketForm(forms.ModelForm):          return super(NewFindBasketForm, self).save(commit) -class DeleteFindBasketForm(forms.Form): +class SelectFindBasketForm(forms.Form):      basket = forms.ChoiceField(label=_(u"Basket"), required=True, choices=[])      def __init__(self, *args, **kwargs):          self.user = kwargs.pop('user') -        super(DeleteFindBasketForm, self).__init__(*args, **kwargs) +        super(SelectFindBasketForm, self).__init__(*args, **kwargs)          self.fields['basket'].choices = [('', '--')] + [              (b.pk, unicode(b))              for b in models.FindBasket.objects.filter(user=self.user)] + +class DeleteFindBasketForm(SelectFindBasketForm):      def save(self):          try:              models.FindBasket.objects.get(pk=self.cleaned_data['basket'], @@ -431,6 +434,30 @@ class DeleteFindBasketForm(forms.Form):              pass          return + +class FindBasketAddItemForm(forms.Form): +    basket_id = forms.IntegerField(required=True) +    item_id = forms.IntegerField(required=True) + +    def save(self, user): +        try: +            basket = models.FindBasket.objects.get( +                pk=self.cleaned_data['basket_id'], user=user.ishtaruser) +            item = models.Find.objects.get( +                pk=self.cleaned_data['item_id']) +        except models.FindBasket.DoesNotExist or\ +                models.Find.DoesNotExist: +            # something strange... TODO: log it +            raise PermissionDenied +        # check rights +        if not user.is_superuser and \ +                not user.ishtaruser.has_right('change_find') and \ +                not (user.ishtaruser.has_right('change_own_find') +                     and item.is_own(user)): +            raise PermissionDenied +        basket.items.add(item) +        return basket +  """  ####################################  # Source management for treatments # diff --git a/archaeological_finds/ishtar_menu.py b/archaeological_finds/ishtar_menu.py index 9eaf601f2..d7a67091a 100644 --- a/archaeological_finds/ishtar_menu.py +++ b/archaeological_finds/ishtar_menu.py @@ -1,6 +1,6 @@  #!/usr/bin/env python  # -*- coding: utf-8 -*- -# Copyright (C) 2012-2015 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2012-2016 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet>  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU Affero General Public License as @@ -64,13 +64,7 @@ MENU_SECTIONS = [                                access_controls=['change_find',                                                 'change_own_find']),                       MenuItem('find_basket_modification_add', -                              _(u"Add items"), -                              model=models.FindBasket, -                              access_controls=[ -                                  'change_find', -                                  'change_own_find']), -                     MenuItem('find_basket_modification_del', -                              _(u"Delete items"), +                              _(u"Manage items"),                                model=models.FindBasket,                                access_controls=[                                    'change_find', diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index bd446235b..068debdb0 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -372,6 +372,18 @@ class Find(BaseHistorizedItem, ImageModel, OwnPerms, ShortMenuItem):          return u" - ".join([base_find.name                              for base_find in self.base_finds.all()]) +    @property +    def full_label(self): +        lbl = u" - ".join([ +            getattr(self, attr) +            for attr in ('label', 'administrative_index') +            if getattr(self, attr)]) +        base = u" - ".join([base_find.complete_id() +                            for base_find in self.base_finds.all()]) +        if base: +            lbl += ' ({})'.format(base) +        return lbl +      def get_first_base_find(self):          q = self.base_finds          if not q.count(): diff --git a/archaeological_finds/urls.py b/archaeological_finds/urls.py index 12c8c0b25..4629a38a5 100644 --- a/archaeological_finds/urls.py +++ b/archaeological_finds/urls.py @@ -58,6 +58,25 @@ urlpatterns = patterns(      url(r'^find_basket_creation/$',          check_rights(['change_find', 'change_own_find'])(              views.NewFindBasketView.as_view()), name='new_findbasket'), +    url(r'^find_basket_creation/$', +        check_rights(['change_find', 'change_own_find'])( +            views.NewFindBasketView.as_view()), name='new_findbasket'), +    url(r'^find_basket_modification_add/$', +        check_rights(['change_find', 'change_own_find'])( +            views.SelectBasketForAdd.as_view()), +        name='select_findbasketforadd'), +    url(r'^find_basket_modification_add/(?P<pk>[0-9]+)?/$', +        check_rights(['change_find', 'change_own_find'])( +            views.SelectItemsInBasket.as_view()), +        name='select_itemsinbasket'), +    url(r'^find_basket_modification_add_item/$', +        check_rights(['change_find', 'change_own_find'])( +            views.FindBasketAddItemView.as_view()), +        name='add_iteminbasket'), +    url(r'^find_basket_list/(?P<pk>[0-9]+)?/$', +        check_rights(['change_find', 'change_own_find'])( +            views.FindBasketListView.as_view()), +        name='list_iteminbasket'),      url(r'^find_basket_deletion/$',          check_rights(['change_find', 'change_own_find'])(              views.DeleteFindBasketView.as_view()), name='delete_findbasket'), diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index b079af200..a43ebaa12 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -17,10 +17,12 @@  # See the file COPYING for details. +from django.core.exceptions import PermissionDenied  from django.core.urlresolvers import reverse  from django.http import HttpResponseRedirect  from django.shortcuts import redirect  from django.utils.translation import ugettext_lazy as _ +from django.views.generic import TemplateView  from django.views.generic.edit import CreateView, FormView  from ishtar_common.forms import FinalForm @@ -172,13 +174,91 @@ class NewFindBasketView(IshtarMixin, LoginRequiredMixin, CreateView):          return kwargs      def get_success_url(self): -        return reverse('new_findbasket') +        return reverse('select_itemsinbasket', +                       kwargs={'pk': self.object.pk})      def form_valid(self, form):          self.object = form.save()          return HttpResponseRedirect(self.get_success_url()) +class SelectBasketForAdd(IshtarMixin, LoginRequiredMixin, FormView): +    template_name = 'ishtar/form.html' +    form_class = SelectFindBasketForm +    page_name = _(u"Add items to basket") + +    def get_form_kwargs(self): +        kwargs = super(SelectBasketForAdd, self).get_form_kwargs() +        kwargs['user'] = IshtarUser.objects.get(pk=self.request.user.pk) +        if 'pk' in self.kwargs: +            kwargs['initial'].update({'basket': self.kwargs['pk']}) +        return kwargs + +    def get_success_url(self, basket): +        return reverse('select_itemsinbasket', +                       kwargs={'pk': basket}) + +    def form_valid(self, form): +        return HttpResponseRedirect(self.get_success_url( +            form.cleaned_data['basket'])) + + +class SelectItemsInBasket(IshtarMixin, LoginRequiredMixin, TemplateView): +    template_name = 'ishtar/manage_basket.html' +    page_name = _(u"Manage basket") + +    def get_context_data(self, *args, **kwargs): +        context = super(SelectItemsInBasket, self).get_context_data( +            *args, **kwargs) +        self.user = IshtarUser.objects.get(pk=self.request.user.pk) +        try: +            self.basket = models.FindBasket.objects.get( +                pk=self.kwargs['pk'], user=self.user) +        except models.FindBasket.DoesNotExist: +            raise PermissionDenied +        context['basket'] = self.basket +        context['form'] = FindFormSelection() +        context['add_url'] = reverse('add_iteminbasket') +        context['list_url'] = reverse('list_iteminbasket', +                                      kwargs={'pk': self.basket.pk}) +        return context + +    def form_valid(self, form): +        return HttpResponseRedirect(self.get_success_url()) + + +class FindBasketAddItemView(IshtarMixin, LoginRequiredMixin, FormView): +    template_name = 'ishtar/simple_form.html' +    form_class = FindBasketAddItemForm + +    def get_success_url(self, basket): +        return reverse('list_iteminbasket', kwargs={'pk': basket.pk}) + +    def form_valid(self, form): +        user = IshtarUser.objects.get(pk=self.request.user.pk) +        # rights are checked on the form +        basket = form.save(user) +        return HttpResponseRedirect(self.get_success_url(basket)) + + +class FindBasketListView(IshtarMixin, LoginRequiredMixin, TemplateView): +    template_name = 'ishtar/basket_list.html' + +    def get_context_data(self, *args, **kwargs): +        context = super(FindBasketListView, self).get_context_data( +            *args, **kwargs) +        self.user = IshtarUser.objects.get(pk=self.request.user.pk) +        try: +            self.basket = models.FindBasket.objects.get( +                pk=self.kwargs['pk'], user=self.user) +        except models.FindBasket.DoesNotExist: +            raise PermissionDenied +        context['basket'] = self.basket +        context['item_url'] = '/'.join( +            reverse(models.Find.SHOW_URL, args=[1]).split('/')[:-2]) +        return context + +  class DeleteFindBasketView(IshtarMixin, LoginRequiredMixin, FormView):      template_name = 'ishtar/form_delete.html'      form_class = DeleteFindBasketForm diff --git a/ishtar_common/templates/ishtar/basket_list.html b/ishtar_common/templates/ishtar/basket_list.html new file mode 100644 index 000000000..5a7af2bc6 --- /dev/null +++ b/ishtar_common/templates/ishtar/basket_list.html @@ -0,0 +1,5 @@ +{% load i18n %} +<ul>{% for item in basket.items.all %} +    <li> +        <a class="display_details" href="#" onclick="load_window('/show-find/{{item.pk}}/');">{% trans 'Details' %}</a> {{item.full_label}}</li>{% endfor %} +</ul> diff --git a/ishtar_common/templates/ishtar/manage_basket.html b/ishtar_common/templates/ishtar/manage_basket.html new file mode 100644 index 000000000..44c3a2536 --- /dev/null +++ b/ishtar_common/templates/ishtar/manage_basket.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} +{% load i18n inline_formset %} +{% block content %} +<h2>{{page_name}}{% trans ":"%} {{basket}}</h2> +<form enctype="multipart/form-data" action="." method="post">{% csrf_token %} +<div class='form'> +{{form}} +<button id='add_to' onclick='return false'>{% trans "Add" %}</button> +<h3>{% trans "Basket content" %}</h3> +<div id='basket-content' style='text-align:left'> +</div> +</div> +</form> +<script type='text/javascript' language='javascript'> + +function load_list(data){ +    $('#basket-content').html(data); +} + +$('#add_to').click(function(){ +    selected_item = jQuery("#grid_pk").getGridParam('selrow'); +    if(!selected_item) return false; +    $.ajax({ +        type: "POST", +        url: '{{add_url}}', +        data: { +            basket_id: {{basket.pk}}, +            item_id: selected_item +        }, +        success: load_list +    }); +    return false; +}); +jQuery(document).ready(function(){ +    $.get('{{list_url}}', load_list); +}); +</script> +{% endblock %} diff --git a/ishtar_common/templates/ishtar/simple_form.html b/ishtar_common/templates/ishtar/simple_form.html new file mode 100644 index 000000000..e3a464459 --- /dev/null +++ b/ishtar_common/templates/ishtar/simple_form.html @@ -0,0 +1,11 @@ +{% load i18n  %} +<html> +<body> +<div class='form'> +<form enctype="multipart/form-data" action="." method="post">{% csrf_token %} +{{form}} +<input type="submit" value="{% trans "Validate" %}"/> +</form> +</div> +</body> +</html> | 
