diff options
Diffstat (limited to 'archaeological_finds/forms.py')
| -rw-r--r-- | archaeological_finds/forms.py | 278 | 
1 files changed, 249 insertions, 29 deletions
| diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index fbcc32013..5ca8618d5 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -26,12 +26,13 @@ import logging  from django import forms  from django.core import validators  from django.core.exceptions import PermissionDenied +from django.db.models import Q  from django.forms.formsets import formset_factory  from django.utils.translation import ugettext_lazy as _  import models  from archaeological_context_records.models import DatingType, DatingQuality, \ -    ContextRecord, RelationType as CRRelationType +    ContextRecord, RelationType as CRRelationType, Dating  from archaeological_finds.forms_treatments import TreatmentSelect, \      TreatmentFormSelection, BaseTreatmentForm, TreatmentModifyForm, \      AdministrativeActTreatmentForm, TreatmentFormFileChoice, \ @@ -43,7 +44,7 @@ from archaeological_finds.forms_treatments import TreatmentSelect, \      AdministrativeActTreatmentFileFormSelection, \      AdministrativeActTreatmentFileModifForm, \      DashboardForm as DashboardTreatmentForm, \ -    DashboardTreatmentFileForm +    DashboardTreatmentFileForm, QAFindTreatmentForm  from archaeological_operations.models import Period, ArchaeologicalSite, \      RelationType as OpeRelationType  from archaeological_operations.widgets import OAWidget @@ -52,7 +53,7 @@ from bootstrap_datepicker.widgets import DatePicker  from ishtar_common import widgets  from ishtar_common.forms import CustomForm, CustomFormSearch, FormSet, \      FloatField, reverse_lazy, TableSelect, get_now, FinalForm, \ -    ManageOldType, FieldType, IshtarForm, FormHeader +    ManageOldType, FieldType, IshtarForm, FormHeader, QAForm, HistorySelect  from ishtar_common.forms_common import get_town_field  from ishtar_common.models import valid_id, valid_ids, get_current_profile, \      SpatialReferenceSystem, Area, OperationType @@ -71,7 +72,7 @@ __all__ = [      'AdministrativeActTreatmentFileModifForm',      'DashboardTreatmentForm', 'DashboardTreatmentFileForm',      'RecordFormSelection', 'FindForm', 'DateForm', 'DatingFormSet', -    'PreservationForm', +    'PreservationForm', 'FindBasketFormSelection', 'FindBasketForm',      'FindSelect', 'FindFormSelection', 'FindFormSelectionWarehouseModule',      'MultipleFindFormSelection', 'MultipleFindFormSelectionWarehouseModule',      'FindMultipleFormSelection', 'check_form', 'check_exist', 'check_not_exist', @@ -79,6 +80,8 @@ __all__ = [      'check_treatment', 'ResultFindForm', 'ResultFindFormSet',      'FindDeletionForm', 'UpstreamFindFormSelection', 'NewFindBasketForm',      'SelectFindBasketForm', 'DeleteFindBasketForm', 'FindBasketAddItemForm', +    'QAFindFormSingle', 'QAFindFormMulti', 'QAFindBasketForm', +    'QAFindTreatmentForm'  ]  logger = logging.getLogger(__name__) @@ -207,24 +210,24 @@ class FindForm(CustomForm, ManageOldType):      dimensions_comment = forms.CharField(          label=_(u"Dimensions comment"), required=False, widget=forms.Textarea) -    HEADERS['get_first_base_find__topographic_localisation'] = FormHeader( +    HEADERS['get_first_base_find__x'] = FormHeader(          _(u"Coordinates")) -    get_first_base_find__topographic_localisation = forms.CharField( -        label=_(u"Point of topographic reference"), -        required=False, max_length=120 -    )      get_first_base_find__x = forms.FloatField(label=_(u"X"), required=False) -    get_first_base_find__y = forms.FloatField(label=_(u"Y"), required=False) -    get_first_base_find__z = forms.FloatField(label=_(u"Z"), required=False) -    get_first_base_find__spatial_reference_system = \ -        forms.ChoiceField(label=_(u"Spatial Reference System"), required=False, -                          choices=[])      get_first_base_find__estimated_error_x = \          forms.FloatField(label=_(u"Estimated error for X"), required=False) +    get_first_base_find__y = forms.FloatField(label=_(u"Y"), required=False)      get_first_base_find__estimated_error_y = \          forms.FloatField(label=_(u"Estimated error for Y"), required=False) +    get_first_base_find__z = forms.FloatField(label=_(u"Z"), required=False)      get_first_base_find__estimated_error_z = \          forms.FloatField(label=_(u"Estimated error for Z"), required=False) +    get_first_base_find__spatial_reference_system = \ +        forms.ChoiceField(label=_(u"Spatial Reference System"), required=False, +                          choices=[]) +    get_first_base_find__topographic_localisation = forms.CharField( +        label=_(u"Point of topographic reference"), +        required=False, max_length=120 +    )      HEADERS['checked_type'] = FormHeader(_(u"Sheet"))      checked_type = forms.ChoiceField(label=_(u"Check"), required=False) @@ -315,20 +318,197 @@ class FindForm(CustomForm, ManageOldType):          return self.cleaned_data +class QAFindFormMulti(QAForm): +    form_admin_name = _(u"Find - Quick action - Modify") +    form_slug = "find-quickaction-modify" +    base_models = ['get_first_base_find', 'qa_object_types', +                   'qa_material_types', 'qa_communicabilities'] +    associated_models = { +        'qa_material_types': models.MaterialType, +        'qa_object_types': models.ObjectType, +        'qa_communicabilities': models.CommunicabilityType, +        'qa_checked_type': models.CheckedType, +        'qa_period': Period +    } + +    MULTI = True +    REPLACE_FIELDS = [ +        'qa_ue', 'qa_manufacturing_place', 'qa_checked_type', 'qa_check_date' +    ] + +    HEADERS = { +        'qa_ue': FormHeader(_(u"Context record")), +        'qa_label': FormHeader(_(u"Identification")), +        'qa_description': FormHeader(_(u"Description")), +        'qa_checked_type': FormHeader(_(u"Sheet")), +        'qa_period': FormHeader(_(u"Datation")), +    } + +    SINGLE_FIELDS = [ +        'qa_label', 'qa_denomination', 'qa_previous_id', +        'qa_get_first_base_find__excavation_id', 'qa_museum_id', +        'qa_seal_number', 'qa_mark' +    ] +    qa_ue = forms.IntegerField( +        label=_(u"Context record"), +        widget=widgets.JQueryAutoComplete( +            reverse_lazy('autocomplete-contextrecord'), +            associated_model=ContextRecord), +        validators=[valid_id(ContextRecord)], required=False) + +    qa_label = forms.CharField( +        label=_(u"Free ID"), +        validators=[validators.MaxLengthValidator(60)], required=False) +    qa_denomination = forms.CharField(label=_(u"Denomination"), required=False) +    qa_previous_id = forms.CharField(label=_("Previous ID"), required=False) +    qa_get_first_base_find__excavation_id = forms.CharField( +        label=_(u"Excavation ID"), required=False) +    qa_museum_id = forms.CharField(label=_(u"Museum ID"), required=False) +    qa_seal_number = forms.CharField(label=_(u"Seal number"), required=False) +    qa_mark = forms.CharField(label=_(u"Mark"), required=False) + +    qa_description = forms.CharField( +        label=_(u"Description"), widget=forms.Textarea, required=False) +    qa_material_types = widgets.Select2MultipleField( +        label=_(u"Material types"), required=False +    ) +    qa_object_types = widgets.Select2MultipleField( +        label=_(u"Object types"), required=False, +    ) +    qa_manufacturing_place = forms.CharField( +        label=_(u"Manufacturing place"), required=False) +    qa_communicabilities = widgets.Select2MultipleField( +        label=_(u"Communicability"), required=False +    ) +    qa_comment = forms.CharField( +        label=_(u"Comment"), required=False, +        widget=forms.Textarea) + +    qa_checked_type = forms.ChoiceField(label=_(u"Check"), required=False) +    qa_check_date = forms.DateField( +        label=_(u"Check date"), widget=DatePicker, required=False) + +    qa_period = widgets.Select2MultipleField( +        label=_("Period"), choices=[], required=False) +    qa_dating_comment = forms.CharField( +        label=_(u"Comment on dating"), required=False, +        widget=forms.Textarea) + +    TYPES = [ +        FieldType('qa_material_types', models.MaterialType, is_multiple=True), +        FieldType('qa_object_types', models.ObjectType, is_multiple=True), +        FieldType('qa_communicabilities', models.CommunicabilityType, +                  is_multiple=True), +        FieldType('qa_checked_type', models.CheckedType), +        FieldType('qa_period', Period, is_multiple=True), +    ] + +    def _get_qa_ue(self, value): +        try: +            value = ContextRecord.objects.get(pk=value).cached_label +        except ContextRecord.DoesNotExist: +            return "" +        return value + +    def _set_qa_ue(self, item, user): +        ue = self.cleaned_data['qa_ue'] +        if not ue: +            return +        cr = ContextRecord.objects.get(pk=ue) +        bf = item.get_first_base_find() +        bf.context_record = cr +        bf.history_modifier = user +        bf.save() + +    def _set_qa_period(self, item, user): +        periods = self.cleaned_data['qa_period'] +        if not periods: +            return +        for period in periods: +            if Dating.objects.filter(find=item, period__pk=period).count(): +                continue +            d = Dating.objects.create(period_id=period) +            item.datings.add(d) + + +class QAFindFormSingle(QAFindFormMulti): +    MULTI = False +    form_admin_name = _(u"Find - Quick action - Modify single") +    form_slug = "find-quickaction-modifysingle" + +    def __init__(self, *args, **kwargs): +        super(QAFindFormSingle, self).__init__(*args, **kwargs) +        if not self.items or \ +                not self.items[0].get_first_base_find( +                ).context_record.operation.operation_type.judiciary: +            self.fields.pop('qa_seal_number') + + +class QAFindBasketForm(IshtarForm): +    create_or_update = forms.ChoiceField( +        choices=(('create', _(u"Create")), +                 ('update', _(u"Update"))), initial='create') +    label = forms.CharField(label="", max_length=None, required=False) +    basket = forms.ChoiceField(label=_(u"Basket"), required=False, choices=[]) + +    def __init__(self, *args, **kwargs): +        self.user = None +        if 'user' in kwargs: +            self.user = kwargs.pop('user') +            if hasattr(self.user, 'ishtaruser'): +                self.user = self.user.ishtaruser +        self.items = kwargs.pop('items') + +        super(QAFindBasketForm, 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) +        ] + +    def clean(self): +        if self.cleaned_data['create_or_update'] == 'update': +            if not self.cleaned_data['basket']: +                raise forms.ValidationError( +                    _(u"On update, you have to select a basket.")) +            return self.cleaned_data +        label = self.cleaned_data['label'].strip() +        if not label: +            raise forms.ValidationError(_(u"A label is required.")) +        if models.FindBasket.objects.filter(user=self.user, +                                            label=label).count(): +            raise forms.ValidationError(_(u"A basket with this label already " +                                          u"exists.")) +        return self.cleaned_data + +    def save(self, items): +        if self.cleaned_data['create_or_update'] == 'update': +            basket = models.FindBasket.objects.get( +                user=self.user, pk=self.cleaned_data['basket']) +        else: +            label = self.cleaned_data['label'].strip() +            basket = models.FindBasket.objects.create( +                user=self.user, label=label) +        for item in items: +            basket.items.add(item) + +  class PreservationForm(CustomForm, ManageOldType):      form_label = _("Preservation")      form_admin_name = _(u"Find - 030 - Preservation")      form_slug = "find-030-preservation"      base_models = ['alteration', 'alteration_cause',                     'preservation_to_consider', 'integritie', 'remarkabilitie'] -    associated_models = {'alteration': models.AlterationType, -                         'alteration_cause': models.AlterationCauseType, -                         'treatment_emergency': models.TreatmentEmergencyType, -                         'conservatory_state': models.ConservatoryState, -                         'preservation_to_consider': models.TreatmentType, -                         'remarkabilitie': models.RemarkabilityType, -                         'integritie': models.IntegrityType, -                         } +    associated_models = { +        'alteration': models.AlterationType, +        'alteration_cause': models.AlterationCauseType, +        'treatment_emergency': models.TreatmentEmergencyType, +        'conservatory_state': models.ConservatoryState, +        'preservation_to_consider': models.TreatmentType, +        'remarkabilitie': models.RemarkabilityType, +        'integritie': models.IntegrityType, +    }      integritie = forms.MultipleChoiceField(          label=_(u"Integrity / interest"), choices=[],          widget=widgets.Select2Multiple, required=False) @@ -406,7 +586,7 @@ DatingFormSet.form_admin_name = _(u"Find - 040 - Dating")  DatingFormSet.form_slug = "find-040-dating" -class FindSelect(CustomForm, TableSelect): +class FindSelect(HistorySelect):      _model = models.Find      form_admin_name = _(u"Find - 001 - Search") @@ -545,7 +725,7 @@ class FindFormSelection(CustomFormSearch):          label="", required=False,          widget=widgets.DataTable(              reverse_lazy('get-find'), -            FindSelect, models.Find, +           FindSelect, models.Find,              source_full=reverse_lazy('get-find-full')),          validators=[valid_id(models.Find)]) @@ -739,6 +919,43 @@ class UpstreamFindFormSelection(FindFormSelection):          self.fields['resulting_pk'] = self.fields.pop('pk') +class FindBasketSelect(CustomForm, TableSelect): +    _model = models.FindBasket + +    form_admin_name = _(u"Find basket - 001 - Search") +    form_slug = "findbasket-001-search" +    search_vector = forms.CharField( +        label=_(u"Full text search"), widget=widgets.SearchWidget( +            'archaeological-finds', 'findbasket' +        )) + +    label = forms.CharField(label=_(u"Denomination")) + + +class FindBasketFormSelection(CustomFormSearch): +    SEARCH_AND_SELECT = True +    form_label = _("Basket search") +    associated_models = {'pk': models.FindBasket} +    currents = {'pk': models.FindBasket} + +    pk = forms.IntegerField( +        label="", required=False, +        widget=widgets.DataTable( +            reverse_lazy('get-findbasket'), +            FindBasketSelect, models.FindBasket, +        ), +        validators=[valid_id(models.FindBasket)]) + + +class FindBasketForm(IshtarForm): +    form_label = _(u"Find basket") +    label = forms.CharField( +        label=_(u"Label"), +        validators=[validators.MaxLengthValidator(1000)]) +    comment = forms.CharField(label=_(u"Comment"), +                              widget=forms.Textarea, required=False) + +  class NewFindBasketForm(forms.ModelForm):      class Meta:          model = models.FindBasket @@ -780,7 +997,9 @@ class SelectFindBasketForm(IshtarForm):              return          self.fields['basket'].choices = [('', '--')] + [              (b.pk, unicode(b)) -            for b in models.FindBasket.objects.filter(user=self.user)] +            for b in models.FindBasket.objects.filter( +                Q(user=self.user) | Q(shared_with=self.user) +            )]  class DeleteFindBasketForm(SelectFindBasketForm): @@ -800,8 +1019,9 @@ class FindBasketAddItemForm(forms.Form):      def save(self, user):          try: -            basket = models.FindBasket.objects.get( -                pk=self.cleaned_data['basket_id'], user=user) +            basket = models.FindBasket.objects.filter( +                Q(user=user) | Q(shared_with=user) +            ).get(pk=self.cleaned_data['basket_id'])              item = models.Find.objects.get(                  pk=self.cleaned_data['item_id'])          except models.FindBasket.DoesNotExist or\ @@ -810,8 +1030,8 @@ class FindBasketAddItemForm(forms.Form):              raise PermissionDenied          # check rights          if not user.user_ptr.is_superuser and \ -                not user.has_right('change_find') and \ -                not (user.has_right('change_own_find') +                not user.has_right('view_find') and \ +                not (user.has_right('view_own_find')                       and item.is_own(user)):              raise PermissionDenied          basket.items.add(item) | 
