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