summaryrefslogtreecommitdiff
path: root/archaeological_finds/forms.py
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_finds/forms.py')
-rw-r--r--archaeological_finds/forms.py120
1 files changed, 118 insertions, 2 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py
index 3cfe13ea9..99907781b 100644
--- a/archaeological_finds/forms.py
+++ b/archaeological_finds/forms.py
@@ -24,13 +24,15 @@ 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 _
from ishtar_common.models import Person, valid_id, valid_ids
from archaeological_operations.models import Period, ArchaeologicalSite
-from archaeological_context_records.models import DatingType, DatingQuality
+from archaeological_context_records.models import DatingType, DatingQuality, \
+ ContextRecord
from archaeological_warehouse.models import Warehouse
import models
@@ -40,6 +42,38 @@ from ishtar_common.forms import FormSet, FloatField, \
from ishtar_common.forms_common import get_town_field, SourceSelect
+class RecordFormSelection(forms.Form):
+ form_label = _("Context record")
+ base_models = ['get_first_base_find']
+ associated_models = {'get_first_base_find__context_record': ContextRecord}
+ get_first_base_find__context_record = forms.IntegerField(
+ label=_(u"Context record"), required=False,
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-contextrecord'),
+ associated_model=ContextRecord),
+ validators=[valid_id(ContextRecord)])
+
+ def __init__(self, *args, **kwargs):
+ super(RecordFormSelection, self).__init__(*args, **kwargs)
+ # get the current operation and restrict search to it
+ cr_pk = None
+ if 'data' in kwargs and kwargs['data']:
+ cr_pk = kwargs['data'].get(
+ 'get_first_base_find__context_record')
+ if not cr_pk and 'initial' in kwargs and kwargs['initial']:
+ cr_pk = kwargs['initial'].get(
+ 'get_first_base_find__context_record')
+ if not cr_pk:
+ return
+ try:
+ cr = ContextRecord.objects.get(pk=cr_pk)
+ except ContextRecord.DoesNotExist:
+ return
+ widget = self.fields['get_first_base_find__context_record'].widget
+ widget.source = unicode(widget.source) + "?operation__pk={}".format(
+ cr.operation.pk)
+
+
class FindForm(forms.Form):
file_upload = True
form_label = _("Find")
@@ -217,6 +251,20 @@ class FindFormSelection(forms.Form):
validators=[valid_id(models.Find)])
+class MultipleFindFormSelection(forms.Form):
+ form_label = _("Find search")
+ associated_models = {'pk': models.Find}
+ currents = {'pk': models.Find}
+ pk = forms.IntegerField(
+ label="", required=False,
+ widget=widgets.JQueryJqGrid(
+ reverse_lazy('get-find'),
+ FindSelect, models.Find,
+ multiple_select=True,
+ source_full=reverse_lazy('get-find-full')),
+ validators=[valid_id(models.Find)])
+
+
class BaseTreatmentForm(forms.Form):
form_label = _(u"Base treatment")
associated_models = {'treatment_type': models.TreatmentType,
@@ -354,9 +402,77 @@ class FindSourceSelect(SourceSelect):
FindSourceFormSelection = get_form_selection(
'FindSourceFormSelection', _(u"Documentation search"), 'pk',
models.FindSource, FindSourceSelect, 'get-findsource',
- _(u"You should select a document."))
+ _(u"You should select a document."),
+ get_full_url='get-findsource-full')
+class NewFindBasketForm(forms.ModelForm):
+ class Meta:
+ model = models.FindBasket
+ fields = ('label', 'comment')
+
+ def __init__(self, *args, **kwargs):
+ self.user = kwargs.pop('user')
+ super(NewFindBasketForm, self).__init__(*args, **kwargs)
+
+ def clean(self):
+ q = models.FindBasket.objects.filter(user=self.user,
+ label=self.cleaned_data['label'])
+ if q.count():
+ raise forms.ValidationError(_(u"Another basket already exist with "
+ u"this name."))
+ return self.cleaned_data
+
+ def save(self, commit=True):
+ self.instance.user = self.user
+ return super(NewFindBasketForm, self).save(commit)
+
+
+class SelectFindBasketForm(forms.Form):
+ basket = forms.ChoiceField(label=_(u"Basket"), required=True, choices=[])
+
+ def __init__(self, *args, **kwargs):
+ self.user = kwargs.pop('user')
+ 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'],
+ user=self.user).delete()
+ except models.FindBasket.DoesNotExist:
+ # something strange... TODO: log it
+ 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 #