#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (C) 2010-2012 Étienne Loks # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # See the file COPYING for details. """ Finds forms definitions """ import datetime from django import forms from django.shortcuts import render_to_response from django.template import RequestContext from django.core import validators from django.core.exceptions import ObjectDoesNotExist from django.utils.safestring import mark_safe from django.db.models import Max from django.utils.translation import ugettext_lazy as _ from ishtar import settings from ishtar_common.models import Person, valid_id from archaeological_operations.models import Period, OperationType from archaeological_context_records.models import DatingType, DatingQuality from archaeological_warehouse.models import Warehouse, ContainerType, Container import models import widgets from forms import FinalForm, FormSet,\ FloatField, formset_factory, get_now, get_form_selection, reverse_lazy from forms_common import get_town_field, get_warehouse_field, SourceForm, \ SourceSelect, SourceDeletionForm, AuthorFormset from forms_context_records import RecordFormSelection class FindForm(forms.Form): form_label = _("Find") base_model = 'base_finds' associated_models = {'material_type':models.MaterialType,} label = forms.CharField(label=_(u"ID"), validators=[validators.MaxLengthValidator(60)]) description = forms.CharField(label=_("Description"), widget=forms.Textarea) base_finds__is_isolated = forms.NullBooleanField(label=_(u"Is isolated?"), required=False) material_type = forms.ChoiceField(label=_("Material type"), choices=models.MaterialType.get_types()) volume = FloatField(label=_(u"Volume (l)"), required=False) weight = FloatField(label=_(u"Weight (g)"), required=False) find_number = forms.IntegerField(label=_(u"Find number"), required=False) class DateForm(forms.Form): form_label = _("Dating") base_model = 'dating' associated_models = {'dating__dating_type':DatingType, 'dating__quality':DatingQuality, 'dating__period':Period} dating__period = forms.ChoiceField(label=_("Period"), choices=Period.get_types()) dating__start_date = forms.IntegerField(label=_(u"Start date"), required=False) dating__end_date = forms.IntegerField(label=_(u"End date"), required=False) dating__quality = forms.ChoiceField(label=_("Quality"), required=False, choices=DatingQuality.get_types()) dating__dating_type = forms.ChoiceField(label=_("Dating type"), required=False, choices=[]) def __init__(self, *args, **kwargs): super(DateForm, self).__init__(*args, **kwargs) self.fields['dating__dating_type'].choices = DatingType.get_types() self.fields['dating__dating_type'].help_text = DatingType.get_help() class FindSelect(forms.Form): base_finds__context_record__parcel__town = get_town_field() base_finds__context_record__operation__year = forms.IntegerField( label=_(u"Year")) base_finds__context_record__operation__code_patriarche = \ forms.IntegerField(label=_(u"Code PATRIARCHE")) dating__period = forms.ChoiceField(label=_(u"Period"), choices=[]) # TODO search by warehouse material_type = forms.ChoiceField(label=_(u"Material type"), choices=[]) base_finds__find__description = forms.CharField(label=_(u"Description")) base_finds__is_isolated = forms.NullBooleanField(label=_(u"Is isolated?")) def __init__(self, *args, **kwargs): super(FindSelect, self).__init__(*args, **kwargs) self.fields['dating__period'].choices = Period.get_types() self.fields['dating__period'].help_text = Period.get_help() self.fields['material_type'].choices = \ models.MaterialType.get_types() self.fields['material_type'].help_text = \ models.MaterialType.get_help() class FindFormSelection(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, source_full=reverse_lazy('get-find-full')), 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 FindMultipleFormSelection(forms.Form): form_label = _(u"Upstream finds") associated_models = {'finds':models.Find} associated_labels = {'finds':_(u"Finds")} finds = forms.CharField(label="", required=False, widget=widgets.JQueryJqGrid(reverse_lazy('get-find'), FindSelect(), models.Find, multiple=True, multiple_cols=[2, 3, 4]), validators=[valid_ids(models.Find)]) def clean(self): if not 'finds' in self.cleaned_data or not self.cleaned_data['finds']: raise forms.ValidationError(_(u"You should at least select one " u"archaeological find.")) return self.cleaned_data class ContainerForm(forms.Form): form_label = _(u"Container") reference = forms.CharField(label=_(u"Reference")) container_type = forms.ChoiceField(label=_(u"Container type"), choices=[]) location = forms.IntegerField(label=_(u"Warehouse"), widget=widgets.JQueryAutoComplete( reverse_lazy('autocomplete-warehouse'), associated_model=Warehouse, new=True), validators=[valid_id(Warehouse)]) comment = forms.CharField(label=_(u"Comment"), widget=forms.Textarea, required=False) def __init__(self, *args, **kwargs): super(ContainerForm, self).__init__(*args, **kwargs) self.fields['container_type'].choices = ContainerType.get_types() self.fields['container_type'].help_text = ContainerType.get_help() def save(self, user): dct = self.cleaned_data dct['history_modifier'] = user dct['container_type'] = ContainerType.objects.get( pk=dct['container_type']) dct['location'] = Warehouse.objects.get(pk=dct['location']) new_item = Container(**dct) new_item.save() return new_item 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): 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 + '-' + type_key not in \ 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]) return (not type_list or type in type_list) \ and type not in not_type_list except ValueError: return False return func class ResultFindForm(forms.Form): form_label = _(u"Resulting find") associated_models = {'material_type':models.MaterialType} label = forms.CharField(label=_(u"ID"), validators=[validators.MaxLengthValidator(60)]) description = forms.CharField(label=_(u"Precise description"), widget=forms.Textarea) material_type = forms.ChoiceField(label=_(u"Material type"), choices=models.MaterialType.get_types()) volume = forms.IntegerField(label=_(u"Volume (l)")) weight = forms.IntegerField(label=_(u"Weight (g)")) find_number = forms.IntegerField(label=_(u"Find number")) ResultFindFormSet = formset_factory(ResultFindForm, can_delete=True, formset=FormSet) ResultFindFormSet.form_label = _(u"Resulting finds") class UpstreamFindFormSelection(FindFormSelection): form_label = _(u"Upstream find") ############################################# # Source management for archaelogical finds # ############################################# SourceFindFormSelection = get_form_selection( 'SourceFindFormSelection', _(u"Archaelogical find search"), 'find', models.Find, FindSelect, 'get-find', _(u"You should select an archaelogical find.")) class FindSourceSelect(SourceSelect): find__base_finds__context_record__operation__year = forms.IntegerField( label=_(u"Year of the operation")) find__dating__period = forms.ChoiceField( label=_(u"Period of the archaelogical find"), choices=[]) find__material_type = forms.ChoiceField( label=_("Material type of the archaelogical find"), choices=models.MaterialType.get_types()) find__description = forms.CharField( label=_(u"Description of the archaelogical find")) def __init__(self, *args, **kwargs): super(FindSourceSelect, self).__init__(*args, **kwargs) self.fields['find__dating__period'].choices = Period.get_types() self.fields['find__dating__period'].help_text = Period.get_help() self.fields['find__material_type'].choices = \ models.MaterialType.get_types() self.fields['find__material_type'].help_text = \ models.MaterialType.get_help() FindSourceFormSelection = get_form_selection( 'FindSourceFormSelection', _(u"Documentation search"), 'pk', models.FindSource, FindSourceSelect, 'get-findsource', _(u"You should select a document.")) #################################### # Source management for treatments # #################################### SourceTreatementFormSelection = get_form_selection( 'SourceTreatmentFormSelection', _(u"Treatment search"), 'operation', models.Treatment, TreatmentSelect, 'get-treatment', _(u"You should select a treatment.")) class TreatmentSourceSelect(SourceSelect): operation__towns = get_town_field(label=_(u"Operation's town")) treatment__treatment_type = forms.ChoiceField(label=_(u"Operation type"), choices=[]) operation__year = forms.IntegerField(label=_(u"Operation's year")) def __init__(self, *args, **kwargs): super(OperationSourceSelect, self).__init__(*args, **kwargs) self.fields['operation__operation_type'].choices = \ OperationType.get_types() self.fields['operation__operation_type'].help_text = \ OperationType.get_help() """ OperationSourceFormSelection = get_form_selection( 'OperationSourceFormSelection', _(u"Documentation search"), 'pk', models.OperationSource, OperationSourceSelect, 'get-operationsource', _(u"You should select a document.")) operation_source_modification_wizard = OperationSourceWizard([ ('selec-operation_source_modification', OperationSourceFormSelection), ('source-operation_source_modification', SourceForm), ('authors-operation_source_modification', AuthorFormset), ('final-operation_source_modification', FinalForm)], url_name='operation_source_modification',) class OperationSourceDeletionWizard(DeletionWizard): model = models.OperationSource fields = ['operation', 'title', 'source_type', 'authors',] operation_source_deletion_wizard = OperationSourceDeletionWizard([ ('selec-operation_source_deletion', OperationSourceFormSelection), ('final-operation_source_deletion', SourceDeletionForm)], url_name='operation_source_deletion',) """