diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-05-11 17:33:47 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-06-12 08:44:34 +0200 |
commit | cb2bdf1cf1ee85ddf68e93c29611024571961c5d (patch) | |
tree | 9730565001c023b38104b04fafad2ec1ff183373 | |
parent | 481279913a62416ce038b8eb82ad16b581fee7cf (diff) | |
download | Ishtar-cb2bdf1cf1ee85ddf68e93c29611024571961c5d.tar.bz2 Ishtar-cb2bdf1cf1ee85ddf68e93c29611024571961c5d.zip |
Adapt forms and wizards to manage M2M images (refs #4076)
-rw-r--r-- | archaeological_context_records/forms.py | 18 | ||||
-rw-r--r-- | archaeological_context_records/views.py | 20 | ||||
-rw-r--r-- | archaeological_finds/forms.py | 22 | ||||
-rw-r--r-- | archaeological_finds/forms_treatments.py | 17 | ||||
-rw-r--r-- | archaeological_finds/models.py | 7 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 17 | ||||
-rw-r--r-- | archaeological_finds/views.py | 20 | ||||
-rw-r--r-- | archaeological_operations/forms.py | 13 | ||||
-rw-r--r-- | archaeological_operations/views.py | 4 | ||||
-rw-r--r-- | archaeological_warehouse/forms.py | 11 | ||||
-rw-r--r-- | archaeological_warehouse/models.py | 12 | ||||
-rw-r--r-- | archaeological_warehouse/views.py | 2 |
12 files changed, 114 insertions, 49 deletions
diff --git a/archaeological_context_records/forms.py b/archaeological_context_records/forms.py index 481ec3353..fc865ba25 100644 --- a/archaeological_context_records/forms.py +++ b/archaeological_context_records/forms.py @@ -26,7 +26,6 @@ from django import forms from django.conf import settings from django.core import validators from django.forms.formsets import formset_factory -from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from ishtar_common.models import valid_id, IshtarSiteProfile @@ -38,10 +37,10 @@ from ishtar_common import widgets from bootstrap_datepicker.widgets import DatePicker from archaeological_operations.widgets import OAWidget from ishtar_common.forms import FinalForm, FormSet, \ - reverse_lazy, get_form_selection, TableSelect, ManageOldType, CustomForm,\ - FieldType, IshtarForm + reverse_lazy, get_form_selection, TableSelect, ManageOldType, CustomForm, \ + FieldType from ishtar_common.forms_common import get_town_field, SourceSelect, \ - get_image_help + BaseImageForm, BaseImageFormset from archaeological_operations.forms import OperationSelect, ParcelField,\ RecordRelationsForm as OpeRecordRelationsForm, RecordRelationsFormSetBase @@ -182,9 +181,6 @@ class RecordFormGeneral(CustomForm, ManageOldType): location = forms.CharField( label=_(u"Location"), widget=forms.Textarea, required=False, validators=[validators.MaxLengthValidator(200)]) - image = forms.ImageField( - label=_(u"Image"), help_text=mark_safe(get_image_help()), - max_length=255, required=False, widget=widgets.ImageFileInput()) TYPES = [ FieldType('unit', models.Unit), @@ -267,6 +263,14 @@ class RecordFormGeneral(CustomForm, ManageOldType): return cleaned_data +ImagesFormset = formset_factory(BaseImageForm, can_delete=True, + formset=BaseImageFormset) +ImagesFormset.file_upload = True +ImagesFormset.form_label = _(u"Images") +ImagesFormset.form_admin_name = _(u"Context record - 025 - Images") +ImagesFormset.form_slug = "contextrecord-025-images" + + class DatingForm(ManageOldType, forms.Form): form_label = _("Dating") base_model = 'dating' diff --git a/archaeological_context_records/views.py b/archaeological_context_records/views.py index 9c2f14406..d8c19a287 100644 --- a/archaeological_context_records/views.py +++ b/archaeological_context_records/views.py @@ -74,6 +74,7 @@ def autocomplete_contextrecord(request): for item in items]) return HttpResponse(data, content_type='text/plain') + get_contextrecord = get_item( models.ContextRecord, 'get_contextrecord', 'contextrecord') @@ -107,26 +108,35 @@ record_search_wizard = SearchWizard.as_view([ record_creation_steps = [ ('selec-record_creation', OperationRecordFormSelection), ('general-record_creation', RecordFormGeneral), + ('images-record_creation', ImagesFormset), ('datings-record_creation', DatingFormSet), ('interpretation-record_creation', RecordFormInterpretation), ('relations-record_creation', RecordRelationsFormSet), ('final-record_creation', FinalForm) ] -record_creation_wizard = RecordWizard.as_view(record_creation_steps, +record_creation_wizard = RecordWizard.as_view( + record_creation_steps, label=_(u"New context record"), - url_name='record_creation',) + url_name='record_creation', +) -record_modification_wizard = RecordModifWizard.as_view([ +record_modification_steps = [ ('selec-record_modification', RecordFormSelection), ('operation-record_modification', OperationFormSelection), ('general-record_modification', RecordFormGeneral), + ('images-record_modification', ImagesFormset), ('datings-record_modification', DatingFormSet), ('interpretation-record_modification', RecordFormInterpretation), ('relations-record_modification', RecordRelationsFormSet), - ('final-record_modification', FinalForm)], + ('final-record_modification', FinalForm) +] + +record_modification_wizard = RecordModifWizard.as_view( + record_modification_steps, label=_(u"Context record modification"), - url_name='record_modification',) + url_name='record_modification', +) def record_modify(request, pk): diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 5614118ec..44d883b0f 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -28,7 +28,6 @@ from django.conf import settings from django.core import validators from django.core.exceptions import PermissionDenied from django.forms.formsets import formset_factory -from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from ishtar_common.models import valid_id, valid_ids, get_current_profile, \ @@ -44,7 +43,7 @@ from ishtar_common.forms import FormSet, FloatField, \ ManageOldType, FieldType, IshtarForm, FormHeader from ishtar_common.forms_common import get_town_field, \ - get_image_help, SourceSelect, CustomForm + SourceSelect, CustomForm, BaseImageForm, BaseImageFormset from ishtar_common.utils import convert_coordinates_to_point from ishtar_common import widgets from bootstrap_datepicker.widgets import DatePicker @@ -64,7 +63,7 @@ from archaeological_finds.forms_treatments import TreatmentSelect, \ AdministrativeActTreatmentFileModifForm, SourceTreatmentFormSelection, \ SourceTreatmentFileFormSelection, TreatmentSourceFormSelection, \ TreatmentFileSourceFormSelection, DashboardForm as DashboardTreatmentForm, \ - DashboardTreatmentFileForm + DashboardTreatmentFileForm, TreatmentImagesFormset __all__ = [ 'TreatmentSelect', 'TreatmentFormSelection', 'BaseTreatmentForm', @@ -81,7 +80,7 @@ __all__ = [ 'TreatmentFileSourceFormSelection', 'DashboardTreatmentForm', 'DashboardTreatmentFileForm', 'RecordFormSelection', 'FindForm', 'DateForm', 'DatingFormSet', - 'PreservationForm', + 'PreservationForm', 'ImagesFormset', 'FindSelect', 'FindFormSelection', 'FindFormSelectionWarehouseModule', 'MultipleFindFormSelection', 'MultipleFindFormSelectionWarehouseModule', 'FindMultipleFormSelection', 'check_form', 'check_exist', 'check_not_exist', @@ -89,7 +88,9 @@ __all__ = [ 'check_treatment', 'ResultFindForm', 'ResultFindFormSet', 'FindDeletionForm', 'UpstreamFindFormSelection', 'SourceFindFormSelection', 'FindSourceSelect', 'FindSourceFormSelection', 'NewFindBasketForm', - 'SelectFindBasketForm', 'DeleteFindBasketForm', 'FindBasketAddItemForm'] + 'SelectFindBasketForm', 'DeleteFindBasketForm', 'FindBasketAddItemForm', + 'TreatmentImagesFormset' +] logger = logging.getLogger(__name__) @@ -194,9 +195,6 @@ class FindForm(CustomForm, ManageOldType): communicabilitie = widgets.Select2MultipleField( label=_(u"Communicability"), required=False ) - image = forms.ImageField( - label=_(u"Image"), help_text=mark_safe(get_image_help()), - max_length=255, required=False, widget=widgets.ImageFileInput()) comment = forms.CharField(label=_(u"Comment"), required=False, widget=forms.Textarea) dating_comment = forms.CharField( @@ -326,6 +324,14 @@ class FindForm(CustomForm, ManageOldType): return self.cleaned_data +ImagesFormset = formset_factory(BaseImageForm, can_delete=True, + formset=BaseImageFormset) +ImagesFormset.file_upload = True +ImagesFormset.form_label = _(u"Images") +ImagesFormset.form_admin_name = _(u"Find - 025 - Images") +ImagesFormset.form_slug = "find-025-images" + + class PreservationForm(CustomForm, ManageOldType): form_label = _("Preservation") form_admin_name = _(u"Find - 030 - Preservation") diff --git a/archaeological_finds/forms_treatments.py b/archaeological_finds/forms_treatments.py index e4fa2def7..b5daf146f 100644 --- a/archaeological_finds/forms_treatments.py +++ b/archaeological_finds/forms_treatments.py @@ -22,9 +22,8 @@ import datetime import logging from django import forms -from django.conf import settings from django.core import validators -from django.utils.safestring import mark_safe +from django.forms.formsets import formset_factory from django.utils.translation import ugettext_lazy as _ from ishtar_common.models import Person, valid_id, Organization, \ @@ -38,7 +37,8 @@ from archaeological_operations.forms import AdministrativeActOpeForm, \ from ishtar_common.forms import reverse_lazy, TableSelect, FinalForm, \ ManageOldType, get_form_selection, CustomForm, FieldType, IshtarForm -from ishtar_common.forms_common import SourceSelect, get_image_help +from ishtar_common.forms_common import SourceSelect, BaseImageForm, \ + BaseImageFormset from ishtar_common import widgets from bootstrap_datepicker.widgets import DatePicker @@ -152,9 +152,6 @@ class BaseTreatmentForm(CustomForm, ManageOldType): required=False) insurance_cost = forms.FloatField(label=_(u"Insurance cost ({currency})"), required=False) - image = forms.ImageField( - label=_(u"Image"), help_text=mark_safe(get_image_help()), - max_length=255, required=False, widget=widgets.ImageFileInput()) TYPES = [ FieldType('treatment_state', models.TreatmentState), @@ -261,6 +258,14 @@ class TreatmentModifyForm(BaseTreatmentForm): return cleaned_data +TreatmentImagesFormset = formset_factory(BaseImageForm, can_delete=True, + formset=BaseImageFormset) +TreatmentImagesFormset.file_upload = True +TreatmentImagesFormset.form_label = _(u"Images") +TreatmentImagesFormset.form_admin_name = _(u"Treatment - 025 - Images") +TreatmentImagesFormset.form_slug = "treatment-025-images" + + class TreatmentFormFileChoice(CustomForm, forms.Form): form_label = _(u"Associated request") form_admin_name = _(u"Treatment - 010 - Request choice") diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index 774b3c98b..7e53b514d 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -3,11 +3,12 @@ from archaeological_finds.models_finds import MaterialType, ConservatoryState,\ FindBasket, Find, FindSource, Property, CHECK_CHOICES, BatchType, \ BFBulkView, FBulkView, FirstBaseFindView, AlterationType, \ AlterationCauseType, TreatmentEmergencyType, TreatmentType, \ - CommunicabilityType, MaterialTypeQualityType, ObjectTypeQualityType + CommunicabilityType, MaterialTypeQualityType, ObjectTypeQualityType, \ + FindImage from archaeological_finds.models_treatments import Treatment, \ AbsFindTreatments, FindUpstreamTreatments, FindDownstreamTreatments, \ FindTreatments, TreatmentSource, TreatmentFile, TreatmentFileType, \ - TreatmentFileSource, TreatmentState + TreatmentFileSource, TreatmentState, TreatmentImage __all__ = ['MaterialType', 'ConservatoryState', 'IntegrityType', 'RemarkabilityType', 'ObjectType', @@ -19,4 +20,4 @@ __all__ = ['MaterialType', 'ConservatoryState', 'FindDownstreamTreatments', 'FindTreatments', 'TreatmentSource', 'TreatmentFile', 'TreatmentFileType', 'TreatmentFileSource', 'CommunicabilityType', 'MaterialTypeQualityType', - 'ObjectTypeQualityType'] + 'ObjectTypeQualityType', 'TreatmentImage', 'FindImage'] diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 2b903e66a..c9bbc0713 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -1079,17 +1079,22 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms, setattr(new, field.name, None) new.order = self.order + 1 new.history_order = user - new.image.name = self.image.name - # force_copy is necessary to not regenerate a thumb and resize - # again the image - new.save(force_copy=True) + new.save() # m2m fields m2m = [field.name for field in model._meta.many_to_many if field.name not in PRIVATE_FIELDS] for field in m2m: - for val in getattr(self, field).all(): - getattr(new, field).add(val) + if field == 'images': + for rel in FindImage.objects.filter(item__pk=self.pk).all(): + FindImage.objects.create( + item=new, + image=rel.image, + is_main=rel.is_main + ) + else: + for val in getattr(self, field).all(): + getattr(new, field).add(val) return new @classmethod diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index a2b497c9a..99b2968f3 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -106,6 +106,7 @@ def autocomplete_treatmentfile(request): for file in files]) return HttpResponse(data, content_type='text/plain') + show_findsource = show_item(models.FindSource, 'findsource') get_findsource = get_item(models.FindSource, 'get_findsource', 'findsource') @@ -133,6 +134,7 @@ def check_not_warehouse_module(self): find_creation_steps = [ ('selecrecord-find_creation', RecordFormSelectionTable), ('find-find_creation', FindForm), + ('images-find_creation', ImagesFormset), ('preservation-find_creation', PreservationForm), ('dating-find_creation', DatingFormSet), ('final-find_creation', FinalForm) @@ -167,17 +169,23 @@ find_modification_condition_dict = { 'preservation-find_modification': check_preservation_module, } -find_modification_wizard = FindModificationWizard.as_view([ +find_modification_steps = [ ('selec-find_modification', FindFormSelection), ('selecw-find_modification', FindFormSelectionWarehouseModule), ('selecrecord-find_modification', RecordFormSelection), ('find-find_modification', FindForm), + ('images-find_modification', ImagesFormset), ('preservation-find_modification', PreservationForm), ('dating-find_modification', DatingFormSet), - ('final-find_modification', FinalForm)], + ('final-find_modification', FinalForm) +] + +find_modification_wizard = FindModificationWizard.as_view( + find_modification_steps, condition_dict=find_modification_condition_dict, label=_(u"Find modification"), - url_name='find_modification',) + url_name='find_modification' +) def find_modify(request, pk): @@ -406,9 +414,12 @@ treatment_wizard_steps = [ ('basetreatment-treatment_creation', BaseTreatmentForm), ('selecfind-treatment_creation', UpstreamFindFormSelection), ('selecbasket-treatment_creation', SelectFindBasketForm), + ('images-treatment_creation', TreatmentImagesFormset), # ('resultfind-treatment_creation', ResultFindForm), # ('resultfinds-treatment_creation', ResultFindFormSet), - ('final-treatment_creation', FinalForm)] + ('final-treatment_creation', FinalForm) +] + treatment_search_wizard = SearchWizard.as_view([ ('general-treatment_search', TreatmentFormSelection)], @@ -440,6 +451,7 @@ treatment_modification_wizard = TreatmentModificationWizard.as_view( [('selec-treatment_modification', TreatmentFormSelection), ('file-treatment_modification', TreatmentFormFileChoice), ('basetreatment-treatment_modification', TreatmentModifyForm), + ('images-treatment_creation', TreatmentImagesFormset), ('final-treatment_modification', FinalForm)], label=_(u"Treatment modification"), url_name='treatment_modification', diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index b6304d14d..ea0db0908 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -52,7 +52,7 @@ from ishtar_common.forms import FinalForm, FormSet, get_now, \ reverse_lazy, get_form_selection, TableSelect, get_data_from_formset, \ ManageOldType, IshtarForm, CustomForm, FieldType, FormSetWithDeleteSwitches from ishtar_common.forms_common import TownFormSet, SourceForm, SourceSelect, \ - get_town_field, TownForm, get_image_help, BaseImageForm, BaseImageFormset + get_town_field, TownForm, BaseImageForm, BaseImageFormset from archaeological_operations.utils import parse_parcels @@ -871,9 +871,6 @@ class OperationFormGeneral(CustomForm, ManageOldType): required=False) virtual_operation = forms.BooleanField(required=False, label=_(u"Virtual operation")) - image = forms.ImageField( - label=_(u"Image"), help_text=mark_safe(get_image_help()), - max_length=255, required=False, widget=widgets.ImageFileInput()) FILE_FIELDS = [ 'report_delivery_date', @@ -1351,6 +1348,14 @@ SiteTownFormset.form_admin_name = _(u"Archaeological site - 020 - Towns") SiteTownFormset.form_slug = u"archaeological_site-020-towns" +SiteImagesFormset = formset_factory(BaseImageForm, can_delete=True, + formset=BaseImageFormset) +SiteImagesFormset.file_upload = True +SiteImagesFormset.form_label = _(u"Images") +SiteImagesFormset.form_admin_name = _(u"Archaeological site - 025 - Images") +SiteImagesFormset.form_slug = "archaeological_site-025-images" + + def check_underwater_module(self): return get_current_profile().underwater diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index 7a74ce58a..ea863bb36 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -45,7 +45,7 @@ from archaeological_operations.forms import ArchaeologicalSiteForm, \ AdministrativeActOpeModifForm, FinalAdministrativeActDeleteForm, \ AdministrativeActRegisterFormSelection, DocumentGenerationAdminActForm, \ SiteForm, SiteTownFormset, SiteUnderwaterForm, check_underwater_module, \ - CourtOrderedSeizureForm, ImagesFormset + CourtOrderedSeizureForm, ImagesFormset, SiteImagesFormset from ishtar_common.views import get_item, show_item, revert_item, new_item @@ -373,6 +373,7 @@ site_search_wizard = SiteSearch.as_view( site_creation_steps = [ ('general-site_creation', SiteForm), ('towns-site_creation', SiteTownFormset), + ('images-site_creation', SiteImagesFormset), ('underwater-site_creation', SiteUnderwaterForm), ('final-site_creation', FinalForm) ] @@ -387,6 +388,7 @@ site_modification_steps = [ ('selec-site_modification', SiteFormSelection), ('general-site_modification', SiteForm), ('towns-site_modification', SiteTownFormset), + ('images-site_modification', SiteImagesFormset), ('underwater-site_modification', SiteUnderwaterForm), ('final-site_modification', FinalForm) ] diff --git a/archaeological_warehouse/forms.py b/archaeological_warehouse/forms.py index e13255efc..27f03e752 100644 --- a/archaeological_warehouse/forms.py +++ b/archaeological_warehouse/forms.py @@ -33,7 +33,8 @@ from bootstrap_datepicker.widgets import DatePicker from ishtar_common.forms import name_validator, reverse_lazy, \ get_form_selection, TableSelect, ManageOldType, FinalForm, FormSet, \ CustomForm, FieldType -from ishtar_common.forms_common import get_image_help +from ishtar_common.forms_common import get_image_help, BaseImageFormset, \ + BaseImageForm from archaeological_finds.forms import FindMultipleFormSelection, \ SelectFindBasketForm @@ -160,6 +161,14 @@ class WarehouseForm(CustomForm, ManageOldType, forms.Form): return new_item +ImagesFormset = formset_factory(BaseImageForm, can_delete=True, + formset=BaseImageFormset) +ImagesFormset.file_upload = True +ImagesFormset.form_label = _(u"Images") +ImagesFormset.form_admin_name = _(u"Warehouse - 025 - Images") +ImagesFormset.form_slug = "warehouse-020-images" + + class WarehouseDeletionForm(FinalForm): confirm_msg = _(u"Would you like to delete this warehouse?") confirm_end_msg = _(u"Would you like to delete this warehouse?") diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 4edfe0d15..40de49d60 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -46,7 +46,12 @@ post_delete.connect(post_save_cache, sender=WarehouseType) class Warehouse(Address, DashboardFormItem, OwnPerms): + SLUG = 'warehouse' SHOW_URL = 'show-warehouse' + TABLE_COLS = ['name', 'warehouse_type'] + BASE_SEARCH_VECTORS = ['name', 'warehouse_type__label', "external_id", + "town", "comment"] + name = models.CharField(_(u"Name"), max_length=200) warehouse_type = models.ForeignKey(WarehouseType, verbose_name=_(u"Warehouse type")) @@ -64,10 +69,6 @@ class Warehouse(Address, DashboardFormItem, OwnPerms): auto_external_id = models.BooleanField( _(u"External ID is set automatically"), default=False) - TABLE_COLS = ['name', 'warehouse_type'] - BASE_SEARCH_VECTORS = ['name', 'warehouse_type__label', "external_id", - "town", "comment"] - class Meta: verbose_name = _(u"Warehouse") verbose_name_plural = _(u"Warehouses") @@ -82,6 +83,9 @@ class Warehouse(Address, DashboardFormItem, OwnPerms): def __unicode__(self): return u"%s (%s)" % (self.name, unicode(self.warehouse_type)) + def _get_base_image_path(self): + return u"{}/{}".format(self.SLUG, slugify(self.name)) + @property def associated_filename(self): return datetime.date.today().strftime('%Y-%m-%d') + '-' + \ diff --git a/archaeological_warehouse/views.py b/archaeological_warehouse/views.py index f33991d8b..913fbd3be 100644 --- a/archaeological_warehouse/views.py +++ b/archaeological_warehouse/views.py @@ -103,6 +103,7 @@ warehouse_search_wizard = SearchWizard.as_view([ warehouse_creation_steps = [ ("warehouse-warehouse_creation", WarehouseForm), + ('images-warehouse_creation', ImagesFormset), ('divisions-warehouse_creation', SelectedDivisionFormset), ('final-warehouse_creation', FinalForm)] @@ -116,6 +117,7 @@ warehouse_creation_wizard = WarehouseWizard.as_view( warehouse_modification_wizard = WarehouseModificationWizard.as_view([ ('selec-warehouse_modification', WarehouseFormSelection), ("warehouse-warehouse_modification", WarehouseForm), + ('images-warehouse_modifcation', ImagesFormset), ('divisions-warehouse_modification', SelectedDivisionFormset), ('final-warehouse_modification', FinalForm)], label=_(u"Warehouse modification"), |