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