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) |