diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-10-20 15:25:07 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-10-20 15:25:07 +0200 |
commit | beb45ac4d420034f9aec53eaf7ea783e178d5361 (patch) | |
tree | b26e820671aa6af552a4b03147c44a9d2aa84be8 /ishtar_common | |
parent | 666747d6371a908e6fe1968e2e802e3065d610c5 (diff) | |
download | Ishtar-beb45ac4d420034f9aec53eaf7ea783e178d5361.tar.bz2 Ishtar-beb45ac4d420034f9aec53eaf7ea783e178d5361.zip |
Djangoization - Major refactoring (step 3)
Reorganization of views, urls, menus, admin, forms.
Changes on models.
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/admin.py | 158 | ||||
-rw-r--r-- | ishtar_common/context_processors.py | 19 | ||||
-rw-r--r-- | ishtar_common/forms_common.py | 52 | ||||
-rw-r--r-- | ishtar_common/forms_context_records.py | 362 | ||||
-rw-r--r-- | ishtar_common/forms_files.py | 387 | ||||
-rw-r--r-- | ishtar_common/forms_items.py | 525 | ||||
-rw-r--r-- | ishtar_common/forms_operations.py | 754 | ||||
-rw-r--r-- | ishtar_common/menus.py | 132 | ||||
-rw-r--r-- | ishtar_common/models.py | 568 | ||||
-rw-r--r-- | ishtar_common/templates/sheet_contextrecord.html | 10 | ||||
-rw-r--r-- | ishtar_common/templates/sheet_operation.html | 10 | ||||
-rw-r--r-- | ishtar_common/urls.py | 157 | ||||
-rw-r--r-- | ishtar_common/views.py | 199 |
13 files changed, 52 insertions, 3281 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index c4e5fa7f2..8f6a07f88 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2010-2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -57,130 +57,6 @@ class PersonAdmin(HistorizedObjectAdmin): admin.site.register(models.Person, PersonAdmin) -class FileAdmin(HistorizedObjectAdmin): - list_display = ['year', 'numeric_reference', 'internal_reference', - 'end_date', 'file_type', 'general_contractor',] - if settings.COUNTRY == 'fr': - list_display += ['saisine_type', 'reference_number'] - list_filter = ("file_type", "year",) - search_fields = ('towns__name',) - model = models.File - -admin.site.register(models.File, FileAdmin) - -class OperationAdmin(HistorizedObjectAdmin): - list_display = ['year', 'operation_code', 'start_date', - 'excavation_end_date', 'end_date', - 'operation_type'] - list_filter = ("year", "operation_type",) - search_fields = ['towns__name', 'operation_code'] - if settings.COUNTRY == 'fr': - list_display += ['code_patriarche'] - search_fields += ['code_patriarche'] - model = models.Operation - -admin.site.register(models.Operation, OperationAdmin) - -class OperationSourceAdmin(admin.ModelAdmin): - list_display = ('operation', 'title', 'source_type',) - list_filter = ('source_type',) - search_fields = ('title', 'operation__name') - model = models.OperationSource - -admin.site.register(models.OperationSource, OperationSourceAdmin) - -class ParcelAdmin(HistorizedObjectAdmin): - list_display = ('section', 'parcel_number', 'operation', 'associated_file') - search_fields = ('operation__name',) - model = models.Parcel - -admin.site.register(models.Parcel, ParcelAdmin) - -class PeriodAdmin(admin.ModelAdmin): - list_display = ('label', 'start_date', 'end_date', 'parent') - model = models.Period - -admin.site.register(models.Period, PeriodAdmin) - -class DatingAdmin(admin.ModelAdmin): - list_display = ('period', 'start_date', 'end_date', 'dating_type', - 'quality') - list_filter = ("period", 'dating_type', 'quality') - model = models.Dating - -admin.site.register(models.Dating, DatingAdmin) - -class ContextRecordAdmin(HistorizedObjectAdmin): - list_display = ('label', 'length', 'width', - 'thickness', 'depth') - list_filter = ('has_furniture',) - search_fields = ('parcel__operation__name', "datings__period__label") - model = models.ContextRecord - -admin.site.register(models.ContextRecord, ContextRecordAdmin) - -class ContextRecordSourceAdmin(admin.ModelAdmin): - list_display = ('context_record', 'title', 'source_type',) - list_filter = ('source_type',) - search_fields = ('title', ) - model = models.ContextRecordSource - -admin.site.register(models.ContextRecordSource, ContextRecordSourceAdmin) - -class BaseItemAdmin(HistorizedObjectAdmin): - list_display = ('label', 'context_record', 'is_isolated') - search_fields = ('label', 'context_record__parcel__operation__name',) - model = models.BaseItem - -admin.site.register(models.BaseItem, BaseItemAdmin) - -class ItemAdmin(HistorizedObjectAdmin): - list_display = ('label', 'material_type', 'dating', 'volume', 'weight', - 'item_number',) - list_filter = ('material_type',) - search_fields = ('label', "dating__period__label") - model = models.Item - -admin.site.register(models.Item, ItemAdmin) - -class ItemSourceAdmin(admin.ModelAdmin): - list_display = ('item', 'title', 'source_type',) - list_filter = ('source_type',) - search_fields = ('title', ) - model = models.ItemSource - -admin.site.register(models.ItemSource, ItemSourceAdmin) - -class WarehouseAdmin(HistorizedObjectAdmin): - list_display = ('name', 'warehouse_type', 'town') - list_filter = ('warehouse_type',) - search_fields = ('name', 'town') - model = models.Warehouse - -admin.site.register(models.Warehouse, WarehouseAdmin) - -class AdministrativeActAdmin(HistorizedObjectAdmin): - list_display = ('operation', 'act_type', 'signature_date') - list_filter = ('act_type',) - search_fields = ('operation__name',) - model = models.AdministrativeAct - -admin.site.register(models.AdministrativeAct, AdministrativeActAdmin) - -class ContainerTypeAdmin(admin.ModelAdmin): - list_display = ('label', 'reference', 'length', 'width', 'height', - 'volume') - model = models.ContainerType - -admin.site.register(models.ContainerType, ContainerTypeAdmin) - -class ContainerAdmin(admin.ModelAdmin): - list_display = ('reference', 'location', 'container_type',) - list_filter = ("container_type",) - model = models.Container - -admin.site.register(models.Container, ContainerAdmin) - class TownAdmin(admin.ModelAdmin): list_display = ['name',] search_fields = ['name'] @@ -199,42 +75,16 @@ class AuthorAdmin(admin.ModelAdmin): admin.site.register(models.Author, AuthorAdmin) -class PropertyAdmin(admin.ModelAdmin): - list_display = ['item', 'person', 'start_date', 'end_date'] - search_fields = ('item__label', 'person__name') - model = models.Property - -admin.site.register(models.Property, PropertyAdmin) - -class TreatmentAdmin(HistorizedObjectAdmin): - list_display = ('location', 'treatment_type', 'container', 'person') - list_filter = ('treatment_type',) - model = models.Treatment - -admin.site.register(models.Treatment, TreatmentAdmin) - -class TreatmentSourceAdmin(admin.ModelAdmin): - list_display = ('treatment', 'title', 'source_type',) - list_filter = ('source_type',) - search_fields = ('title',) - model = models.TreatmentSource - -admin.site.register(models.TreatmentSource, TreatmentSourceAdmin) - class PersonTypeAdmin(admin.ModelAdmin): model = models.PersonType filter_vertical = ('rights',) admin.site.register(models.PersonType, PersonTypeAdmin) -basic_models = [models.IshtarUser, models.FileType, models.OperationType, - models.DatingType, models.DatingQuality, models.SourceType, - models.MaterialType, models.ParcelOwner, models.WarehouseType, - models.ActType, models.AuthorType, models.OrganizationType, - models.TreatmentType, models.RemainType, models.PermitType, - models.Unit, models.ActivityType, models.IdentificationType] +basic_models = [models.IshtarUser, models.SourceType, models.AuthorType, + models.OrganizationType] if settings.COUNTRY == 'fr': - basic_models += [models.Arrondissement, models.Canton, models.SaisineType] + basic_models += [models.Arrondissement, models.Canton] for model in basic_models: admin.site.register(model) diff --git a/ishtar_common/context_processors.py b/ishtar_common/context_processors.py index 5de5a6afd..884ec19b4 100644 --- a/ishtar_common/context_processors.py +++ b/ishtar_common/context_processors.py @@ -23,6 +23,19 @@ from django.utils.translation import ugettext, ugettext_lazy as _ from menus import Menu import models +from archaeological_operations.models import Operation + +CURRENT_ITEMS = [] +if 'archaeological_files' in settings.INSTALLED_APPS: + from archaeological_files.models import File + CURRENT_ITEMS.append((_(u"Archaeological file"), File)) +CURRENT_ITEMS.append((_(u"Operation"), Operation)) +if 'archaeological_context_records' in settings.INSTALLED_APPS: + from archaeological_context_records.models import ContextRecord + CURRENT_ITEMS.append((_(u"Context record"), ContextRecord)) +if 'archaeological_finds' in settings.INSTALLED_APPS: + from archaeological_finds.models import Find + CURRENT_ITEMS.append((_(u"Find"), Find)) def get_base_context(request): dct = {'URL_PATH':settings.URL_PATH} @@ -39,11 +52,7 @@ def get_base_context(request): dct['JQUERY_URL'] = settings.JQUERY_URL dct['JQUERY_UI_URL'] = settings.JQUERY_UI_URL dct['current_menu'] = [] - for lbl, model in ((_(u"Archaeological file"), models.File), - (_(u"Operation"), models.Operation), - (_(u"Context record"), models.ContextRecord), - (_(u"Archaeological item"), models.Item), - ): + for lbl, model in CURRENT_ITEMS: model_name = model.__name__.lower() current = model_name in request.session and request.session[model_name] items = [] diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index e5f23e620..d3ae65d55 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -265,58 +265,6 @@ class TownFormSet(FormSet): TownFormset = formset_factory(TownForm, can_delete=True, formset=TownFormSet) TownFormset.form_label = _("Towns") -class ParcelForm(forms.Form): - form_label = _("Parcels") - base_model = 'parcel' - associated_models = {'parcel':models.Parcel, 'town':models.Town} - town = forms.ChoiceField(label=_("Town"), choices=(), required=False, - validators=[models.valid_id(models.Town)]) - section = forms.CharField(label=_(u"Section"), required=False, - validators=[validators.MaxLengthValidator(4)]) - parcel_number = forms.CharField(label=_(u"Parcel number"), required=False, - validators=[validators.MaxLengthValidator(6)]) - year = forms.IntegerField(label=_("Year"), required=False, - validators=[validators.MinValueValidator(1900), - validators.MaxValueValidator(2100)]) - def __init__(self, *args, **kwargs): - towns = None - if 'data' in kwargs and 'TOWNS' in kwargs['data']: - towns = kwargs['data']['TOWNS'] - # clean data if not "real" data - prefix_value = kwargs['prefix'] + '-town' - if not [k for k in kwargs['data'].keys() - if k.startswith(prefix_value) and kwargs['data'][k]]: - kwargs['data'] = None - if 'files' in kwargs: - kwargs.pop('files') - super(ParcelForm, self).__init__(*args, **kwargs) - if towns: - self.fields['town'].choices = [('', '--')] + towns - - def clean(self): - """Check required fields""" - if any(self.errors): - return - if not self.cleaned_data or DELETION_FIELD_NAME in self.cleaned_data \ - and self.cleaned_data[DELETION_FIELD_NAME]: - return - for key in ('town', 'parcel_number', 'section'): - if not key in self.cleaned_data or not self.cleaned_data[key]: - raise forms.ValidationError(_(u"Town section and parcel number " - u"fields are required.")) - return self.cleaned_data - - -class ParcelFormSet(FormSet): - def clean(self): - """Checks that no parcels are duplicated.""" - return self.check_duplicate(('town', 'parcel_number', 'year'), - _(u"There are identical parcels.")) - -ParcelFormSet = formset_factory(ParcelForm, can_delete=True, - formset=ParcelFormSet) -ParcelFormSet.form_label = _(u"Parcels") - ###################### # Sources management # ###################### diff --git a/ishtar_common/forms_context_records.py b/ishtar_common/forms_context_records.py deleted file mode 100644 index 816782bd8..000000000 --- a/ishtar_common/forms_context_records.py +++ /dev/null @@ -1,362 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (C) 2010-2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> - -# 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 <http://www.gnu.org/licenses/>. - -# See the file COPYING for details. - -""" -Context records forms definitions -""" -import datetime -from itertools import groupby - -from django import forms -from django.core import validators -from django.core.exceptions import ObjectDoesNotExist -from django.db.models import Max -from django.utils.translation import ugettext_lazy as _ - -from ishtar import settings - -import models -import widgets -from forms import Wizard, FinalForm, FormSet, SearchWizard, DeletionWizard, \ - formset_factory, get_now, reverse_lazy, get_form_selection -from forms_common import get_town_field, SourceForm, SourceWizard, \ - SourceSelect, AuthorFormset -from forms_operations import OperationSelect - -class RecordWizard(Wizard): - model = models.ContextRecord - edit = False - - def get_current_operation(self, request, storage): - step = storage.get_current_step() - if not step: - return - if step.endswith('_creation'): # an operation has been selected - main_form_key = 'selec-' + self.url_name - try: - idx = int(self.session_get_value(request, storage, - main_form_key, 'operation_id')) - current_ope = models.Operation.objects.get(pk=idx) - return current_ope - except(TypeError, ValueError, ObjectDoesNotExist): - pass - current_cr = self.get_current_object(request, storage) - if current_cr: - return current_cr.parcel.operation - - def get_template_context(self, request, storage, form=None): - """ - Get the operation "reminder" on top of wizard forms - """ - context = super(RecordWizard, self).get_template_context(request, - storage, form) - operation = self.get_current_operation(request, storage) - if not operation: - return context - items = [] - if hasattr(operation, 'code_patriarche') and operation.code_patriarche: - items.append(unicode(operation.code_patriarche)) - items.append("-".join((unicode(operation.year), - unicode(operation.operation_code)))) - context['reminder'] = _("Current operation: ") + " - ".join(items) - return context - - def get_form(self, request, storage, step=None, data=None, files=None): - """ - Get associated operation - """ - if data: - data = data.copy() - else: - data = {} - if not step: - step = self.determine_step(request, storage) - form = self.get_form_list(request, storage)[step] - - general_form_key = 'general-' + self.url_name - if step.startswith('general-'): - if step.endswith('_creation'): # an operation has been selected - main_form_key = 'selec-' + self.url_name - try: - idx = int(self.session_get_value(request, storage, - main_form_key, 'operation_id')) - current_obj = models.Operation.objects.get(pk=idx) - data['operation'] = current_obj - except(TypeError, ValueError, ObjectDoesNotExist): - pass - else: - current_object = self.get_current_object(request, storage) - data['context_record'] = current_object - form = super(RecordWizard, self).get_form(request, storage, step, data, - files) - return form - -class RecordModifWizard(RecordWizard): - modification = True - model = models.ContextRecord - -class RecordSelect(forms.Form): - parcel__town = get_town_field() - operation__year = forms.IntegerField(label=_(u"Year")) - datings__period = forms.ChoiceField(label=_(u"Period"), choices=[]) - unit = forms.ChoiceField(label=_(u"Unit type"), choices=[]) - def __init__(self, *args, **kwargs): - super(RecordSelect, self).__init__(*args, **kwargs) - self.fields['datings__period'].choices = \ - models.Period.get_types() - self.fields['datings__period'].help_text = \ - models.Period.get_help() - self.fields['unit'].choices = models.Unit.get_types() - self.fields['unit'].help_text = models.Unit.get_help() - -class RecordFormSelection(forms.Form): - form_label = _("Context record search") - associated_models = {'pk':models.ContextRecord} - currents = {'pk':models.ContextRecord} - pk = forms.IntegerField(label="", required=False, - widget=widgets.JQueryJqGrid(reverse_lazy('get-contextrecord'), - RecordSelect(), models.ContextRecord, - source_full=reverse_lazy('get-contextrecord-full')), - validators=[models.valid_id(models.ContextRecord)]) - - def clean(self): - cleaned_data = self.cleaned_data - if 'pk' not in cleaned_data or not cleaned_data['pk']: - raise forms.ValidationError(_(u"You should at least select one " - u"context record.")) - return cleaned_data - - -class RecordFormGeneral(forms.Form): - form_label = _("General") - associated_models = {'parcel':models.Parcel, 'unit':models.Unit} - pk = forms.IntegerField(required=False, widget=forms.HiddenInput) - operation_id = forms.IntegerField(widget=forms.HiddenInput) - parcel = forms.ChoiceField(label=_("Parcel"), choices=[]) - label = forms.CharField(label=_(u"ID"), - validators=[validators.MaxLengthValidator(200)]) - description = forms.CharField(label=_(u"Description"), - widget=forms.Textarea, required=False) - length = forms.IntegerField(label=_(u"Length (cm)"), required=False) - width = forms.IntegerField(label=_(u"Width (cm)"), required=False) - thickness = forms.IntegerField(label=_(u"Thickness (cm)"), required=False) - depth = forms.IntegerField(label=_(u"Depth (cm)"), required=False) - unit = forms.ChoiceField(label=_("Unit"), required=False, - choices=models.Unit.get_types()) - location = forms.CharField(label=_(u"Location"), widget=forms.Textarea, - required=False, validators=[validators.MaxLengthValidator(200)]) - - def __init__(self, *args, **kwargs): - operation = None - if 'data' in kwargs and kwargs['data'] and \ - ('operation' in kwargs['data'] or 'context_record' in kwargs['data']): - if 'operation' in kwargs['data']: - operation = kwargs['data']['operation'] - if 'context_record' in kwargs['data'] and \ - kwargs['data']['context_record']: - operation = kwargs['data']['context_record'].operation - # clean data if not "real" data - prefix_value = kwargs['prefix'] - if not [k for k in kwargs['data'].keys() - if k.startswith(kwargs['prefix']) and kwargs['data'][k]]: - kwargs['data'] = None - if 'files' in kwargs: - kwargs.pop('files') - super(RecordFormGeneral, self).__init__(*args, **kwargs) - self.fields['parcel'].choices = [('', '--')] - if operation: - self.fields['operation_id'].initial = operation.pk - parcels = operation.parcels.all() - sort = lambda x: (x.town.name, x.section) - parcels = sorted(parcels, key=sort) - for key, gparcels in groupby(parcels, sort): - self.fields['parcel'].choices.append( - (" - ".join(key), [(parcel.pk, parcel.short_label()) for parcel in gparcels]) - ) - - def clean(self): - # manage unique context record ID - cleaned_data = self.cleaned_data - operation_id = cleaned_data.get("operation_id") - label = cleaned_data.get("label") - cr = models.ContextRecord.objects.filter(label=label, - parcel__operation__pk=operation_id) - if 'pk' in cleaned_data and cleaned_data['pk']: - cr = cr.exclude(pk=cleaned_data['pk']) - if cr.count(): - raise forms.ValidationError(_(u"This ID already exist for " - u"this operation.")) - return cleaned_data - -class DatingForm(forms.Form): - form_label = _("Dating") - base_model = 'dating' - associated_models = {'dating_type':models.DatingType, - 'quality':models.DatingQuality, - 'period':models.Period} - period = forms.ChoiceField(label=_("Period"), - choices=models.Period.get_types()) - start_date = forms.IntegerField(label=_(u"Start date"), required=False) - end_date = forms.IntegerField(label=_(u"End date"), required=False) - quality = forms.ChoiceField(label=_("Quality"), required=False, - choices=models.DatingQuality.get_types()) - dating_type = forms.ChoiceField(label=_("Dating type"), required=False, - choices=[]) - - def __init__(self, *args, **kwargs): - super(DatingForm, self).__init__(*args, **kwargs) - self.fields['dating_type'].choices = models.DatingType.get_types() - self.fields['dating_type'].help_text = models.DatingType.get_help() - - -DatingFormSet = formset_factory(DatingForm, can_delete=True, - formset=FormSet) -DatingFormSet.form_label = _("Dating") - -class RecordFormInterpretation(forms.Form): - form_label = _("Interpretation") - associated_models = {'activity':models.ActivityType, - 'identification':models.IdentificationType,} - has_furniture = forms.NullBooleanField(label=_(u"Has furniture?"), - required=False) - filling = forms.CharField(label=_(u"Filling"), - widget=forms.Textarea, required=False) - interpretation = forms.CharField(label=_(u"Interpretation"), - widget=forms.Textarea, required=False) - activity = forms.ChoiceField(label=_(u"Activity"), required=False, - choices=[]) - identification = forms.ChoiceField(label=_("Identification"), - required=False, choices=[]) - taq = forms.IntegerField(label=_(u"TAQ"), required=False) - taq_estimated = forms.IntegerField(label=_(u"Estimated TAQ"), - required=False) - tpq = forms.IntegerField(label=_(u"TPQ"), required=False) - tpq_estimated = forms.IntegerField(label=_(u"Estimated TPQ"), - required=False) - - def __init__(self, *args, **kwargs): - super(RecordFormInterpretation, self).__init__(*args, **kwargs) - self.fields['activity'].choices = models.ActivityType.get_types() - self.fields['activity'].help_text = models.ActivityType.get_help() - self.fields['identification'].choices = \ - models.IdentificationType.get_types() - self.fields['identification'].help_text = \ - models.IdentificationType.get_help() - -record_search_wizard = SearchWizard([ - ('general-record_search', RecordFormSelection)], - url_name='record_search',) - -OperationRecordFormSelection = get_form_selection( - 'OperationRecordFormSelection', _(u"Operation search"), 'operation_id', - models.Operation, OperationSelect, 'get-operation', - _(u"You should select an operation.")) - - -record_creation_wizard = RecordWizard([ - ('selec-record_creation', OperationRecordFormSelection), - ('general-record_creation', RecordFormGeneral), - ('datings-record_creation', DatingFormSet), - ('interpretation-record_creation', RecordFormInterpretation), - ('final-record_creation', FinalForm)], - url_name='record_creation',) - -record_modification_wizard = RecordModifWizard([ - ('selec-record_modification', RecordFormSelection), - ('general-record_modification', RecordFormGeneral), - ('datings-record_modification', DatingFormSet), - ('interpretation-record_modification', RecordFormInterpretation), - ('final-record_modification', FinalForm)], - url_name='record_modification',) - -class RecordDeletionWizard(DeletionWizard): - model = models.ContextRecord - fields = ['label', 'parcel', 'description', 'length', 'width', 'thickness', - 'depth', 'location', 'datings', 'units', 'has_furniture', - 'filling', 'interpretation', 'taq', 'taq_estimated', 'tpq', - 'tpq_estimated'] - -class RecordDeletionForm(FinalForm): - confirm_msg = " " - confirm_end_msg = _(u"Would you like to delete this context record?") - -record_deletion_wizard = RecordDeletionWizard([ - ('selec-record_deletion', RecordFormSelection), - ('final-record_deletion', RecordDeletionForm)], - url_name='record_deletion',) - -######################################### -# Source management for context records # -######################################### - -class RecordSourceWizard(SourceWizard): - model = models.ContextRecordSource - -SourceRecordFormSelection = get_form_selection( - 'SourceRecordFormSelection', _(u"Context record search"), - 'context_record', models.ContextRecord, RecordSelect, 'get-contextrecord', - _(u"You should select a context record.")) - -record_source_creation_wizard = RecordSourceWizard([ - ('selec-record_source_creation', SourceRecordFormSelection), - ('source-record_source_creation', SourceForm), - ('authors-record_source_creation', AuthorFormset), - ('final-record_source_creation', FinalForm)], - url_name='record_source_creation',) - -class RecordSourceSelect(SourceSelect): - context_record__parcel__town = get_town_field( - label=_(u"Town of the operation")) - context_record__operation__year = forms.IntegerField( - label=_(u"Year of the operation")) - context_record__datings__period = forms.ChoiceField( - label=_(u"Period of the context record"), choices=[]) - context_record__unit = forms.ChoiceField( - label=_(u"Unit type of the context record"), choices=[]) - - def __init__(self, *args, **kwargs): - super(RecordSourceSelect, self).__init__(*args, **kwargs) - self.fields['context_record__datings__period'].choices = \ - models.Period.get_types() - self.fields['context_record__datings__period'].help_text = \ - models.Period.get_help() - self.fields['context_record__unit'].choices = models.Unit.get_types() - self.fields['context_record__unit'].help_text = models.Unit.get_help() - - -RecordSourceFormSelection = get_form_selection( - 'RecordSourceFormSelection', _(u"Documentation search"), 'pk', - models.ContextRecordSource, RecordSourceSelect, 'get-contextrecordsource', - _(u"You should select a document.")) - -record_source_modification_wizard = RecordSourceWizard([ - ('selec-record_source_modification', RecordSourceFormSelection), - ('source-record_source_modification', SourceForm), - ('authors-record_source_modification', AuthorFormset), - ('final-record_source_modification', FinalForm)], - url_name='record_source_modification',) - -class RecordSourceDeletionWizard(DeletionWizard): - model = models.ContextRecordSource - fields = ['context_record', 'title', 'source_type', 'authors',] - -record_source_deletion_wizard = RecordSourceDeletionWizard([ - ('selec-record_source_deletion', RecordSourceFormSelection), - ('final-record_source_deletion', RecordDeletionForm)], - url_name='record_source_deletion',) diff --git a/ishtar_common/forms_files.py b/ishtar_common/forms_files.py deleted file mode 100644 index c4c460cee..000000000 --- a/ishtar_common/forms_files.py +++ /dev/null @@ -1,387 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (C) 2010-2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> - -# 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 <http://www.gnu.org/licenses/>. - -# See the file COPYING for details. - -""" -Files 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.db.models import Max -from django.utils.translation import ugettext_lazy as _ - -from ishtar import settings - -import models -import widgets -from forms import Wizard, FinalForm, FormSet, ClosingWizard, \ - ClosingDateFormSelection, SearchWizard, formset_factory, get_now, \ - reverse_lazy -from forms_common import TownFormset, ParcelFormSet, \ - get_town_field, get_person_field -from forms_operations import OperationAdministrativeActWizard, \ -AdministrativeActOpeForm, AdministrativeActOpeFormSelection, \ -AdministrativeActDeletionWizard, FinalAdministrativeActDeleteForm, is_preventive - -class FileWizard(Wizard): - model = models.File - object_parcel_type = 'associated_file' - - def get_form(self, request, storage, step=None, data=None, files=None): - """ - Manage towns - """ - if data: - data = data.copy() - else: - data = {} - # manage the dynamic choice of towns - if not step: - step = self.determine_step(request, storage) - form = self.get_form_list(request, storage)[step] - town_form_key = 'towns-' + self.url_name - if step.startswith('parcels-') and hasattr(form, 'management_form') \ - and self.session_has_key(request, storage, town_form_key): - towns = [] - qdict = request.session[storage.prefix]['step_data'][town_form_key] - for k in qdict.keys(): - if k.endswith("town") and qdict[k]: - try: - town = models.Town.objects.get(pk=int(qdict[k])) - towns.append((town.pk, unicode(town))) - except (ObjectDoesNotExist, ValueError): - pass - data['TOWNS'] = sorted(towns, key=lambda x:x[1]) - form = super(FileWizard, self).get_form(request, storage, step, data, - files) - return form - - def get_extra_model(self, dct, request, storage, form_list): - dct = super(FileWizard, self).get_extra_model(dct, request, storage, - form_list) - if not dct['numeric_reference']: - current_ref = models.File.objects.filter(year=dct['year'] - ).aggregate(Max('numeric_reference'))["numeric_reference__max"] - dct['numeric_reference'] = current_ref and current_ref + 1 or 1 - return dct - - def done(self, request, storage, form_list, **kwargs): - ''' - Save parcels - ''' - r = super(FileWizard, self).done(request, storage, form_list, - return_object=True, **kwargs) - if type(r) not in (list, tuple) or len(r) != 2: - return r - obj, res = r - obj.parcels.clear() - for form in form_list: - if not hasattr(form, 'prefix') \ - or not form.prefix.startswith('parcels-') \ - or not hasattr(form, 'forms'): - continue - for frm in form.forms: - if not frm.is_valid(): - continue - dct = frm.cleaned_data.copy() - if 'parcel' in dct: - try: - parcel = models.Parcel.objects.get(pk=dct['parcel']) - setattr(parcel, self.object_parcel_type, obj) - parcel.save() - except (ValueError, ObjectDoesNotExist): - continue - continue - try: - dct['town'] = models.Town.objects.get(pk=int(dct['town'])) - except (ValueError, ObjectDoesNotExist): - continue - dct['associated_file'], dct['operation'] = None, None - dct[self.object_parcel_type] = obj - if 'DELETE' in dct: - dct.pop('DELETE') - parcel = models.Parcel.objects.filter(**dct).count() - if not parcel: - dct['history_modifier'] = request.user - parcel = models.Parcel(**dct) - parcel.save() - return res - -class FileSelect(forms.Form): - towns = get_town_field() - in_charge = get_person_field(label=_(u"Person in charge"), - person_type='sra_agent') - file_type = forms.ChoiceField(label=_("File type"), - choices=models.FileType.get_types()) - saisine_type = forms.ChoiceField(label=_("Saisine type"), choices=[]) - year = forms.IntegerField(label=_("Year")) - - def __init__(self, *args, **kwargs): - super(FileSelect, self).__init__(*args, **kwargs) - self.fields['saisine_type'].choices = models.SaisineType.get_types() - self.fields['saisine_type'].help_text = models.SaisineType.get_help() - -class FileFormSelection(forms.Form): - form_label = _("Archaeological file search") - associated_models = {'pk':models.File} - currents = {'pk':models.File} - pk = forms.IntegerField(label="", required=False, - widget=widgets.JQueryJqGrid(reverse_lazy('get-file'), - FileSelect(), models.File, source_full=reverse_lazy('get-file-full')), - validators=[models.valid_id(models.File)]) - - def clean(self): - cleaned_data = self.cleaned_data - if 'pk' not in cleaned_data or not cleaned_data['pk']: - raise forms.ValidationError(_(u"You should select a file.")) - return cleaned_data - -class FileFormGeneral(forms.Form): - form_label = _("General") - associated_models = {'in_charge':models.Person, - 'related_file':models.File, - 'file_type':models.FileType} - in_charge = forms.IntegerField(label=_("Person in charge"), - widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person', - args=[models.PersonType.objects.get(txt_idx='sra_agent').pk]), - associated_model=models.Person, new=True), - validators=[models.valid_id(models.Person)]) - year = forms.IntegerField(label=_("Year"), - initial=lambda:datetime.datetime.now().year, - validators=[validators.MinValueValidator(1900), - validators.MaxValueValidator(2100)]) - numeric_reference = forms.IntegerField(label=_("Numeric reference"), - widget=forms.HiddenInput, required=False) - internal_reference = forms.CharField(label=_(u"Internal reference"), - max_length=60, - validators=[models.is_unique(models.File, 'internal_reference')]) - creation_date = forms.DateField(label=_(u"Creation date"), - initial=get_now, widget=widgets.JQueryDate) - file_type = forms.ChoiceField(label=_("File type"), - choices=models.FileType.get_types()) - related_file = forms.IntegerField(label=_("Related file"), required=False, - widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-file'), - associated_model=models.File), - validators=[models.valid_id(models.File)]) - comment = forms.CharField(label=_(u"Comment"), widget=forms.Textarea, - required=False) - -class FileFormGeneralRO(FileFormGeneral): - year = forms.IntegerField(label=_(u"Year"), - widget=forms.TextInput(attrs={'readonly':True})) - numeric_reference = forms.IntegerField(label=_(u"Numeric reference"), - widget=forms.TextInput(attrs={'readonly':True})) - internal_reference = forms.CharField(label=_(u"Internal reference"), - widget=forms.TextInput(attrs={'readonly':True},)) - -class FileFormAddress(forms.Form): - form_label = _(u"Address") - associated_models = {'town':models.Town} - total_surface = forms.IntegerField(required=False, - widget=widgets.AreaWidget, - label=_(u"Total surface (m²)"), - validators=[validators.MinValueValidator(0), - validators.MaxValueValidator(999999999)]) - address = forms.CharField(label=_(u"Main address"), widget=forms.Textarea) - address_complement = forms.CharField(label=_(u"Main address - complement"), - required=False) - postal_code = forms.CharField(label=_(u"Main address - postal code"), - max_length=10) - -class FileFormPreventive(forms.Form): - form_label = _(u"Preventive informations") - associated_models = {'general_contractor':models.Person, - 'saisine_type':models.SaisineType, - 'permit_type':models.PermitType, - 'town_planning_service':models.Organization} - general_contractor = forms.IntegerField(label=_(u"General contractor"), - widget=widgets.JQueryAutoComplete( - reverse_lazy('autocomplete-person', - args=[models.PersonType.objects.get(txt_idx='general_contractor').pk]), - associated_model=models.Person, new=True), - validators=[models.valid_id(models.Person)]) - town_planning_service = forms.IntegerField(required=False, - label=_(u"Town planning service"), - widget=widgets.JQueryAutoComplete( - reverse_lazy('autocomplete-organization', - args=[models.OrganizationType.objects.get(txt_idx='planning_service').pk]), - associated_model=models.Organization, new=True), - validators=[models.valid_id(models.Organization)]) - permit_type = forms.ChoiceField(label=_(u"Permit type"), required=False, - choices=models.PermitType.get_types()) - permit_reference = forms.CharField(label=_(u"Permit reference"), - required=False, validators=[validators.MaxLengthValidator(60)]) - total_developed_surface = forms.IntegerField(widget=widgets.AreaWidget, - label=_(u"Total developed surface (m²)"), - required=False, validators=[validators.MinValueValidator(0), - validators.MaxValueValidator(999999999)]) - if settings.COUNTRY == 'fr': - saisine_type = forms.ChoiceField(label=_(u"Saisine type"), - choices=[]) - reception_date = forms.DateField(label=_(u"Reception date"), - initial=get_now, widget=widgets.JQueryDate) - def __init__(self, *args, **kwargs): - super(FileFormPreventive, self).__init__(*args, **kwargs) - self.fields['saisine_type'].choices = models.SaisineType.get_types() - self.fields['saisine_type'].help_text = models.SaisineType.get_help() - -file_search_wizard = SearchWizard([('general-file_search', FileFormSelection)], - url_name='file_search',) - -file_creation_wizard = FileWizard([ - ('general-file_creation', FileFormGeneral), - ('address-file_creation', FileFormAddress), - ('towns-file_creation', TownFormset), - ('parcels-file_creation', ParcelFormSet), - ('preventive-file_creation', FileFormPreventive), - ('final-file_creation', FinalForm)], - condition_list={ -'preventive-file_creation':is_preventive('general-file_creation', - models.FileType, type_key='file_type') - }, - url_name='file_creation',) - -class FileModificationWizard(FileWizard): - modification = True - -file_modification_wizard = FileModificationWizard([ - ('selec-file_modification', FileFormSelection), - ('general-file_modification', FileFormGeneralRO), - ('adress-file_modification', FileFormAddress), - ('towns-file_modification', TownFormset), - ('parcels-file_modification', ParcelFormSet), - ('preventive-file_modification', FileFormPreventive), - ('final-file_modification', FinalForm)], - condition_list={ -'preventive-file_modification':is_preventive('general-file_modification', - models.FileType, type_key='file_type') - }, - url_name='file_modification',) - -class FileClosingWizard(ClosingWizard): - model = models.File - fields = ['year', 'numeric_reference', 'internal_reference', - 'file_type', 'in_charge', 'general_contractor', 'creation_date', - 'reception_date', 'total_surface', 'total_developed_surface', - 'address', 'address_complement', 'postal_code', 'comment'] - if settings.COUNTRY == 'fr': - fields += ['saisine_type', 'reference_number'] - fields += ['towns'] - -class FinalFileClosingForm(FinalForm): - confirm_msg = " " - confirm_end_msg = _(u"Would you like to close this archaeological file?") - -file_closing_wizard = FileClosingWizard([ - ('selec-file_closing', FileFormSelection), - ('date-file_closing', ClosingDateFormSelection), - ('final-file_closing', FinalFileClosingForm)], - url_name='file_closing',) - -class FileDeletionWizard(FileClosingWizard): - def get_formated_datas(self, forms): - datas = super(FileDeletionWizard, self).get_formated_datas(forms) - datas.append((_("Associated operations"), [])) - for operation in models.Operation.objects.filter( - associated_file=self.current_obj).all(): - if operation.end_date: - datas[-1][1].append(('', unicode(operation))) - return datas - - def done(self, request, storage, form_list, **kwargs): - obj = self.get_current_object(request, storage) - for operation in models.Operation.objects.filter( - associated_file=obj).all(): - operation.delete() - obj.delete() - return render_to_response('wizard_done.html', {}, - context_instance=RequestContext(request)) - - -class FinalFileDeleteForm(FinalForm): - confirm_msg = " " - confirm_end_msg = _(u"Would you like to delete this archaelogical file ?") - -file_deletion_wizard = FileDeletionWizard([ - ('selec-file_deletion', FileFormSelection), - ('final-file_deletion', FinalFileDeleteForm)], - url_name='file_deletion',) - -class FileAdministrativeActWizard(OperationAdministrativeActWizard): - model = models.File - -class FileEditAdministrativeActWizard(FileAdministrativeActWizard): - model = models.AdministrativeAct - edit = True - def get_associated_item(self, request, storage, dct): - return self.get_current_object(request, storage).associated_file - -class AdministrativeActFileSelect(forms.Form): - associated_file__towns = get_town_field() - act_type = forms.ChoiceField(label=_("Act type"), choices=[]) - - def __init__(self, *args, **kwargs): - super(AdministrativeActFileSelect, self).__init__(*args, **kwargs) - self.fields['act_type'].choices = models.ActType.get_types( - dct={'intented_to':'F'}) - self.fields['act_type'].help_text = models.ActType.get_help( - dct={'intented_to':'F'}) - -class AdministrativeActFileFormSelection(AdministrativeActOpeFormSelection): - pk = forms.IntegerField(label="", required=False, - widget=widgets.JQueryJqGrid(reverse_lazy('get-administrativeactfile'), - AdministrativeActFileSelect(), models.AdministrativeAct, - table_cols='TABLE_COLS_FILE'), - validators=[models.valid_id(models.AdministrativeAct)]) - -class AdministrativeActFileForm(AdministrativeActOpeForm): - act_type = forms.ChoiceField(label=_(u"Act type"), choices=[]) - - def __init__(self, *args, **kwargs): - super(AdministrativeActFileForm, self).__init__(*args, **kwargs) - self.fields['act_type'].choices = models.ActType.get_types( - dct={'intented_to':'F'}) - self.fields['act_type'].help_text = models.ActType.get_help( - dct={'intented_to':'F'}) - -file_administrativeactfile_wizard = FileAdministrativeActWizard([ - ('selec-file_administrativeactfile', FileFormSelection), - ('administrativeact-file_administrativeactfile', AdministrativeActFileForm), - ('final-file_administrativeactfile', FinalForm)], - url_name='file_administrativeactfile',) - -file_administrativeactfile_modification_wizard = FileEditAdministrativeActWizard([ - ('selec-file_administrativeactfile_modification', - AdministrativeActFileFormSelection), - ('administrativeact-file_administrativeactfile_modification', - AdministrativeActFileForm), - ('final-file_administrativeactfile_modification', FinalForm)], - url_name='file_administrativeactfile_modification',) - -file_administrativeactfile_deletion_wizard = AdministrativeActDeletionWizard([ - ('selec-file_administrativeactfile_deletion', - AdministrativeActFileFormSelection), - ('final-file_administrativeactfile_deletion', - FinalAdministrativeActDeleteForm)], - url_name='file_administrativeactfile_deletion',) - diff --git a/ishtar_common/forms_items.py b/ishtar_common/forms_items.py deleted file mode 100644 index b763d94b2..000000000 --- a/ishtar_common/forms_items.py +++ /dev/null @@ -1,525 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (C) 2010-2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> - -# 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 <http://www.gnu.org/licenses/>. - -# See the file COPYING for details. - -""" -Items 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 - -import models -import widgets -from forms import Wizard, FinalForm, FormSet, SearchWizard, DeletionWizard,\ - FloatField, formset_factory, get_now, get_form_selection, reverse_lazy -from forms_common import get_town_field, get_warehouse_field, SourceForm, \ - SourceWizard, SourceSelect, SourceDeletionForm, AuthorFormset -from forms_context_records import RecordFormSelection - -class ItemWizard(Wizard): - model = models.Item - - def get_current_contextrecord(self, request, storage): - step = storage.get_current_step() - if not step: - return - if step.endswith('_creation'): # a context record has been selected - main_form_key = 'selecrecord-' + self.url_name - try: - idx = int(self.session_get_value(request, storage, - main_form_key, 'pk')) - current_cr = models.ContextRecord.objects.get(pk=idx) - return current_cr - except(TypeError, ValueError, ObjectDoesNotExist): - pass - current_item = self.get_current_object(request, storage) - if current_item: - base_items = current_item.base_items.all() - if base_items: - return base_items[0].context_record - - def get_template_context(self, request, storage, form=None): - """ - Get the operation and context record "reminder" on top of wizard forms - """ - context = super(ItemWizard, self).get_template_context(request, - storage, form) - current_cr = self.get_current_contextrecord(request, storage) - if not current_cr: - return context - operation = current_cr.operation - items = [] - if hasattr(operation, 'code_patriarche') and operation.code_patriarche: - items.append(unicode(operation.code_patriarche)) - items.append("-".join((unicode(operation.year), - unicode(operation.operation_code)))) - reminder = unicode(_("Current operation: ")) + u" - ".join(items) - reminder += u"<br/>" + unicode(_("Current context record: "))\ - + unicode(current_cr.label) - context['reminder'] = mark_safe(reminder) - return context - - def get_extra_model(self, dct, request, storage, form_list): - dct = super(ItemWizard, self).get_extra_model(dct, request, storage, - form_list) - dct['order'] = 1 - if 'pk' in dct and type(dct['pk']) == models.ContextRecord: - dct['base_items__context_record'] = dct.pop('pk') - return dct - -class ItemForm(forms.Form): - form_label = _("Item") - base_model = 'base_items' - 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_items__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) - item_number = forms.IntegerField(label=_(u"Item number"), required=False) - -class DateForm(forms.Form): - form_label = _("Dating") - base_model = 'dating' - associated_models = {'dating__dating_type':models.DatingType, - 'dating__quality':models.DatingQuality, - 'dating__period':models.Period} - dating__period = forms.ChoiceField(label=_("Period"), - choices=models.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=models.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 = models.DatingType.get_types() - self.fields['dating__dating_type'].help_text = models.DatingType.get_help() - -item_creation_wizard = ItemWizard([ - ('selecrecord-item_creation', RecordFormSelection), - ('item-item_creation', ItemForm), - ('dating-item_creation', DateForm), - ('final-item_creation', FinalForm)], - url_name='item_creation',) - -class ItemSelect(forms.Form): - base_items__context_record__parcel__town = get_town_field() - base_items__context_record__operation__year = forms.IntegerField( - label=_(u"Year")) - base_items__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_items__item__description = forms.CharField(label=_(u"Description")) - base_items__is_isolated = forms.NullBooleanField(label=_(u"Is isolated?")) - - def __init__(self, *args, **kwargs): - super(ItemSelect, self).__init__(*args, **kwargs) - self.fields['dating__period'].choices = \ - models.Period.get_types() - self.fields['dating__period'].help_text = \ - models.Period.get_help() - self.fields['material_type'].choices = \ - models.MaterialType.get_types() - self.fields['material_type'].help_text = \ - models.MaterialType.get_help() - -class ItemFormSelection(forms.Form): - form_label = _("Item search") - associated_models = {'pk':models.Item} - currents = {'pk':models.Item} - pk = forms.IntegerField(label="", required=False, - widget=widgets.JQueryJqGrid(reverse_lazy('get-item'), - ItemSelect(), models.Item, source_full=reverse_lazy('get-item-full')), - validators=[models.valid_id(models.Item)]) - -item_search_wizard = SearchWizard([ - ('general-item_search', ItemFormSelection)], - url_name='item_search',) - -class ItemModificationWizard(ItemWizard): - modification = True - -item_modification_wizard = ItemModificationWizard([ - ('selec-item_modification', ItemFormSelection), - ('item-item_modification', ItemForm), - ('dating-item_modification', DateForm), - ('final-item_modification', FinalForm)], - url_name='item_modification',) - -class TreatmentWizard(Wizard): - model = models.Treatment - -class BaseTreatmentForm(forms.Form): - form_label = _(u"Base treatment") - associated_models = {'treatment_type':models.TreatmentType, - 'person':models.Person, - 'location':models.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=models.Person, new=True), - validators=[models.valid_id(models.Person)]) - location = forms.IntegerField(label=_(u"Location"), - widget=widgets.JQueryAutoComplete( - reverse_lazy('autocomplete-warehouse'), associated_model=models.Warehouse, - new=True), - validators=[models.valid_id(models.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 ItemMultipleFormSelection(forms.Form): - form_label = _(u"Upstream items") - associated_models = {'items':models.Item} - associated_labels = {'items':_(u"Items")} - items = forms.CharField(label="", required=False, - widget=widgets.JQueryJqGrid(reverse_lazy('get-item'), - ItemSelect(), models.Item, multiple=True, multiple_cols=[2, 3, 4]), - validators=[models.valid_ids(models.Item)]) - - def clean(self): - if not 'items' in self.cleaned_data or not self.cleaned_data['items']: - raise forms.ValidationError(_(u"You should at least select one " - u"archaeological item.")) - 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=models.Warehouse, - new=True), - validators=[models.valid_id(models.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 = \ - models.ContainerType.get_types() - self.fields['container_type'].help_text = \ - models.ContainerType.get_help() - - def save(self, user): - dct = self.cleaned_data - dct['history_modifier'] = user - dct['container_type'] = models.ContainerType.objects.get( - pk=dct['container_type']) - dct['location'] = models.Warehouse.objects.get(pk=dct['location']) - new_item = models.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 ResultItemForm(forms.Form): - form_label = _(u"Resulting item") - 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)")) - item_number = forms.IntegerField(label=_(u"Item number")) - -ResultItemFormSet = formset_factory(ResultItemForm, can_delete=True, - formset=FormSet) -ResultItemFormSet.form_label = _(u"Resulting items") - -class UpstreamItemFormSelection(ItemFormSelection): - form_label = _(u"Upstream item") - -treatment_creation_wizard = TreatmentWizard([ - ('basetreatment-treatment_creation', BaseTreatmentForm), - ('selecitem-treatment_creation', UpstreamItemFormSelection), - ('multiselecitems-treatment_creation', ItemMultipleFormSelection), - ('container-treatment_creation', ContainerForm), - ('resultitem-treatment_creation', ResultItemForm), - ('resultitems-treatment_creation', ResultItemFormSet), - ('final-treatment_creation', FinalForm)], - condition_list={ -'selecitem-treatment_creation': - check_treatment('basetreatment-treatment_creation', 'treatment_type', - not_type_list=['physical_grouping', 'packaging']), -'multiselecitems-treatment_creation': - check_treatment('basetreatment-treatment_creation', 'treatment_type', - ['physical_grouping', 'packaging']), -'resultitems-treatment_creation': - check_treatment('basetreatment-treatment_creation', 'treatment_type', - ['split']), -'resultitem-treatment_creation': - check_treatment('basetreatment-treatment_creation', 'treatment_type', - not_type_list=['split']), -'container-treatment_creation': - check_treatment('basetreatment-treatment_creation', 'treatment_type', - ['packaging']), - }, - url_name='treatment_creation',) - -############# -# Packaging # -############# - -class PackagingWizard(TreatmentWizard): - def save_model(self, dct, m2m, whole_associated_models, request, storage, - form_list, return_object): - dct = self.get_extra_model(dct, request, storage, form_list) - obj = self.get_current_saved_object(request, storage) - dct['location'] = dct['container'].location - items = dct.pop('items') - treatment = models.Treatment(**dct) - treatment.save() - if not hasattr(items, '__iter__'): - items = [items] - for item in items: - new = item.duplicate(request.user) - item.downstream_treatment = treatment - item.save() - new.upstream_treatment = treatment - new.container = dct['container'] - new.save() - res = render_to_response('wizard_done.html', {}, - context_instance=RequestContext(request)) - return return_object and (obj, res) or res - -class ContainerSelect(forms.Form): - location = get_warehouse_field() - container_type = forms.ChoiceField(label=_(u"Container type"), choices=[]) - reference = forms.CharField(label=_(u"Reference")) - - def __init__(self, *args, **kwargs): - super(ContainerSelect, self).__init__(*args, **kwargs) - self.fields['container_type'].choices = \ - models.ContainerType.get_types() - self.fields['container_type'].help_text = \ - models.ContainerType.get_help() - -ContainerFormSelection = get_form_selection( - 'ContainerFormSelection', _(u"Container search"), 'container', - models.Container, ContainerSelect, 'get-container', - _(u"You should select a container."), new=True, - new_message=_(u"Add a new container")) - -class BasePackagingForm(forms.Form): - form_label = _(u"Packaging") - associated_models = {'treatment_type':models.TreatmentType, - 'person':models.Person, - 'location':models.Warehouse} - treatment_type = forms.IntegerField(label="", widget=forms.HiddenInput) - person = forms.IntegerField(label=_(u"Packager"), - widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person'), - associated_model=models.Person, new=True), - validators=[models.valid_id(models.Person)]) - start_date = forms.DateField(label=_(u"Date"), required=False, - widget=widgets.JQueryDate) - - def __init__(self, *args, **kwargs): - super(BasePackagingForm, self).__init__(*args, **kwargs) - self.fields['treatment_type'].initial = \ - models.TreatmentType.objects.get(txt_idx='packaging').pk - -class ItemPackagingFormSelection(ItemMultipleFormSelection): - form_label = _(u"Packaged items") - -warehouse_packaging_wizard = PackagingWizard([ - ('seleccontainer-packaging', ContainerFormSelection), - ('base-packaging', BasePackagingForm), - ('multiselecitems-packaging', ItemPackagingFormSelection), - ('final-packaging', FinalForm)], - url_name='warehouse_packaging',) - -""" -warehouse_packaging_wizard = ItemSourceWizard([ - ('selec-warehouse_packaging', ItemsSelection), - ('final-warehouse_packaging', FinalForm)], - url_name='warehouse_packaging',) -""" -############################################# -# Source management for archaelogical items # -############################################# - -class ItemSourceWizard(SourceWizard): - model = models.ItemSource - -SourceItemFormSelection = get_form_selection( - 'SourceItemFormSelection', _(u"Archaelogical item search"), 'item', - models.Item, ItemSelect, 'get-item', - _(u"You should select an archaelogical item.")) - -item_source_creation_wizard = ItemSourceWizard([ - ('selec-item_source_creation', SourceItemFormSelection), - ('source-item_source_creation', SourceForm), - ('authors-item_source_creation', AuthorFormset), - ('final-item_source_creation', FinalForm)], - url_name='item_source_creation',) - -class ItemSourceSelect(SourceSelect): - item__base_items__context_record__operation__year = forms.IntegerField( - label=_(u"Year of the operation")) - item__dating__period = forms.ChoiceField( - label=_(u"Period of the archaelogical item"), - choices=[]) - item__material_type = forms.ChoiceField( - label=_("Material type of the archaelogical item"), - choices=models.MaterialType.get_types()) - item__description = forms.CharField( - label=_(u"Description of the archaelogical item")) - - def __init__(self, *args, **kwargs): - super(ItemSourceSelect, self).__init__(*args, **kwargs) - self.fields['item__dating__period'].choices = \ - models.Period.get_types() - self.fields['item__dating__period'].help_text = \ - models.Period.get_help() - self.fields['item__material_type'].choices = \ - models.MaterialType.get_types() - self.fields['item__material_type'].help_text = \ - models.MaterialType.get_help() - -ItemSourceFormSelection = get_form_selection( - 'ItemSourceFormSelection', _(u"Documentation search"), 'pk', - models.ItemSource, ItemSourceSelect, 'get-itemsource', - _(u"You should select a document.")) - -item_source_modification_wizard = ItemSourceWizard([ - ('selec-item_source_modification', ItemSourceFormSelection), - ('source-item_source_modification', SourceForm), - ('authors-item_source_modification', AuthorFormset), - ('final-item_source_modification', FinalForm)], - url_name='item_source_modification',) - -class ItemSourceDeletionWizard(DeletionWizard): - model = models.ItemSource - fields = ['item', 'title', 'source_type', 'authors',] - -item_source_deletion_wizard = ItemSourceDeletionWizard([ - ('selec-item_source_deletion', ItemSourceFormSelection), - ('final-item_source_deletion', SourceDeletionForm)], - url_name='item_source_deletion',) - -""" - -#################################### -# Source management for treatments # -#################################### - -class TreatmentSourceWizard(SourceWizard): - model = models.TreamentSource - -SourceTreatementFormSelection = get_form_selection( - 'SourceTreatmentFormSelection', _(u"Treatment search"), 'operation', - models.Treatment, TreatmentSelect, 'get-treatment', - _(u"You should select a treatment.")) - -treatment_source_creation_wizard = TreatmentSourceWizard([ - ('selec-treatment_source_creation', SourceTreatmentFormSelection), - ('source-treatment_source_creation', SourceForm), - ('authors-treatment_source_creation', AuthorFormset), - ('final-treatment_source_creation', FinalForm)], - url_name='treatment_source_creation',) - -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 = \ - models.OperationType.get_types() - self.fields['operation__operation_type'].help_text = \ - models.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',) -""" diff --git a/ishtar_common/forms_operations.py b/ishtar_common/forms_operations.py deleted file mode 100644 index e163b5869..000000000 --- a/ishtar_common/forms_operations.py +++ /dev/null @@ -1,754 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (C) 2010-2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> - -# 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 <http://www.gnu.org/licenses/>. - -# See the file COPYING for details. - -""" -Operations 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.db.models import Max -from django.utils.translation import ugettext_lazy as _ - -from ishtar import settings - -import models -import widgets -from forms import Wizard, FinalForm, FormSet, SearchWizard, ClosingWizard, \ - ClosingDateFormSelection, DeletionWizard, formset_factory, get_now, \ - reverse_lazy, get_form_selection -from forms_common import TownForm, TownFormSet, TownFormset, ParcelFormSet, \ - ParcelForm, AuthorFormset, SourceForm, SourceWizard, SourceSelect, \ - SourceDeletionForm, get_town_field - -def is_preventive(form_name, model, type_key='operation_type', key=''): - 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: - typ = int(request.session[storage.prefix]['step_data']\ - [form_name][form_name+'-'+type_key]) - return model.is_preventive(typ, key) - except ValueError: - return False - return func - -class OperationWizard(Wizard): - model = models.Operation - object_parcel_type = 'operation' - - def get_template(self, request, storage): - templates = super(OperationWizard, self).get_template(request, storage) - current_step = storage.get_current_step() or self.get_first_step( - request, storage) - if current_step.startswith('towns-'): - templates = ['towns_wizard.html'] + templates - return templates - - def get_extra_context(self, request, storage): - """ - Return extra context for templates - """ - context = super(OperationWizard, self).get_extra_context(request, - storage) - step = self.determine_step(request, storage) - if not step.startswith('towns-'): - return context - context['TOWNS'] = self.get_towns(request, storage) - return context - - def get_towns(self, request, storage): - """ - Obtention des villes disponibles - """ - general_form_key = 'general-' + self.url_name - towns = [] - file_id = self.session_get_value(request, storage, general_form_key, - "associated_file") - if file_id: - try: - for town in models.File.objects.get(pk=int(file_id) - ).towns.all(): - towns.append((town.pk, unicode(town))) - except (ValueError, ObjectDoesNotExist): - pass - return sorted(towns, key=lambda x:x[1]) - else: - return -1 - - def get_form(self, request, storage, step=None, data=None, files=None): - """ - Manage specifics fields - """ - if data: - data = data.copy() - else: - data = {} - if not step: - step = self.determine_step(request, storage) - form = self.get_form_list(request, storage)[step] - general_form_key = 'general-' + self.url_name - # manage the dynamic choice of towns - if step.startswith('towns-') and hasattr(form, 'management_form'): - data['TOWNS'] = self.get_towns(request, storage) - elif step.startswith('parcels') and hasattr(form, 'management_form'): - file_id = self.session_get_value(request, storage, general_form_key, - "associated_file") - if file_id: - parcels = [] - try: - for parcel in models.File.objects.get(pk=int(file_id) - ).parcels.all(): - parcels.append((parcel.pk, parcel.short_label())) - except (ValueError, ObjectDoesNotExist): - pass - data['PARCELS'] = sorted(parcels, key=lambda x:x[1]) - else: - town_form_key = step.startswith('parcelsgeneral') \ - and 'townsgeneral-' or 'towns-' - town_form_key += self.url_name - town_ids = self.session_get_value(request, storage, - town_form_key, 'town', multi=True) or [] - towns = [] - for town_id in town_ids: - try: - town = models.Town.objects.get(pk=int(town_id)) - towns.append((town.pk, unicode(town))) - except (ValueError, ObjectDoesNotExist): - pass - data['TOWNS'] = sorted(towns, key=lambda x:x[1]) - data = data or None - form = super(OperationWizard, self).get_form(request, storage, step, - data, files) - return form - - def get_formated_datas(self, forms): - """ - Show a specific warning if no archaelogical file is provided - """ - datas = super(OperationWizard, self).get_formated_datas(forms) - # if the general town form is used the advertissement is pertinent - has_no_af = [form.prefix for form in forms - if form.prefix == 'townsgeneral-operation'] and True - if has_no_af: - datas = [[_(u"Warning: No Archaelogical File is provided. " - u"If you have forget it return to the first step."), []]]\ - + datas - return datas - -class OperationSelect(forms.Form): - common_name = forms.CharField(label=_(u"Name"), max_length=30) - towns = get_town_field() - operation_type = forms.ChoiceField(label=_(u"Operation type"), - choices=[]) - remains = forms.ChoiceField(label=_(u"Remains"), - choices=models.RemainType.get_types()) - year = forms.IntegerField(label=_("Year")) - end_date = forms.NullBooleanField(label=_(u"Is open?")) - - def __init__(self, *args, **kwargs): - super(OperationSelect, self).__init__(*args, **kwargs) - self.fields['operation_type'].choices = models.OperationType.get_types() - self.fields['operation_type'].help_text = models.OperationType.get_help() - -class OperationFormSelection(forms.Form): - form_label = _(u"Operation search") - associated_models = {'pk':models.Operation} - currents = {'pk':models.Operation} - pk = forms.IntegerField(label="", required=False, - widget=widgets.JQueryJqGrid(reverse_lazy('get-operation'), - OperationSelect(), models.Operation, - source_full=reverse_lazy('get-operation-full')), - validators=[models.valid_id(models.Operation)]) - - def clean(self): - cleaned_data = self.cleaned_data - if 'pk' not in cleaned_data or not cleaned_data['pk']: - raise forms.ValidationError(_(u"You should select an operation.")) - return cleaned_data - -class OperationCodeInput(forms.TextInput): - """Manage auto complete whene changing year in form""" - def render(self, *args, **kwargs): - name, value = args - base_name = '-'.join(name.split('-')[:-1]) - rendered = super(OperationCodeInput, self).render(*args, **kwargs) - js = u"""\n <script type="text/javascript"><!--// - function initialyse_operation_code () { - // if the form is in creation mode - if(!$("#id_%(base_name)s-pk").val()){ - $("#id_%(base_name)s-year").change(function() { - var year = $("#id_%(base_name)s-year").val(); - var url = "%(url)s" + year; - $.getJSON(url, function(data) { - $("#id_%(name)s").val(data.id); - }); - }); - } - } - $(document).ready(initialyse_operation_code()); - //--></script>\n""" % {'base_name':base_name, 'name':name, - 'url':reverse_lazy('get_available_operation_code')} - return rendered + js - -class OperationFormGeneral(forms.Form): - form_label = _(u"General") - associated_models = {'in_charge':models.Person, - 'associated_file':models.File, - 'operation_type':models.OperationType} - currents = {'associated_file':models.File} - pk = forms.IntegerField(required=False, widget=forms.HiddenInput) - in_charge = forms.IntegerField(label=_("Person in charge of the operation"), - widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person', - args=["_".join( - [unicode(models.PersonType.objects.get(txt_idx='head_scientist').pk), - unicode(models.PersonType.objects.get(txt_idx='sra_agent').pk)])]), - associated_model=models.Person, new=True), - validators=[models.valid_id(models.Person)], required=False) - associated_file = forms.IntegerField(label=_(u"Archaelogical file"), - widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-file'), - associated_model=models.File), - validators=[models.valid_id(models.File)], required=False) - operation_type = forms.ChoiceField(label=_(u"Operation type"), - choices=[]) - start_date = forms.DateField(label=_(u"Start date"), required=False, - widget=widgets.JQueryDate) - excavation_end_date = forms.DateField(label=_(u"Excavation end date"), - required=False, widget=widgets.JQueryDate) - surface = forms.IntegerField(required=False, widget=widgets.AreaWidget, - label=_(u"Total surface (m²)"), - validators=[validators.MinValueValidator(0), - validators.MaxValueValidator(999999999)]) - year = forms.IntegerField(label=_(u"Year"), - initial=lambda:datetime.datetime.now().year, - validators=[validators.MinValueValidator(1900), - validators.MaxValueValidator(2100)]) - operation_code = forms.IntegerField(label=_(u"Operation code"), - initial=models.Operation.get_available_operation_code, - widget=OperationCodeInput) - common_name = forms.CharField(label=_(u"Generic name"), required=False, - max_length=120, widget=forms.Textarea) - operator_reference = forms.CharField(label=_(u"Operator reference"), - required=False, max_length=20) - if settings.COUNTRY == 'fr': - code_patriarche = forms.IntegerField(label=u"Code PATRIARCHE", - required=False) - code_dracar = forms.CharField(label=u"Code DRACAR", required=False, - validators=[validators.MaxLengthValidator(10)]) - comment = forms.CharField(label=_(u"Comment"), widget=forms.Textarea, - required=False) - - def __init__(self, *args, **kwargs): - super(OperationFormGeneral, self).__init__(*args, **kwargs) - self.fields['operation_type'].choices = models.OperationType.get_types() - self.fields['operation_type'].help_text = models.OperationType.get_help() - - def clean(self): - cleaned_data = self.cleaned_data - # verify the logic between start date and excavation end date - if cleaned_data['excavation_end_date']: - if not self.cleaned_data['start_date']: - raise forms.ValidationError(_(u"If you want to set an " - u"excavation end date you have to provide a start date.")) - if cleaned_data['excavation_end_date'] < cleaned_data['start_date']: - raise forms.ValidationError(_(u"The excavation end date "\ - u"cannot be before the start date.")) - year = self.cleaned_data.get("year") - operation_code = cleaned_data.get("operation_code") - ops = models.Operation.objects.filter(year=year, - operation_code=operation_code) - # manage unique operation ID - if 'pk' in cleaned_data and cleaned_data['pk']: - ops = ops.exclude(pk=cleaned_data['pk']) - if ops.count(): - max_val = models.Operation.objects.filter(year=year).aggregate( - Max('operation_code'))["operation_code__max"] - raise forms.ValidationError(_(u"Operation code already exist for " - u"year: %(year)d - use a value bigger than %(last_val)d") % { - 'year':year, 'last_val':max_val}) - return self.cleaned_data - -class OperationFormPreventive(forms.Form): - form_label = _(u"Preventive informations - excavation") - cost = forms.IntegerField(label=_(u"Cost (€)"), required=False) - scheduled_man_days = forms.IntegerField(label=_(u"Scheduled man-days"), - required=False) - optional_man_days = forms.IntegerField(label=_(u"Optional man-days"), - required=False) - effective_man_days = forms.IntegerField(label=_(u"Effective man-days"), - required=False) - if settings.COUNTRY == 'fr': - fnap_financing = forms.FloatField(required=False, - label=u"Pourcentage de financement FNAP", - validators=[validators.MinValueValidator(0), - validators.MaxValueValidator(100)]) - -class OperationFormPreventiveDiag(forms.Form): - form_label = _("Preventive informations - diagnostic") - if settings.COUNTRY == 'fr': - zoning_prescription = forms.NullBooleanField(required=False, - label=_(u"Prescription on zoning")) - large_area_prescription = forms.NullBooleanField(required=False, - label=_(u"Prescription on large area")) - geoarchaeological_context_prescription = forms.NullBooleanField( - required=False, label=_(u"Prescription on geoarchaeological context")) - -class SelectedTownForm(forms.Form): - form_label = _("Towns") - associated_models = {'town':models.Town} - town = forms.ChoiceField(label=_("Town"), choices=(), - validators=[models.valid_id(models.Town)]) - def __init__(self, *args, **kwargs): - towns = None - if 'data' in kwargs and 'TOWNS' in kwargs['data']: - towns = kwargs['data']['TOWNS'] - # clean data if not "real" data - prefix_value = kwargs['prefix'] + '-town' - if not [k for k in kwargs['data'].keys() - if k.startswith(prefix_value) and kwargs['data'][k]]: - kwargs['data'] = None - if 'files' in kwargs: - kwargs.pop('files') - super(SelectedTownForm, self).__init__(*args, **kwargs) - if towns and towns != -1: - self.fields['town'].choices = [('', '--')] + towns - -SelectedTownFormset = formset_factory(SelectedTownForm, can_delete=True, - formset=TownFormSet) -SelectedTownFormset.form_label = _(u"Towns") - -class SelectedParcelForm(forms.Form): - form_label = _("Parcels") - associated_models = {'parcel':models.Parcel} - parcel = forms.ChoiceField(label=_("Parcel"), choices=(), - validators=[models.valid_id(models.Parcel)]) - def __init__(self, *args, **kwargs): - parcels = None - if 'data' in kwargs and 'PARCELS' in kwargs['data']: - parcels = kwargs['data']['PARCELS'] - # clean data if not "real" data - prefix_value = kwargs['prefix'] + '-parcel' - if not [k for k in kwargs['data'].keys() - if k.startswith(prefix_value) and kwargs['data'][k]]: - kwargs['data'] = None - if 'files' in kwargs: - kwargs.pop('files') - super(SelectedParcelForm, self).__init__(*args, **kwargs) - if parcels: - self.fields['parcel'].choices = [('', '--')] + parcels - -SelectedParcelFormSet = formset_factory(SelectedParcelForm, can_delete=True, - formset=ParcelFormSet) -SelectedParcelFormSet.form_label = _("Parcels") - -SelectedParcelGeneralFormSet = formset_factory(ParcelForm, can_delete=True, - formset=ParcelFormSet) -SelectedParcelGeneralFormSet.form_label = _("Parcels") - -class RemainForm(forms.Form): - form_label = _("Remain types") - base_model = 'remain' - associated_models = {'remain':models.RemainType} - remain = forms.ChoiceField(label=_("Remain type"), required=False, - choices=models.RemainType.get_types()) - -class RemainFormSet(FormSet): - def clean(self): - """Checks that no remain types are duplicated.""" - return self.check_duplicate(['remain_type'], - _(u"There are identical remain types")) - -RemainFormset = formset_factory(RemainForm, can_delete=True, - formset=RemainFormSet) -RemainFormset.form_label = _("Remain types") - -class PeriodForm(forms.Form): - form_label = _("Periods") - base_model = 'period' - associated_models = {'period':models.Period} - period = forms.ChoiceField(label=_("Period"), required=False, - choices=models.Period.get_types()) - -class PeriodFormSet(FormSet): - def clean(self): - """Checks that no period are duplicated.""" - return self.check_duplicate(['period'], - _(u"There are identical periods")) - -PeriodFormset = formset_factory(PeriodForm, can_delete=True, - formset=PeriodFormSet) -PeriodFormset.form_label = _("Periods") - -operation_search_wizard = SearchWizard([ - ('general-operation_search', OperationFormSelection)], - url_name='operation_search',) - -def has_associated_file(form_name, file_key='associated_file', negate=False): - 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 + '-' + file_key not in \ - request.session[storage.prefix]['step_data'][form_name]: - return negate - try: - file_id = int(request.session[storage.prefix]['step_data']\ - [form_name][form_name+'-'+file_key]) - return not negate - except ValueError: - return negate - return func - -operation_creation_wizard = OperationWizard([ - ('general-operation_creation', OperationFormGeneral), - ('preventive-operation_creation', OperationFormPreventive), - ('preventivediag-operation_creation', OperationFormPreventiveDiag), - ('townsgeneral-operation_creation', TownFormset), - ('towns-operation_creation', SelectedTownFormset), - ('parcelsgeneral-operation_creation', SelectedParcelGeneralFormSet), - ('parcels-operation_creation', SelectedParcelFormSet), - ('remains-operation_creation', RemainFormset), - ('periods-operation_creation', PeriodFormset), - ('final-operation_creation', FinalForm)], - condition_list={ -'preventive-operation_creation':is_preventive('general-operation_creation', - models.OperationType, 'operation_type', 'prev_excavation'), -'preventivediag-operation_creation':is_preventive('general-operation_creation', - models.OperationType, 'operation_type', 'arch_diagnostic'), -'townsgeneral-operation_creation':has_associated_file( - 'general-operation_creation', negate=True), -'towns-operation_creation':has_associated_file('general-operation_creation'), -'parcelsgeneral-operation_creation':has_associated_file( - 'general-operation_creation', negate=True), -'parcels-operation_creation':has_associated_file('general-operation_creation'), - }, - url_name='operation_creation',) - -class OperationModificationWizard(OperationWizard): - modification = True - -operation_modification_wizard = OperationModificationWizard([ - ('selec-operation_modification', OperationFormSelection), - ('general-operation_modification', OperationFormGeneral), - ('preventive-operation_modification', OperationFormPreventive), - ('preventivediag-operation_modification', OperationFormPreventiveDiag), - ('towns-operation_modification', SelectedTownFormset), - ('townsgeneral-operation_modification', TownFormset), - ('parcels-operation_modification', SelectedParcelFormSet), - ('parcelsgeneral-operation_modification', SelectedParcelGeneralFormSet), - ('remains-operation_modification', RemainFormset), - ('periods-operation_modification', PeriodFormset), - ('final-operation_modification', FinalForm)], - condition_list={ -'preventive-operation_modification':is_preventive( - 'general-operation_modification', models.OperationType, - 'operation_type', 'prev_excavation'), -'preventivediag-operation_modification':is_preventive( - 'general-operation_modification', models.OperationType, - 'operation_type', 'arch_diagnostic'), -'townsgeneral-operation_modification':has_associated_file( - 'general-operation_modification', negate=True), -'towns-operation_modification':has_associated_file( - 'general-operation_modification'), -'parcelsgeneral-operation_modification':has_associated_file( - 'general-operation_modification', negate=True), -'parcels-operation_modification':has_associated_file( - 'general-operation_modification'), - }, - url_name='operation_modification',) - -class OperationClosingWizard(ClosingWizard): - model = models.Operation - fields = ['year', 'operation_code', 'operation_type', 'associated_file', -'in_charge', 'start_date', 'excavation_end_date', 'comment', 'towns', 'remains'] - -class FinalOperationClosingForm(FinalForm): - confirm_msg = " " - confirm_end_msg = _(u"Would you like to close this operation?") - -operation_closing_wizard = OperationClosingWizard([ - ('selec-operation_closing', OperationFormSelection), - ('date-operation_closing', ClosingDateFormSelection), - ('final-operation_closing', FinalOperationClosingForm)], - url_name='operation_closing',) - -class OperationDeletionWizard(DeletionWizard): - model = models.Operation - fields = OperationClosingWizard.fields - -class OperationDeletionForm(FinalForm): - confirm_msg = " " - confirm_end_msg = _(u"Would you like to delete this operation?") - -operation_deletion_wizard = OperationDeletionWizard([ - ('selec-operation_deletion', OperationFormSelection), - ('final-operation_deletion', OperationDeletionForm)], - url_name='operation_deletion',) - -#################################### -# Source management for operations # -#################################### - -class OperationSourceWizard(SourceWizard): - model = models.OperationSource - def get_form_initial(self, request, storage, step): - initial = super(OperationSourceWizard, self).get_form_initial(request, - storage, step) - # put default index and operation_id field in the main source form - general_form_key = 'selec-' + self.url_name - if step.startswith('source-') \ - and self.session_has_key(request, storage, general_form_key): - gen_storage = request.session[storage.prefix]['step_data']\ - [general_form_key] - if general_form_key+"-operation" in gen_storage: - operation_id = int(gen_storage[general_form_key+"-operation"]) - elif general_form_key+"-pk" in gen_storage: - pk = int(gen_storage[general_form_key+"-pk"]) - try: - source = models.OperationSource.objects.get(pk=pk) - operation_id = source.operation.pk - except ObjectDoesNotExist: - pass - if operation_id: - initial['hidden_operation_id'] = operation_id - if 'index' not in initial: - max_val = models.OperationSource.objects.filter( - operation__pk=operation_id).aggregate( - Max('index'))["index__max"] - initial['index'] = max_val and (max_val + 1) or 1 - return initial - -class OperationSourceForm(SourceForm): - pk = forms.IntegerField(required=False, widget=forms.HiddenInput) - index = forms.IntegerField(label=_(u"Index")) - hidden_operation_id = forms.IntegerField(label="", widget=forms.HiddenInput) - - def __init__(self, *args, **kwargs): - super(OperationSourceForm, self).__init__(*args, **kwargs) - keyOrder = self.fields.keyOrder - keyOrder.pop(keyOrder.index('index')) - keyOrder.insert(keyOrder.index('source_type') + 1, 'index') - - def clean(self): - # manage unique operation ID - cleaned_data = self.cleaned_data - operation_id = cleaned_data.get("hidden_operation_id") - index = cleaned_data.get("index") - srcs = models.OperationSource.objects.filter(index=index, - operation__pk=operation_id) - if 'pk' in cleaned_data and cleaned_data['pk']: - srcs = srcs.exclude(pk=cleaned_data['pk']) - if srcs.count(): - max_val = models.OperationSource.objects.filter( - operation__pk=operation_id - ).aggregate(Max('index'))["index__max"] - operation = models.Operation.objects.get(pk=operation_id) - raise forms.ValidationError(_(u"Index already exist for " -"operation: %(operation)s - use a value bigger than %(last_val)d") % { - "operation":unicode(operation), 'last_val':max_val}) - return cleaned_data - -SourceOperationFormSelection = get_form_selection( - 'SourceOperationFormSelection', _(u"Operation search"), 'operation', - models.Operation, OperationSelect, 'get-operation', - _(u"You should select an operation.")) - -operation_source_creation_wizard = OperationSourceWizard([ - ('selec-operation_source_creation', SourceOperationFormSelection), - ('source-operation_source_creation',OperationSourceForm), - ('authors-operation_source_creation', AuthorFormset), - ('final-operation_source_creation', FinalForm)], - url_name='operation_source_creation',) - -class OperationSourceSelect(SourceSelect): - operation__towns = get_town_field(label=_(u"Operation's town")) - operation__operation_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 = \ - models.OperationType.get_types() - self.fields['operation__operation_type'].help_text = \ - models.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', OperationSourceForm), - ('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',) - -################################################ -# Administrative act management for operations # -################################################ - -class OperationAdministrativeActWizard(OperationWizard): - edit = False - - def get_extra_model(self, dct, request, storage, form_list): - dct['history_modifier'] = request.user - return dct - - def get_associated_item(self, request, storage, dct): - return self.get_current_object(request, storage) - - def save_model(self, dct, m2m, whole_associated_models, request, storage, - form_list, return_object): - associated_item = self.get_associated_item(request, storage, dct) - if not associated_item: - return self.render(request, storage, form_list[-1]) - if isinstance(associated_item, models.File): - dct['associated_file'] = associated_item - elif isinstance(associated_item, models.Operation): - dct['operation'] = associated_item - dct['history_modifier'] = request.user - if 'pk' in dct: - dct.pop('pk') - if self.edit: - admact = self.get_current_object(request, storage) - for k in dct: - if hasattr(admact, k): - setattr(admact, k, dct[k]) - else: - admact = models.AdministrativeAct(**dct) - admact.save() - res = render_to_response('wizard_done.html', {}, - context_instance=RequestContext(request)) - return res - -class OperationEditAdministrativeActWizard(OperationAdministrativeActWizard): - model = models.AdministrativeAct - edit = True - def get_associated_item(self, request, storage, dct): - return self.get_current_object(request, storage).operation - -class AdministrativeActOpeSelect(forms.Form): - operation__towns = get_town_field() - act_type = forms.ChoiceField(label=_("Act type"), choices=[]) - - def __init__(self, *args, **kwargs): - super(AdministrativeActOpeSelect, self).__init__(*args, **kwargs) - self.fields['act_type'].choices = models.ActType.get_types( - dct={'intented_to':'O'}) - self.fields['act_type'].help_text = models.ActType.get_help( - dct={'intented_to':'O'}) - -class AdministrativeActOpeFormSelection(forms.Form): - form_label = _("Administrative act search") - associated_models = {'pk':models.AdministrativeAct} - currents = {'pk':models.AdministrativeAct} - pk = forms.IntegerField(label="", required=False, - widget=widgets.JQueryJqGrid(reverse_lazy('get-administrativeactop'), - AdministrativeActOpeSelect(), models.AdministrativeAct, - table_cols='TABLE_COLS_OPE'), - validators=[models.valid_id(models.AdministrativeAct)]) - - def clean(self): - cleaned_data = self.cleaned_data - if 'pk' not in cleaned_data or not cleaned_data['pk']: - raise forms.ValidationError(_(u"You should select an administrative" - " act.")) - return cleaned_data - -class AdministrativeActOpeForm(forms.Form): - form_label = _("General") - associated_models = {'act_type':models.ActType, - 'signatory':models.Person} - act_type = forms.ChoiceField(label=_("Act type"), choices=[]) - signatory = forms.IntegerField(label=_("Signatory"), - widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person'), - associated_model=models.Person, new=True), - validators=[models.valid_id(models.Person)]) - act_object = forms.CharField(label=_(u"Object"), max_length=200, - widget=forms.Textarea) - signature_date = forms.DateField(label=_(u"Signature date"), - widget=widgets.JQueryDate) - if settings.COUNTRY == 'fr': - ref_sra = forms.CharField(label=u"Référence SRA", max_length=15) - - def __init__(self, *args, **kwargs): - super(AdministrativeActOpeForm, self).__init__(*args, **kwargs) - self.fields['act_type'].choices = models.ActType.get_types( - dct={'intented_to':'O'}) - self.fields['act_type'].help_text = models.ActType.get_help( - dct={'intented_to':'O'}) - -class AdministrativeActDeletionWizard(ClosingWizard): - model = models.AdministrativeAct - fields = ['act_type', 'in_charge', 'operator', 'scientific', 'signatory', - 'operation', 'associated_file', 'signature_date', 'act_object',] - if settings.COUNTRY == 'fr': - fields += ['ref_sra'] - - def done(self, request, storage, form_list, **kwargs): - obj = self.get_current_object(request, storage) - obj.delete() - return render_to_response('wizard_done.html', {}, - context_instance=RequestContext(request)) - -class FinalAdministrativeActDeleteForm(FinalForm): - confirm_msg = " " - confirm_end_msg = _(u"Would you like to delete this administrative act?") - -operation_administrativeactop_wizard = OperationAdministrativeActWizard([ - ('selec-operation_administrativeactop', OperationFormSelection), - ('administrativeact-operation_administrativeactop', AdministrativeActOpeForm), - ('final-operation_administrativeactop', FinalForm)], - url_name='operation_administrativeactop',) - -operation_administrativeactop_modification_wizard = \ - OperationEditAdministrativeActWizard([ - ('selec-operation_administrativeactop_modification', - AdministrativeActOpeFormSelection), - ('administrativeact-operation_administrativeactop_modification', - AdministrativeActOpeForm), - ('final-operation_administrativeactop_modification', FinalForm)], - url_name='operation_administrativeactop_modification',) - -operation_administrativeactop_deletion_wizard = AdministrativeActDeletionWizard([ - ('selec-operation_administrativeactop_deletion', - AdministrativeActOpeFormSelection), - ('final-operation_administrativeactop_deletion', - FinalAdministrativeActDeleteForm)], - url_name='operation_administrativeactop_deletion',) diff --git a/ishtar_common/menus.py b/ishtar_common/menus.py index c55e2a328..3737846b9 100644 --- a/ishtar_common/menus.py +++ b/ishtar_common/menus.py @@ -47,127 +47,31 @@ _extra_menus = [( ] )] +# collect menu from INSTALLED_APPS for app in settings.INSTALLED_APPS: + print app + if app == 'ishtar_common': + continue mod = __import__(app, fromlist=['ishtar_menu']) if hasattr(mod, 'ishtar_menu'): menu = getattr(mod, 'ishtar_menu') - _extra_menus.append((menu.ORDER, menu.MENU_SECTIONS)) + _extra_menus += menu.MENU_SECTIONS -_section_items = [] -for order, menu in sorted(_extra_menus, key=lambda x:x[0]): - _section_items += menu +# sort +__section_items = [menu for order, menu in sorted(_extra_menus, + key=lambda x:x[0])] + +# regroup menus +_section_items, __keys = [], [] +for section_item in _section_items: + if section_item.idx not in __keys: + __keys.append(section_item.idx) + _section_items.append(section_item) + continue + _section_items[_section_items.index(section_item.idx)].childs.append( + section_item.childs) """ - SectionItem('record_management', _(u"Context record"), - childs=[ - MenuItem('record_search', _(u"Search"), - model=models.ContextRecord, - access_controls=['view_contextrecord', - 'view_own_contextrecord']), - MenuItem('record_creation', _(u"Creation"), - model=models.ContextRecord, - access_controls=['add_contextrecord', - 'add_own_contextrecord']), - MenuItem('record_modification', _(u"Modification"), - model=models.ContextRecord, - access_controls=['change_contextrecord', - 'change_own_contextrecord']), - MenuItem('record_deletion', _(u"Deletion"), - model=models.ContextRecord, - access_controls=['delete_contextrecord', - 'delete_own_contextrecord']), - ]), - SectionItem('item_management', _(u"Item"), - childs=[ - MenuItem('item_search', _(u"Search"), - model=models.Item, - access_controls=['view_item', - 'view_own_item']), - MenuItem('item_creation', _(u"Creation"), - model=models.Item, - access_controls=['add_item', - 'add_own_item']), - MenuItem('item_modification', _(u"Modification"), - model=models.Item, - access_controls=['change_item', - 'change_own_item']), - MenuItem('warehouse_packaging', _(u"Packaging"), - model=models.Treatment, - access_controls=['add_treatment', 'add_own_treatment']), - #MenuItem('treatment_creation', _(u"Add a treatment"), - # model=models.Treatment, - # access_controls=['add_treatment', - # 'add_own_treatment']), - ]), - SectionItem('source_management', _(u"Documentation"), - childs=[ - SectionItem('admin_add_sources', _(u"Add"), - childs=[ - MenuItem('operation_source_creation', - _(u"Related to an operation"), - model=models.OperationSource, - access_controls=['change_operation', - 'change_own_operation']), - MenuItem('record_source_creation', - _(u"Related to a context record"), - model=models.ContextRecordSource, - access_controls=['change_contextrecord', - 'change_own_contextrecord']), - MenuItem('item_source_creation', - _(u"Related to an archaelogical item"), - model=models.ItemSource, - access_controls=['change_item', - 'change_own_item']), - ]), - SectionItem('admin_mod_sources', _(u"Modify"), - childs=[ - MenuItem('operation_source_modification', - _(u"Related to an operation"), - model=models.OperationSource, - access_controls=['change_operation', - 'change_own_operation']), - MenuItem('record_source_modification', - _(u"Related to a context record"), - model=models.ContextRecordSource, - access_controls=['change_contextrecord', - 'change_own_contextrecord']), - MenuItem('item_source_modification', - _(u"Related to an archaelogical item"), - model=models.ItemSource, - access_controls=['change_item', - 'change_own_item']), - ]), - SectionItem('admin_del_sources', _(u"Deletion"), - childs=[ - MenuItem('operation_source_deletion', - _(u"Related to an operation"), - model=models.OperationSource, - access_controls=['change_operation', - 'change_own_operation']), - MenuItem('record_source_deletion', - _(u"Related to a context record"), - model=models.ContextRecordSource, - access_controls=['change_contextrecord', - 'change_own_contextrecord']), - MenuItem('item_source_deletion', - _(u"Related to an archaelogical item"), - model=models.ItemSource, - access_controls=['change_item', - 'change_own_item']), - ]), - ]), - #SectionItem('warehouse', _(u"Warehouse"), - # childs=[ - # MenuItem('warehouse_inventory', _(u"Inventory"), - # model=models.Warehouse, - # access_controls=['change_warehouse',]), - # MenuItem('warehouse_recording', _(u"Recording"), - # model=models.Treatment, - # access_controls=['add_treatment', 'add_own_treatment']), - # MenuItem('warehouse_lend', _(u"Lending"), - # model=models.Treatment, - # access_controls=['add_treatment', 'add_own_treatment']), - # ]), SectionItem('dashboard', _(u"Dashboard"), childs=[ MenuItem('dashboard_main', _(u"General informations"), diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 4406a2b86..b4bf2cd57 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -398,570 +398,6 @@ class UserDashboard: self.types = types.annotate(number=Count('pk'))\ .order_by('person__person_type') -class FileDashboard: - def __init__(self): - main_dashboard = Dashboard(File) - - self.total_number = main_dashboard.total_number - - types = File.objects.values('file_type', 'file_type__label') - self.types = types.annotate(number=Count('pk')).order_by('file_type') - - by_year = File.objects.extra( - {'date':"date_trunc('year', creation_date)"}) - self.by_year = by_year.values('date')\ - .annotate(number=Count('pk')).order_by('-date') - - now = datetime.date.today() - limit = datetime.date(now.year, now.month, 1) - datetime.timedelta(365) - by_month = File.objects.filter(creation_date__gt=limit).extra( - {'date':"date_trunc('month', creation_date)"}) - self.by_month = by_month.values('date')\ - .annotate(number=Count('pk')).order_by('-date') - - # research - self.research = {} - prog_type = FileType.objects.get(txt_idx='prog') - researchs = File.objects.filter(file_type=prog_type) - self.research['total_number'] = researchs.count() - by_year = researchs.extra({'date':"date_trunc('year', creation_date)"}) - self.research['by_year'] = by_year.values('date')\ - .annotate(number=Count('pk'))\ - .order_by('-date') - by_month = researchs.filter(creation_date__gt=limit)\ - .extra({'date':"date_trunc('month', creation_date)"}) - self.research['by_month'] = by_month.values('date')\ - .annotate(number=Count('pk'))\ - .order_by('-date') - - self.research['by_dpt'] = FileByDepartment.objects\ - .filter(file__file_type=prog_type, - department__isnull=False)\ - .values('department__label')\ - .annotate(number=Count('file'))\ - .order_by('department__label') - FileTown = File.towns.through - self.research['towns'] = FileTown.objects\ - .filter(file__file_type=prog_type)\ - .values('town__name')\ - .annotate(number=Count('file'))\ - .order_by('-number','town__name')[:10] - - # rescue - rescue_type = FileType.objects.get(txt_idx='preventive') - rescues = File.objects.filter(file_type=rescue_type) - self.rescue = {} - self.rescue['total_number'] = rescues.count() - self.rescue['saisine'] = rescues.values('saisine_type__label')\ - .annotate(number=Count('pk'))\ - .order_by('saisine_type__label') - self.rescue['administrative_act'] = AdministrativeAct.objects\ - .filter(associated_file__isnull=False)\ - .values('act_type__label')\ - .annotate(number=Count('pk'))\ - .order_by('act_type__pk') - - by_year = rescues.extra({'date':"date_trunc('year', creation_date)"}) - self.rescue['by_year'] = by_year.values('date')\ - .annotate(number=Count('pk'))\ - .order_by('-date') - by_month = rescues.filter(creation_date__gt=limit)\ - .extra({'date':"date_trunc('month', creation_date)"}) - self.rescue['by_month'] = by_month.values('date')\ - .annotate(number=Count('pk'))\ - .order_by('-date') - - self.rescue['by_dpt'] = FileByDepartment.objects\ - .filter(file__file_type=rescue_type, - department__isnull=False)\ - .values('department__label')\ - .annotate(number=Count('file'))\ - .order_by('department__label') - self.rescue['towns'] = FileTown.objects\ - .filter(file__file_type=rescue_type)\ - .values('town__name')\ - .annotate(number=Count('file'))\ - .order_by('-number','town__name')[:10] - - self.rescue['with_associated_operation'] = rescues\ - .filter(operations__isnull=False).count() - - self.rescue['with_associated_operation_percent'] = round( - float(self.rescue['with_associated_operation'])\ - /self.rescue['total_number']*100, 2) - - by_year_operationnal = rescues.filter(operations__isnull=False)\ - .extra({'date':"date_trunc('year', creation_date)"}) - by_year_operationnal = by_year_operationnal.values('date')\ - .annotate(number=Count('pk'))\ - .order_by('-date') - percents, idx = [], 0 - for dct in self.rescue['by_year']: - if idx > len(by_year_operationnal): - break - if by_year_operationnal[idx]['date'] != dct['date'] or\ - not dct['number']: - continue - val = round(float(by_year_operationnal[idx]['number'])/\ - dct['number']*100, 2) - percents.append({'date':dct['date'], 'number':val}) - self.rescue['operational_by_year'] = percents - - self.rescue['surface_by_town'] = FileTown.objects\ - .filter(file__file_type=rescue_type)\ - .values('town__name')\ - .annotate(number=Sum('file__total_surface'))\ - .order_by('-number','town__name')[:10] - self.rescue['surface_by_dpt'] = FileByDepartment.objects\ - .filter(file__file_type=rescue_type, - department__isnull=False)\ - .values('department__label')\ - .annotate(number=Sum('file__total_surface'))\ - .order_by('department__label') - -class OperationDashboard: - def __init__(self): - main_dashboard = Dashboard(Operation) - - self.total_number = main_dashboard.total_number - - self.filters_keys = ['recorded', 'effective', 'active', 'field', - 'documented', 'closed', 'documented_closed'] - filters = { - 'recorded':{}, - 'effective':{'in_charge__isnull':False}, - 'active':{'in_charge__isnull':False, 'end_date__isnull':True}, - 'field':{'excavation_end_date__isnull':True}, - 'documented':{'source__isnull':False}, - 'documented_closed':{'source__isnull':False, - 'end_date__isnull':False}, - 'closed':{'end_date__isnull':False} - } - filters_label = { - 'recorded':_(u"Recorded"), - 'effective':_(u"Effective"), - 'active':_(u"Active"), - 'field':_(u"Field completed"), - 'documented':_(u"Associated report"), - 'closed':_(u"Closed"), - 'documented_closed':_(u"Documented and closed"), - } - self.filters_label = [filters_label[k] for k in self.filters_keys] - self.total = [] - for fltr_key in self.filters_keys: - fltr, lbl = filters[fltr_key], filters_label[fltr_key] - nb = Operation.objects.filter(**fltr).count() - self.total.append((lbl, nb)) - - self.surface_by_type = Operation.objects\ - .values('operation_type__label')\ - .annotate(number=Sum('surface'))\ - .order_by('-number','operation_type__label') - - self.by_type = [] - self.types = OperationType.objects.filter(available=True).all() - for fltr_key in self.filters_keys: - fltr, lbl = filters[fltr_key], filters_label[fltr_key] - type_res = Operation.objects.filter(**fltr).\ - values('operation_type', 'operation_type__label').\ - annotate(number=Count('pk')).\ - order_by('operation_type') - types_dct = {} - for typ in type_res.all(): - types_dct[typ['operation_type']] = typ["number"] - types = [] - for typ in self.types: - if typ.pk in types_dct: - types.append(types_dct[typ.pk]) - else: - types.append(0) - self.by_type.append((lbl, types)) - - self.by_year = [] - self.years = [res['year'] for res in Operation.objects.values('year')\ - .order_by('-year').distinct()] - for fltr_key in self.filters_keys: - fltr, lbl = filters[fltr_key], filters_label[fltr_key] - year_res = Operation.objects.filter(**fltr).\ - values('year').\ - annotate(number=Count('pk')).\ - order_by('year') - years_dct = {} - for yr in year_res.all(): - years_dct[yr['year']] = yr["number"] - years = [] - for yr in self.years: - if yr in years_dct: - years.append(years_dct[yr]) - else: - years.append(0) - self.by_year.append((lbl, years)) - - self.by_realisation_year = [] - self.realisation_years = [res['date'] for res in \ - Operation.objects.extra( - {'date':"date_trunc('year', start_date)"}).values('date')\ - .filter(start_date__isnull=False).order_by('-date').distinct()] - for fltr_key in self.filters_keys: - fltr, lbl = filters[fltr_key], filters_label[fltr_key] - year_res = Operation.objects.filter(**fltr).extra( - {'date':"date_trunc('year', start_date)"}).values('date').\ - values('date').filter(start_date__isnull=False).\ - annotate(number=Count('pk')).\ - order_by('-date') - years_dct = {} - for yr in year_res.all(): - years_dct[yr['date']] = yr["number"] - years = [] - for yr in self.realisation_years: - if yr in years_dct: - years.append(years_dct[yr]) - else: - years.append(0) - self.by_realisation_year.append((lbl, years)) - - self.effective = [] - for typ in self.types: - year_res = Operation.objects.filter(**{'in_charge__isnull':False, - 'operation_type':typ}).\ - values('year').\ - annotate(number=Count('pk')).\ - order_by('-year').distinct() - years_dct = {} - for yr in year_res.all(): - years_dct[yr['year']] = yr["number"] - years = [] - for yr in self.years: - if yr in years_dct: - years.append(years_dct[yr]) - else: - years.append(0) - self.effective.append((typ, years)) - - # TODO: by date - now = datetime.date.today() - limit = datetime.date(now.year, now.month, 1) - datetime.timedelta(365) - by_realisation_month = Operation.objects.filter(start_date__gt=limit, - start_date__isnull=False).extra( - {'date':"date_trunc('month', start_date)"}) - self.last_months = [] - date = datetime.datetime(now.year, now.month, 1) - for mt_idx in xrange(12): - self.last_months.append(date) - if date.month > 1: - date = datetime.datetime(date.year, date.month - 1, 1) - else: - date = datetime.datetime(date.year - 1, 12, 1) - self.by_realisation_month = [] - for fltr_key in self.filters_keys: - fltr, lbl = filters[fltr_key], filters_label[fltr_key] - month_res = by_realisation_month.filter(**fltr).\ - annotate(number=Count('pk')).\ - order_by('-date') - month_dct = {} - for mt in month_res.all(): - month_dct[mt.date] = mt.number - date = datetime.date(now.year, now.month, 1) - months = [] - for date in self.last_months: - if date in month_dct: - months.append(month_dct[date]) - else: - months.append(0) - self.by_realisation_month.append((lbl, months)) - - # survey and excavations - self.survey, self.excavation = {}, {} - for dct_res, ope_types in ((self.survey, ('arch_diagnostic',)), - (self.excavation, ('prev_excavation', - 'prog_excavation'))): - dct_res['total'] = [] - operation_type = {'operation_type__txt_idx__in':ope_types} - for fltr_key in self.filters_keys: - fltr, lbl = filters[fltr_key], filters_label[fltr_key] - fltr.update(operation_type) - nb = Operation.objects.filter(**fltr).count() - dct_res['total'].append((lbl, nb)) - - dct_res['by_year'] = [] - for fltr_key in self.filters_keys: - fltr, lbl = filters[fltr_key], filters_label[fltr_key] - fltr.update(operation_type) - year_res = Operation.objects.filter(**fltr).\ - values('year').\ - annotate(number=Count('pk')).\ - order_by('year') - years_dct = {} - for yr in year_res.all(): - years_dct[yr['year']] = yr["number"] - years = [] - for yr in self.years: - if yr in years_dct: - years.append(years_dct[yr]) - else: - years.append(0) - dct_res['by_year'].append((lbl, years)) - - dct_res['by_realisation_year'] = [] - for fltr_key in self.filters_keys: - fltr, lbl = filters[fltr_key], filters_label[fltr_key] - fltr.update(operation_type) - year_res = Operation.objects.filter(**fltr).extra( - {'date':"date_trunc('year', start_date)"}).values('date').\ - filter(start_date__isnull=False).\ - annotate(number=Count('pk')).\ - order_by('-date') - years_dct = {} - for yr in year_res.all(): - years_dct[yr['date']] = yr["number"] - years = [] - for yr in self.realisation_years: - if yr in years_dct: - years.append(years_dct[yr]) - else: - years.append(0) - dct_res['by_realisation_year'].append((lbl, years)) - - current_year_ope = Operation.objects.filter(**operation_type)\ - .filter(year=datetime.date.today().year) - current_realisation_year_ope = Operation.objects\ - .filter(**operation_type)\ - .filter(start_date__year=datetime.date.today().year) - res_keys = [('area_realised', current_realisation_year_ope)] - if dct_res == self.survey: - res_keys.append(('area', - current_year_ope)) - for res_key, base_ope in res_keys: - dct_res[res_key] = [] - for fltr_key in self.filters_keys: - fltr, lbl = filters[fltr_key], filters_label[fltr_key] - area_res = base_ope.filter(**fltr)\ - .annotate(number=Sum('surface')).all() - val = 0 - if area_res: - val = area_res[0].number - dct_res[res_key].append(val) - # TODO... - res_keys = [('manday_realised', current_realisation_year_ope)] - if dct_res == self.survey: - res_keys.append(('manday', - current_year_ope)) - for res_key, base_ope in res_keys: - dct_res[res_key] = [] - for fltr_key in self.filters_keys: - dct_res[res_key].append('-') - # TODO... - res_keys = [('mandayhect_realised', current_realisation_year_ope)] - if dct_res == self.survey: - res_keys.append(('mandayhect', - current_year_ope)) - for res_key, base_ope in res_keys: - dct_res[res_key] = [] - for fltr_key in self.filters_keys: - dct_res[res_key].append('-') - # TODO... - dct_res['mandayhect_real_effective'] = '-' - if dct_res == self.survey: - dct_res['mandayhect_effective'] = '-' - - - res_keys = [('org_realised', current_realisation_year_ope)] - if dct_res == self.survey: - res_keys.append(('org', current_year_ope)) - for res_key, base_ope in res_keys: - org_res = base_ope.filter(in_charge__attached_to__isnull=False)\ - .values('in_charge__attached_to', - 'in_charge__attached_to__name')\ - .annotate(area=Sum('surface'))\ - .order_by('in_charge__attached_to__name').all() - # TODO: man-days, man-days/hectare - dct_res[res_key] = org_res - - - year_ope = Operation.objects.filter(**operation_type) - res_keys = ['org_by_year'] - if dct_res == self.survey: - res_keys.append('org_by_year_realised') - q = year_ope.values('in_charge__attached_to', - 'in_charge__attached_to__name').\ - filter(in_charge__attached_to__isnull=False).\ - order_by('in_charge__attached_to__name').distinct() - org_list = [(org['in_charge__attached_to'], - org['in_charge__attached_to__name']) for org in q] - org_list_dct = dict(org_list) - for res_key in res_keys: - dct_res[res_key] = [] - years = self.years - if res_key == 'org_by_year_realised': - years = self.realisation_years - for org_id, org_label in org_list: - org_res = year_ope.filter(in_charge__attached_to__pk=org_id) - key_date = '' - if res_key == 'org_by_year': - org_res = org_res.values('year') - key_date = 'year' - else: - org_res = org_res.extra( - {'date':"date_trunc('year', start_date)"}).values('date').\ - filter(start_date__isnull=False) - key_date = 'date' - org_res = org_res.annotate(area=Sum('surface'), - cost=Sum('cost')) - years_dct = {} - for yr in org_res.all(): - area = yr['area'] if yr['area'] else 0 - cost = yr['cost'] if yr['cost'] else 0 - years_dct[yr[key_date]] = (area, cost) - r_years = [] - for yr in years: - if yr in years_dct: - r_years.append(years_dct[yr]) - else: - r_years.append((0, 0)) - dct_res[res_key].append((org_label, r_years)) - area_means, area_sums = [], [] - cost_means, cost_sums = [], [] - for idx, year in enumerate(years): - vals = [r_years[idx] for lbl, r_years in dct_res[res_key]] - sum_area = sum([a for a, c in vals]) - sum_cost = sum([c for a, c in vals]) - area_means.append(sum_area/len(vals)) - area_sums.append(sum_area) - cost_means.append(sum_cost/len(vals)) - cost_sums.append(sum_cost) - dct_res[res_key+'_area_mean'] = area_means - dct_res[res_key+'_area_sum'] = area_sums - dct_res[res_key+'_cost_mean'] = cost_means - dct_res[res_key+'_cost_mean'] = cost_sums - - if dct_res == self.survey: - self.survey['effective'] = [] - for yr in self.years: - year_res = Operation.objects.filter(in_charge__isnull=False, - year=yr).\ - annotate(number=Sum('surface'), - mean=Avg('surface')) - nb = year_res[0].number if year_res.count() else 0 - nb = nb if nb else 0 - mean = year_res[0].mean if year_res.count() else 0 - mean = mean if mean else 0 - self.survey['effective'].append((nb, mean)) - - # TODO:Man-Days/hectare by Year - - # CHECK: month of realisation or month? - dct_res['by_month'] = [] - for fltr_key in self.filters_keys: - fltr, lbl = filters[fltr_key], filters_label[fltr_key] - fltr.update(operation_type) - month_res = by_realisation_month.filter(**fltr).\ - annotate(number=Count('pk')).\ - order_by('-date') - month_dct = {} - for mt in month_res.all(): - month_dct[mt.date] = mt.number - date = datetime.date(now.year, now.month, 1) - months = [] - for date in self.last_months: - if date in month_dct: - months.append(month_dct[date]) - else: - months.append(0) - dct_res['by_month'].append((lbl, months)) - - operation_type = {'operation_type__txt_idx__in':ope_types} - self.departments = [(fd['department__pk'], fd['department__label']) - for fd in OperationByDepartment.objects\ - .filter(department__isnull=False)\ - .values('department__label', 'department__pk')\ - .order_by('department__label').distinct()] - dct_res['by_dpt'] = [] - for dpt_id, dpt_label in self.departments: - vals = OperationByDepartment.objects\ - .filter(department__pk=dpt_id, - operation__operation_type__txt_idx__in=ope_types)\ - .values('department__pk', 'operation__year')\ - .annotate(number=Count('operation'))\ - .order_by('operation__year') - dct_years = {} - for v in vals: - dct_years[v['operation__year']] = v['number'] - years = [] - for y in self.years: - if y in dct_years: - years.append(dct_years[y]) - else: - years.append(0) - years.append(sum(years)) - dct_res['by_dpt'].append((dpt_label, years)) - dct_res['effective_by_dpt'] = [] - for dpt_id, dpt_label in self.departments: - vals = OperationByDepartment.objects\ - .filter(department__pk=dpt_id, - operation__in_charge__isnull=False, - operation__operation_type__txt_idx__in=ope_types)\ - .values('department__pk', 'operation__year')\ - .annotate(number=Count('operation'), - area=Sum('operation__surface'), - fnap=Sum('operation__fnap_cost'), - cost=Sum('operation__cost'))\ - .order_by('operation__year') - dct_years = {} - for v in vals: - values = [] - for value in (v['number'], v['area'], v['cost'], v['fnap']): - values.append(value if value else 0) - dct_years[v['operation__year']] = values - years = [] - for y in self.years: - if y in dct_years: - years.append(dct_years[y]) - else: - years.append((0, 0, 0, 0)) - nbs, areas, costs, fnaps = zip(*years) - years.append((sum(nbs), sum(areas), sum(costs), sum(fnaps))) - dct_res['effective_by_dpt'].append((dpt_label, years)) - - OperationTown = Operation.towns.through - query = OperationTown.objects\ - .filter(operation__in_charge__isnull=False, - operation__operation_type__txt_idx__in=ope_types)\ - .values('town__name', 'town__departement__number')\ - .annotate(nb=Count('operation'))\ - .order_by('-nb', 'town__name')[:10] - dct_res['towns'] = [] - for r in query: - dct_res['towns'].append((u"%s (%s)" % (r['town__name'], - r['town__departement__number']), - r['nb'])) - - if dct_res == self.survey: - query = OperationTown.objects\ - .filter(operation__in_charge__isnull=False, - operation__operation_type__txt_idx__in=ope_types, - operation__surface__isnull=False)\ - .values('town__name', 'town__departement__number')\ - .annotate(nb=Sum('operation__surface'))\ - .order_by('-nb', 'town__name')[:10] - dct_res['towns_surface'] = [] - for r in query: - dct_res['towns_surface'].append((u"%s (%s)" % ( - r['town__name'], r['town__departement__number']), - r['nb'])) - else: - query = OperationTown.objects\ - .filter(operation__in_charge__isnull=False, - operation__operation_type__txt_idx__in=ope_types, - operation__cost__isnull=False)\ - .values('town__name', 'town__departement__number')\ - .annotate(nb=Sum('operation__cost'))\ - .order_by('-nb', 'town__name')[:10] - dct_res['towns_cost'] = [] - for r in query: - dct_res['towns_cost'].append((u"%s (%s)" % (r['town__name'], - r['town__departement__number']), - r['nb'])) - class Dashboard: def __init__(self, model): self.model = model @@ -973,7 +409,7 @@ class Dashboard: last_ids = history_model.objects.values('id')\ .annotate(hd=Max('history_date')) last_ids = last_ids.filter(history_type=modif_type) - if self.model == Item: + if self.model == Find: last_ids = last_ids.filter(downstream_treatment_id__isnull=True) if modif_type == '+': last_ids = last_ids.filter(upstream_treatment_id__isnull=True) @@ -1252,5 +688,3 @@ class Town(models.Model): if settings.COUNTRY == "fr": return u"%s (%s)" % (self.name, self.numero_insee) return self.name - - diff --git a/ishtar_common/templates/sheet_contextrecord.html b/ishtar_common/templates/sheet_contextrecord.html index c2b94bafe..806b06288 100644 --- a/ishtar_common/templates/sheet_contextrecord.html +++ b/ishtar_common/templates/sheet_contextrecord.html @@ -109,7 +109,7 @@ <th>{% trans "Parcel" %}</th> <th class='link'> </th> </tr> - {% for find in item.base_items.all %} + {% for find in item.base_finds.all %} <tr> <td>{{ find.full_label }}</td> {# Displayed as (Patriarche operation code)-(Record unit label)-(Finds label). #} @@ -119,10 +119,10 @@ {# or displayed as (Year)-(index)-(Record unit label)-(material code)-(Finds label indexed by material type) #} <td class='string'>{{find.context_record}}</td> - <td>{{ find.get_last_item.dating}}</td>{# TODO .all|join:", " ? #} - <td>{{ find.get_last_item.description }}</td> - <td>{{ find.get_last_item.weight }}</td> - <td>{{ find.get_last_item.item_number }}</td> + <td>{{ find.get_last_find.dating}}</td>{# TODO .all|join:", " ? #} + <td>{{ find.get_last_find.description }}</td> + <td>{{ find.get_last_find.weight }}</td> + <td>{{ find.get_last_find.item_number }}</td> <td>{{ item.context_record.parcel.short_label }}</td> <td class='link'><a href="#">{% trans "Details" %}</a></td> {#<a href="#" onclick='load_window("{% url show-find find.pk%}");'>{%trans "Details"%}</a></td>#} diff --git a/ishtar_common/templates/sheet_operation.html b/ishtar_common/templates/sheet_operation.html index aa571d20c..edceca989 100644 --- a/ishtar_common/templates/sheet_operation.html +++ b/ishtar_common/templates/sheet_operation.html @@ -156,17 +156,17 @@ <th class='link'> </th> </tr> {% for context_record in item.context_record.all %} - {% for find in context_record.base_items.all %} + {% for find in context_record.base_finds.all %} <tr> <td class="ref">{{ find.full_label }}</td> {# Displayed as (Patriarche operation code)-(Record unit label)-(Finds label). #} {# or displayed as (Year)-(index)-(Record unit label)-(Finds label). #} <td class="ref">{{ find.material_type_label }}</td> <td>{{find.context_record.label}}</td> - <td class='string'>{{ find.get_last_item.dating}}</td>{# TODO .all|join:", " ? #} - <td class='string'>{{ find.get_last_item.description }}</td> - <td>{{ find.get_last_item.weight }}</td> - <td>{{ find.get_last_item.item_number }}</td> + <td class='string'>{{ find.get_last_find.dating}}</td>{# TODO .all|join:", " ? #} + <td class='string'>{{ find.get_last_find.description }}</td> + <td>{{ find.get_last_find.weight }}</td> + <td>{{ find.get_last_find.item_number }}</td> <td class="ref">{{ context_record.parcel.short_label }}</td> <td class='link'><a href="#">{% trans "Details" %}</a></td> {#<a href="#" onclick='load_window("{% url show-find find.pk%}");'>{%trans "Details"%}</a></td>#} diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index f6636255e..40ef4a1d2 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2010-2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -37,97 +37,6 @@ urlpatterns = patterns('', url(r'account_management/(?P<step>.+)?$', views.account_management_wizard, name='account_management'), ) -""" - # Archaelogical files - url(r'file_search/(?P<step>.+)$', - ishtar_forms.file_search_wizard, name='file_search'), - url(r'file_creation/(?P<step>.+)$', - ishtar_forms.file_creation_wizard, name='file_creation'), - url(r'file_modification/(?P<step>.+)$', - ishtar_forms.file_modification_wizard, name='file_modification'), - url(r'file_closing/(?P<step>.+)$', - ishtar_forms.file_closing_wizard, name='file_closing'), - url(r'file_deletion/(?P<step>.+)$', - ishtar_forms.file_deletion_wizard, name='file_deletion'), - url(r'file_administrativeactfile/(?P<step>.+)$', - ishtar_forms.file_administrativeactfile_wizard, - name='file_administrativeactfile'), - url(r'file_administrativeactfile_modification/(?P<step>.+)$', - ishtar_forms.file_administrativeactfile_modification_wizard, - name='file_administrativeactfile_modification'), - url(r'file_administrativeactfile_deletion/(?P<step>.+)$', - ishtar_forms.file_administrativeactfile_deletion_wizard, - name='file_administrativeactfile_deletion'), - # Operations - url(r'operation_search/(?P<step>.+)$', - ishtar_forms.operation_search_wizard, name='operation_search'), - url(r'operation_creation/(?P<step>.+)$', - ishtar_forms.operation_creation_wizard, name='operation_creation'), - url(r'operation_modification/(?P<step>.+)$', - ishtar_forms.operation_modification_wizard, - name='operation_modification'), - url(r'operation_closing/(?P<step>.+)$', - ishtar_forms.operation_closing_wizard, name='operation_closing'), - url(r'operation_deletion/(?P<step>.+)$', - ishtar_forms.operation_deletion_wizard, name='operation_deletion'), - url(r'operation_administrativeactop/(?P<step>.+)$', - ishtar_forms.operation_administrativeactop_wizard, - name='operation_administrativeactop'), - url(r'operation_administrativeactop_modification/(?P<step>.+)$', - ishtar_forms.operation_administrativeactop_modification_wizard, - name='operation_administrativeactop_modification'), - url(r'operation_administrativeactop_deletion/(?P<step>.+)$', - ishtar_forms.operation_administrativeactop_deletion_wizard, - name='operation_administrativeactop_deletion'), - url(r'operation_source_creation/(?P<step>.+)$', - ishtar_forms.operation_source_creation_wizard, - name='operation_source_creation'), - url(r'operation_source_modification/(?P<step>.+)$', - ishtar_forms.operation_source_modification_wizard, - name='operation_source_modification'), - url(r'operation_source_deletion/(?P<step>.+)$', - ishtar_forms.operation_source_deletion_wizard, - name='operation_source_deletion'), - # Context records - url(r'record_search/(?P<step>.+)$', - ishtar_forms.record_search_wizard, name='record_search'), - url(r'record_creation/(?P<step>.+)$', - ishtar_forms.record_creation_wizard, name='record_creation'), - url(r'record_modification/(?P<step>.+)$', - ishtar_forms.record_modification_wizard, name='record_modification'), - url(r'record_deletion/(?P<step>.+)$', - ishtar_forms.record_deletion_wizard, name='record_deletion'), - url(r'record_source_creation/(?P<step>.+)$', - ishtar_forms.record_source_creation_wizard, - name='record_source_creation'), - url(r'record_source_modification/(?P<step>.+)$', - ishtar_forms.record_source_modification_wizard, - name='record_source_modification'), - url(r'record_source_deletion/(?P<step>.+)$', - ishtar_forms.record_source_deletion_wizard, - name='record_source_deletion'), - # Finds - url(r'item_search/(?P<step>.+)$', - ishtar_forms.item_search_wizard, name='item_search'), - url(r'item_creation/(?P<step>.+)$', - ishtar_forms.item_creation_wizard, name='item_creation'), - url(r'item_modification/(?P<step>.+)$', - ishtar_forms.item_modification_wizard, name='item_modification'), - url(r'item_source_creation/(?P<step>.+)$', - ishtar_forms.item_source_creation_wizard, - name='item_source_creation'), - url(r'item_source_modification/(?P<step>.+)$', - ishtar_forms.item_source_modification_wizard, - name='item_source_modification'), - url(r'item_source_deletion/(?P<step>.+)$', - ishtar_forms.item_source_deletion_wizard, - name='item_source_deletion'), - # Treatments - url(r'treatment_creation/(?P<step>.+)$', - ishtar_forms.treatment_creation_wizard, name='treatment_creation'), - url(r'warehouse_packaging/(?P<step>.+)$', - ishtar_forms.warehouse_packaging_wizard, name='warehouse_packaging'), - )""" for section in menu.childs: for menu_item in section.childs: if hasattr(menu_item, 'childs'): @@ -142,6 +51,8 @@ urlpatterns += patterns('ishtar_common.views', # General url(r'(?P<action_slug>' + actions + r')/$', 'action', name='action'), + url(r'update-current-item/$', 'update_current_item', + name='update-current-item'), url(r'new-person/(?P<parent_name>.+)?/$', 'new_person', name='new-person'), url(r'autocomplete-person/([0-9_]+)?$', 'autocomplete_person', @@ -156,66 +67,4 @@ urlpatterns += patterns('ishtar_common.views', 'new_organization', name='new-organization'), url(r'autocomplete-organization/([0-9_]+)?$', 'autocomplete_organization', name='autocomplete-organization'), - url(r'new-warehouse/(?P<parent_name>.+)?/$', - 'new_warehouse', name='new-warehouse'), - url(r'autocomplete-warehouse/$', 'autocomplete_warehouse', - name='autocomplete-warehouse'), - # Archaelogical files - url(r'autocomplete-file/$', 'autocomplete_file', - name='autocomplete-file'), - url(r'get-file/(?P<type>.+)?$', 'get_file', - name='get-file'), - url(r'get-file-full/(?P<type>.+)?$', 'get_file', - name='get-file-full', kwargs={'full':True}), - url(r'get-administrativeactfile/(?P<type>.+)?$', - 'get_administrativeactfile', name='get-administrativeactfile'), - url(r'show-file/(?P<pk>.+)?/(?P<type>.+)?$', 'show_file', - name='show-file'), - url(r'show-historized-file/(?P<pk>.+)?/(?P<date>.+)?$', - 'show_file', name='show-historized-file'), - url(r'revert-file/(?P<pk>.+)/(?P<date>.+)$', - 'revert_file', name='revert-file'), - # Operations - url(r'autocomplete-operation/$', 'autocomplete_operation', - name='autocomplete-operation'), - url(r'get-operation/(?P<type>.+)?$', 'get_operation', - name='get-operation'), - url(r'get-operation-full/(?P<type>.+)?$', 'get_operation', - name='get-operation-full', kwargs={'full':True}), - url(r'get-available-operation-code/(?P<year>.+)?$', - 'get_available_operation_code', name='get_available_operation_code'), - url(r'revert-operation/(?P<pk>.+)/(?P<date>.+)$', - 'revert_operation', name='revert-operation'), - url(r'show-operation/(?P<pk>.+)?/(?P<type>.+)?$', - 'show_operation', name='show-operation'), - url(r'get-administrativeactop/(?P<type>.+)?$', - 'get_administrativeactop', name='get-administrativeactop'), - url(r'get-operationsource/(?P<type>.+)?$', - 'get_operationsource', name='get-operationsource'), - # Context records - url(r'show-contextrecord/(?P<pk>.+)?/(?P<type>.+)?$', - 'show_contextrecord', name='show-contextrecord'), - url(r'get-contextrecord/(?P<type>.+)?$', 'get_contextrecord', - name='get-contextrecord'), - url(r'get-contextrecord-full/(?P<type>.+)?$', - 'get_contextrecord', name='get-contextrecord-full', - kwargs={'full':True}), - url(r'get-contexrecordsource/(?P<type>.+)?$', - 'get_contextrecordsource', name='get-contextrecordsource'), - # Finds - url(r'update-current-item/$', 'update_current_item', - name='update-current-item'), - url(r'get-item/(?P<type>.+)?$', 'get_archaeologicalitem', - name='get-item'), - url(r'get-item-full/(?P<type>.+)?$', 'get_archaeologicalitem', - name='get-item-full', kwargs={'full':True}), - url(r'get-itemsource/(?P<type>.+)?$', - 'get_itemsource', name='get-itemsource'), - url(r'get-container/$', 'get_container', - name='get-container'), - # Treatments - url(r'autocomplete-container/?$', - 'autocomplete_container', name='autocomplete-container'), - url(r'new-container/(?P<parent_name>.+)?/$', - 'new_container', name='new-container'), ) diff --git a/ishtar_common/views.py b/ishtar_common/views.py index fe464ade7..69fa8b90b 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2010-2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -886,32 +886,6 @@ def autocomplete_town(request): for town in towns]) return HttpResponse(data, mimetype='text/plain') -def autocomplete_file(request): - person_types = request.user.ishtaruser.person.person_type - if (not request.user.has_perm('ishtar_common.view_file', models.File) and \ - not request.user.has_perm('ishtar_common.view_own_file', models.File) - and not person_types.rights.filter(wizard__url_name='file_search' - ).count()): - return HttpResponse(mimetype='text/plain') - if not request.GET.get('term'): - return HttpResponse(mimetype='text/plain') - q = request.GET.get('term') - query = Q() - for q in q.split(' '): - extra = Q(internal_reference__icontains=q) | \ - Q(towns__name__icontains=q) - try: - value = int(q) - extra = extra | Q(year=q) | Q(numeric_reference=q) - except ValueError: - pass - query = query & extra - limit = 20 - files = models.File.objects.filter(query)[:limit] - data = json.dumps([{'id':file.pk, 'value':unicode(file)} - for file in files]) - return HttpResponse(data, mimetype='text/plain') - from types import NoneType def format_val(val): @@ -1198,72 +1172,6 @@ def revert_item(model): return HttpResponse("True", mimetype='text/plain') return func - -get_file = get_item(models.File, 'get_file', 'file') -show_file = show_item(models.File, 'file') -revert_file = revert_item(models.File) - -def autocomplete_operation(request, non_closed=True): - person_types = request.user.ishtaruser.person.person_type - if (not request.user.has_perm('ishtar_common.view_operation', models.Operation)\ - and not request.user.has_perm('ishtar_common.view_own_operation', - models.Operation) - and not person_types.rights.filter(wizard__url_name='operation_search' - ).count()): - return HttpResponse(mimetype='text/plain') - if not request.GET.get('term'): - return HttpResponse(mimetype='text/plain') - q = request.GET.get('term') - query = Q() - for q in q.split(' '): - extra = Q(towns__name__icontains=q) - try: - value = int(q) - extra = extra | Q(year=q) | Q(operation_code=q) - except ValueError: - pass - query = query & extra - if non_closed: - query = query & Q(end_date__isnull=True) - limit = 15 - operations = models.Operation.objects.filter(query)[:limit] - data = json.dumps([{'id':operation.pk, 'value':unicode(operation)} - for operation in operations]) - return HttpResponse(data, mimetype='text/plain') - -def get_available_operation_code(request, year=None): - if not request.user.has_perm('ishtar_common.view_operation', models.Operation)\ - and not request.user.has_perm('ishtar_common.view_own_operation', - models.Operation): - return HttpResponse(mimetype='text/plain') - data = json.dumps({'id':models.Operation.get_available_operation_code(year)}) - return HttpResponse(data, mimetype='text/plain') - -get_operation = get_item(models.Operation, 'get_operation', 'operation', - bool_fields = ['end_date__isnull'], - extra_request_keys={'common_name':'common_name__icontains', - 'end_date':'end_date__isnull', - 'year_index':('year', 'operation_code')}) -show_operation = show_item(models.Operation, 'operation') -revert_operation = revert_item(models.Operation) - -get_operationsource = get_item(models.OperationSource, - 'get_operationsource', 'operationsource', - extra_request_keys={'operation__towns':'operation__towns__pk', - 'operation__operation_type':'operation__operation_type__pk', - 'operation__year':'operation__year'}) - -get_administrativeactfile = get_item(models.AdministrativeAct, - 'get_administrativeactfile', 'administrativeactfile', - extra_request_keys={'associated_file__towns':'associated_file__towns__pk', - 'operation__towns':'operation__towns__pk', - 'act_type__intented_to':'act_type__intented_to'}) -get_administrativeactop = get_item(models.AdministrativeAct, - 'get_administrativeactop', 'administrativeactop', - extra_request_keys={'associated_file__towns':'associated_file__towns__pk', - 'operation__towns':'operation__towns__pk', - 'act_type__intented_to':'act_type__intented_to'}) - def autocomplete_organization(request, orga_type=None): person_types = request.user.ishtaruser.person.person_type if (not request.user.has_perm('ishtar_common.view_organization', @@ -1293,72 +1201,10 @@ def autocomplete_organization(request, orga_type=None): for org in organizations]) return HttpResponse(data, mimetype='text/plain') -show_contextrecord = show_item(models.ContextRecord, 'contextrecord') -get_contextrecord = get_item(models.ContextRecord, - 'get_contextrecord', 'contextrecord', - extra_request_keys={'parcel__town':'parcel__town__pk', - 'operation__year':'operation__year__contains', - 'datings__period':'datings__period__pk'},) -get_contextrecordsource = get_item(models.ContextRecordSource, - 'get_contextrecordsource', 'contextrecordsource', - extra_request_keys={ - 'context_record__parcel__town':'context_record__parcel__town__pk', - 'context_record__operation__year':'context_record__operation__year', - 'context_record__datings__period':'context_record__datings__period__pk', - 'context_record__unit':'context_record__unit__pk', - }) -get_archaeologicalitem = get_item(models.Item, - 'get_archaeologicalitem', 'item', - bool_fields = ['base_items__is_isolated'], - base_request={'downstream_treatment__isnull':True}, - extra_request_keys={ -'base_items__context_record__parcel__town': - 'base_items__context_record__parcel__town', -'base_items__context_record__operation__year': - 'base_items__context_record__operation__year__contains', -'base_items__context_record__operation__code_patriarche': - 'base_items__context_record__operation__code_patriarche', -'dating__period':'dating__period__pk', -'base_items__item__description':'base_items__item__description__icontains', -'base_items__is_isolated':'base_items__is_isolated'}) -get_itemsource = get_item(models.ItemSource, - 'get_itemsource', 'itemsource', - extra_request_keys={ -'item__context_record__operation__year':'item__context_record__operation__year', -'item__dating__period':'item__dating__period__pk', -'item__description':'item__description__icontains', - }) -get_container = get_item(models.Container, - 'get_container', 'container', - extra_request_keys={ -'location':'location__pk', -'container_type':'container_type__pk', -'reference':'reference__icontains', - }) - -def autocomplete_warehouse(request): - if not request.user.has_perm('ishtar_common.view_warehouse', models.Warehouse)\ - and not request.user.has_perm('ishtar_common.view_own_warehouse', - models.Warehouse) : - return HttpResponse(mimetype='text/plain') - if not request.GET.get('term'): - return HttpResponse(mimetype='text/plain') - q = request.GET.get('term') - query = Q() - for q in q.split(' '): - extra = Q(name__icontains=q) | \ - Q(warehouse_type__label__icontains=q) - query = query & extra - limit = 15 - warehouses = models.Warehouse.objects.filter(query)[:limit] - data = json.dumps([{'id':warehouse.pk, 'value':unicode(warehouse)} - for warehouse in warehouses]) - return HttpResponse(data, mimetype='text/plain') - def autocomplete_author(request): if not request.user.has_perm('ishtar_common.view_author', models.Author)\ and not request.user.has_perm('ishtar_common.view_own_author', - models.Warehouse) : + models.Author) : return HttpResponse(mimetype='text/plain') if not request.GET.get('term'): return HttpResponse(mimetype='text/plain') @@ -1376,29 +1222,6 @@ def autocomplete_author(request): for author in authors]) return HttpResponse(data, mimetype='text/plain') -def autocomplete_container(request): - if not request.user.has_perm('ishtar_common.view_warehouse', - models.Warehouse)\ - and not request.user.has_perm('ishtar_common.view_own_warehouse', - models.Warehouse): - return HttpResponse(mimetype='text/plain') - if not request.GET.get('term'): - return HttpResponse(mimetype='text/plain') - q = request.GET.get('term') - query = Q() - for q in q.split(' '): - extra = Q(container_type__label__icontains=q) | \ - Q(container_type__reference__icontains=q) | \ - Q(reference__icontains=q) | \ - Q(location__name=q) | \ - Q(location__town=q) - query = query & extra - limit = 15 - containers = models.Container.objects.filter(query)[:limit] - data = json.dumps([{'id':container.pk, 'value':unicode(container)} - for container in containers]) - return HttpResponse(data, mimetype='text/plain') - def new_item(model): def func(request, parent_name): model_name = model._meta.object_name @@ -1426,11 +1249,9 @@ def new_item(model): context_instance=RequestContext(request)) return func -new_warehouse = new_item(models.Warehouse) new_person = new_item(models.Person) new_organization = new_item(models.Organization) new_author = new_item(models.Author) -new_container = new_item(models.Container) def action(request, action_slug, obj_id=None, *args, **kwargs): """ @@ -1464,19 +1285,3 @@ def dashboard_main(request, dct, obj_id=None, *args, **kwargs): 'ishtar_users':models.UserDashboard()} return render_to_response('dashboard_main.html', dct, context_instance=RequestContext(request)) - -def dashboard_file(request, dct, obj_id=None, *args, **kwargs): - """ - Main dashboard - """ - dct = {'dashboard': models.FileDashboard()} - return render_to_response('dashboard_file.html', dct, - context_instance=RequestContext(request)) - -def dashboard_operation(request, dct, obj_id=None, *args, **kwargs): - """ - Operation dashboard - """ - dct = {'dashboard': models.OperationDashboard()} - return render_to_response('dashboard_operation.html', dct, - context_instance=RequestContext(request)) |