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.py274
1 files changed, 238 insertions, 36 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py
index 3cfe13ea9..9a52882b2 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")
@@ -65,6 +99,9 @@ class FindForm(forms.Form):
model=models.MaterialType, label=_(u"Material type"), required=False)
conservatory_state = forms.ChoiceField(label=_(u"Conservatory state"),
choices=[], required=False)
+ conservatory_comment = forms.CharField(
+ label=_(u"Conservatory comment"), required=False,
+ widget=forms.Textarea)
object_type = widgets.MultipleAutocompleteField(
model=models.ObjectType, label=_(u"Object types"), required=False)
preservation_to_consider = forms.MultipleChoiceField(
@@ -79,6 +116,8 @@ class FindForm(forms.Form):
diameter = FloatField(label=_(u"Diameter (cm)"), required=False)
volume = FloatField(label=_(u"Volume (l)"), required=False)
weight = FloatField(label=_(u"Weight (g)"), required=False)
+ dimensions_comment = forms.CharField(
+ label=_(u"Dimensions comment"), required=False, widget=forms.Textarea)
find_number = forms.IntegerField(label=_(u"Find number"), required=False)
mark = forms.CharField(label=_(u"Mark"), required=False)
checked = forms.ChoiceField(label=_(u"Check"))
@@ -217,37 +256,18 @@ class FindFormSelection(forms.Form):
validators=[valid_id(models.Find)])
-class BaseTreatmentForm(forms.Form):
- form_label = _(u"Base treatment")
- associated_models = {'treatment_type': models.TreatmentType,
- 'person': Person,
- 'location': Warehouse}
- treatment_type = forms.ChoiceField(label=_(u"Treatment type"), choices=[])
- person = forms.IntegerField(
- label=_(u"Person"),
- widget=widgets.JQueryAutoComplete(
- reverse_lazy('autocomplete-person'), associated_model=Person,
- new=True),
- validators=[valid_id(Person)])
- location = forms.IntegerField(
- label=_(u"Location"),
- widget=widgets.JQueryAutoComplete(
- reverse_lazy('autocomplete-warehouse'), associated_model=Warehouse,
- new=True),
- validators=[valid_id(Warehouse)])
- description = forms.CharField(label=_(u"Description"),
- widget=forms.Textarea, required=False)
- start_date = forms.DateField(label=_(u"Start date"), required=False,
- widget=widgets.JQueryDate)
- end_date = forms.DateField(label=_(u"End date"), required=False,
- widget=widgets.JQueryDate)
-
- def __init__(self, *args, **kwargs):
- super(BaseTreatmentForm, self).__init__(*args, **kwargs)
- self.fields['treatment_type'].choices = models.TreatmentType.get_types(
- exclude=['packaging'])
- self.fields['treatment_type'].help_text = \
- models.TreatmentType.get_help(exclude=['packaging'])
+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 FindMultipleFormSelection(forms.Form):
@@ -268,13 +288,67 @@ class FindMultipleFormSelection(forms.Form):
return self.cleaned_data
+def check_exist(form_name, key):
+ def func(self):
+ request = self.request
+ storage = self.storage
+ if storage.prefix not in request.session or \
+ 'step_data' not in request.session[storage.prefix] or \
+ form_name not in request.session[storage.prefix]['step_data'] or\
+ form_name + '-' + key not in \
+ request.session[storage.prefix]['step_data'][form_name]:
+ return False
+ try:
+ val = request.session[storage.prefix][
+ 'step_data'][form_name][form_name + '-' + key]
+ if val and len(val) > 0:
+ val = val[0]
+ return bool(val)
+ except ValueError:
+ return False
+ return func
+
+
+def check_not_exist(form_name, key):
+ def func(self):
+ return not check_exist(form_name, key)(self)
+ return func
+
+
+def check_type_field(form_name, key, model, field):
+ def func(self):
+ request = self.request
+ storage = self.storage
+ if storage.prefix not in request.session or \
+ 'step_data' not in request.session[storage.prefix] or \
+ form_name not in request.session[storage.prefix]['step_data'] or\
+ form_name + '-' + key not in \
+ request.session[storage.prefix]['step_data'][form_name]:
+ return False
+ try:
+ val = model.objects.get(pk=request.session[storage.prefix][
+ 'step_data'][form_name][form_name + '-' + key][0])
+ return bool(getattr(val, field))
+ except (ValueError, model.DoesNotExist):
+ return False
+ return func
+
+
+def check_type_not_field(form_name, key, model, field):
+ def func(self):
+ return not check_type_field(form_name, key, model, field)(self)
+ return func
+
+
def check_treatment(form_name, type_key, type_list=[], not_type_list=[]):
type_list = [models.TreatmentType.objects.get(txt_idx=tpe).pk
for tpe in type_list]
not_type_list = [models.TreatmentType.objects.get(txt_idx=tpe).pk
for tpe in not_type_list]
- def func(self, request, storage):
+ def func(self):
+ request = self.request
+ storage = self.storage
if storage.prefix not in request.session or \
'step_data' not in request.session[storage.prefix] or \
form_name not in request.session[storage.prefix]['step_data'] or\
@@ -282,8 +356,11 @@ def check_treatment(form_name, type_key, type_list=[], not_type_list=[]):
request.session[storage.prefix]['step_data'][form_name]:
return False
try:
- type = int(request.session[storage.prefix]['step_data']
- [form_name][form_name + '-' + type_key])
+ tpe = request.session[storage.prefix][
+ 'step_data'][form_name][form_name + '-' + type_key]
+ if not tpe:
+ return False
+ type = int(tpe[0])
return (not type_list or type in type_list) \
and type not in not_type_list
except ValueError:
@@ -322,6 +399,10 @@ class FindDeletionForm(FinalForm):
class UpstreamFindFormSelection(FindFormSelection):
form_label = _(u"Upstream find")
+ def __init__(self, *args, **kwargs):
+ super(UpstreamFindFormSelection, self).__init__(*args, **kwargs)
+ self.fields['pk'].required = True
+
#############################################
# Source management for archaelogical finds #
#############################################
@@ -354,8 +435,129 @@ 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 = None
+ if 'user' in kwargs:
+ self.user = kwargs.pop('user')
+ super(SelectFindBasketForm, self).__init__(*args, **kwargs)
+ if not self.user:
+ return
+ 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
+
+
+class BaseTreatmentForm(SelectFindBasketForm):
+ form_label = _(u"Base treatment")
+ associated_models = {'treatment_type': models.TreatmentType,
+ 'person': Person,
+ 'location': Warehouse,
+ 'basket': models.FindBasket}
+ treatment_type = forms.ChoiceField(label=_(u"Treatment type"), choices=[])
+ person = forms.IntegerField(
+ label=_(u"Person"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-person'), associated_model=Person,
+ new=True),
+ validators=[valid_id(Person)])
+ location = forms.IntegerField(
+ label=_(u"Location"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-warehouse'), associated_model=Warehouse,
+ new=True),
+ validators=[valid_id(Warehouse)])
+ description = forms.CharField(label=_(u"Description"),
+ widget=forms.Textarea, required=False)
+ start_date = forms.DateField(label=_(u"Start date"), required=False,
+ widget=widgets.JQueryDate)
+ end_date = forms.DateField(label=_(u"End date"), required=False,
+ widget=widgets.JQueryDate)
+
+ def __init__(self, *args, **kwargs):
+ super(BaseTreatmentForm, self).__init__(*args, **kwargs)
+ self.fields['treatment_type'].choices = models.TreatmentType.get_types(
+ exclude=['packaging'])
+ self.fields['treatment_type'].help_text = \
+ models.TreatmentType.get_help(exclude=['packaging'])
+ self.fields['basket'].required = False
+ self.fields['basket'].help_text = \
+ _(u"Leave it blank if you want to select a single item")
+
+ def clean(self, *args, **kwargs):
+ try:
+ treatment = models.TreatmentType.objects.get(
+ pk=self.cleaned_data['treatment_type'], available=True)
+ except models.TreatmentType.DoesNotExist:
+ raise forms.ValidationError(_(u"This treatment type is not "
+ u"available."))
+ if treatment.upstream_is_many and \
+ not self.cleaned_data.get('basket'):
+ raise forms.ValidationError(_(u"This treatment needs a basket."))
+ return self.cleaned_data
"""
####################################