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