summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit7c9a9d586e5255b60179807934e780b3d38cd30e (patch)
tree9730565001c023b38104b04fafad2ec1ff183373
parent11e557cc8a28628ae777415fa5c04196c555e749 (diff)
downloadIshtar-7c9a9d586e5255b60179807934e780b3d38cd30e.tar.bz2
Ishtar-7c9a9d586e5255b60179807934e780b3d38cd30e.zip
Adapt forms and wizards to manage M2M images (refs #4076)
-rw-r--r--archaeological_context_records/forms.py18
-rw-r--r--archaeological_context_records/views.py20
-rw-r--r--archaeological_finds/forms.py22
-rw-r--r--archaeological_finds/forms_treatments.py17
-rw-r--r--archaeological_finds/models.py7
-rw-r--r--archaeological_finds/models_finds.py17
-rw-r--r--archaeological_finds/views.py20
-rw-r--r--archaeological_operations/forms.py13
-rw-r--r--archaeological_operations/views.py4
-rw-r--r--archaeological_warehouse/forms.py11
-rw-r--r--archaeological_warehouse/models.py12
-rw-r--r--archaeological_warehouse/views.py2
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"),