summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2016-05-19 01:38:17 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2016-05-19 01:38:17 +0200
commit7ff90a0ac951720a3c2d23aca7f2af6ffdf1b7e3 (patch)
tree95813f81c745f30839c4febba1990a85d7ab6d08
parent34f93c2502c4048badae52bc9527cc213bba94a0 (diff)
downloadIshtar-7ff90a0ac951720a3c2d23aca7f2af6ffdf1b7e3.tar.bz2
Ishtar-7ff90a0ac951720a3c2d23aca7f2af6ffdf1b7e3.zip
Manage basket content
-rw-r--r--archaeological_files/ishtar_menu.py2
-rw-r--r--archaeological_finds/forms.py31
-rw-r--r--archaeological_finds/ishtar_menu.py10
-rw-r--r--archaeological_finds/models.py12
-rw-r--r--archaeological_finds/urls.py19
-rw-r--r--archaeological_finds/views.py82
-rw-r--r--ishtar_common/templates/ishtar/basket_list.html5
-rw-r--r--ishtar_common/templates/ishtar/manage_basket.html38
-rw-r--r--ishtar_common/templates/ishtar/simple_form.html11
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>