diff options
Diffstat (limited to 'archaeological_finds/forms.py')
-rw-r--r-- | archaeological_finds/forms.py | 274 |
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 """ #################################### |