summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2016-06-03 00:42:55 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2016-06-03 00:42:55 +0200
commitcd874041d1761f24b984be0d1a524afd5bd4b116 (patch)
treee6547966d9f7c649e1403a546eeabcc9563d46a6
parent3d24c80255484ea205caff491daf2a1164df70d2 (diff)
downloadIshtar-cd874041d1761f24b984be0d1a524afd5bd4b116.tar.bz2
Ishtar-cd874041d1761f24b984be0d1a524afd5bd4b116.zip
Warehouse: work on packaging
-rw-r--r--archaeological_finds/forms.py6
-rw-r--r--archaeological_finds/models.py22
-rw-r--r--archaeological_warehouse/forms.py12
-rw-r--r--archaeological_warehouse/views.py2
-rw-r--r--archaeological_warehouse/wizards.py17
-rw-r--r--ishtar_common/models.py2
-rw-r--r--ishtar_common/views.py3
7 files changed, 42 insertions, 22 deletions
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py
index 99907781b..f5387febe 100644
--- a/archaeological_finds/forms.py
+++ b/archaeological_finds/forms.py
@@ -432,8 +432,12 @@ class SelectFindBasketForm(forms.Form):
basket = forms.ChoiceField(label=_(u"Basket"), required=True, choices=[])
def __init__(self, *args, **kwargs):
- self.user = kwargs.pop('user')
+ self.user = None
+ if 'user' in kwargs:
+ self.user = kwargs.pop('user')
super(SelectFindBasketForm, self).__init__(*args, **kwargs)
+ if not self.user:
+ return
self.fields['basket'].choices = [('', '--')] + [
(b.pk, unicode(b))
for b in models.FindBasket.objects.filter(user=self.user)]
diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py
index 417dd3929..c8b392310 100644
--- a/archaeological_finds/models.py
+++ b/archaeological_finds/models.py
@@ -32,6 +32,7 @@ from ishtar_common.models import GeneralType, ImageModel, BaseHistorizedItem, \
from archaeological_operations.models import AdministrativeAct
from archaeological_context_records.models import ContextRecord, Dating
+from ishtar_common.models import PRIVATE_FIELDS
from archaeological_warehouse.models import Warehouse, Container
@@ -478,19 +479,24 @@ class Find(BaseHistorizedItem, ImageModel, OwnPerms, ShortMenuItem):
return q.filter(downstream_treatment__isnull=True).count()
def duplicate(self, user):
- # TODO
- raise
+ model = self.__class__
+ # base fields
+ table_cols = [field.name for field in model._meta.fields
+ if field.name not in PRIVATE_FIELDS or
+ field.name == 'order']
dct = dict([(attr, getattr(self, attr)) for attr in
- ('order', 'label', 'description',
- 'volume', 'weight', 'find_number', 'dating',
- 'conservatory_state', 'preservation_to_consider',
- 'weight_unit', )])
+ table_cols])
dct['order'] += 1
dct['history_modifier'] = user
new = self.__class__(**dct)
new.save()
- for base_find in self.base_finds.all():
- new.base_finds.add(base_find)
+
+ # 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)
return new
@classmethod
diff --git a/archaeological_warehouse/forms.py b/archaeological_warehouse/forms.py
index fb36d6c18..080467e55 100644
--- a/archaeological_warehouse/forms.py
+++ b/archaeological_warehouse/forms.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2010-2013 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2010-2016 É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
@@ -22,12 +22,13 @@ from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from ishtar_common.models import Person, valid_id
-from archaeological_finds.models import TreatmentType
+from archaeological_finds.models import TreatmentType, FindBasket
import models
from ishtar_common import widgets
from ishtar_common.forms import name_validator, reverse_lazy, \
get_form_selection, TableSelect
-from archaeological_finds.forms import FindMultipleFormSelection
+from archaeological_finds.forms import FindMultipleFormSelection, \
+ SelectFindBasketForm
def get_warehouse_field(label=_(u"Warehouse"), required=True):
@@ -137,11 +138,12 @@ ContainerFormSelection = get_form_selection(
new_message=_(u"Add a new container"))
-class BasePackagingForm(forms.Form):
+class BasePackagingForm(SelectFindBasketForm):
form_label = _(u"Packaging")
associated_models = {'treatment_type': TreatmentType,
'person': Person,
- 'location': models.Warehouse}
+ 'location': models.Warehouse,
+ 'basket': FindBasket}
treatment_type = forms.IntegerField(label="", widget=forms.HiddenInput)
person = forms.IntegerField(
label=_(u"Packager"),
diff --git a/archaeological_warehouse/views.py b/archaeological_warehouse/views.py
index aab18ed40..be5e6150c 100644
--- a/archaeological_warehouse/views.py
+++ b/archaeological_warehouse/views.py
@@ -89,7 +89,7 @@ def autocomplete_container(request):
warehouse_packaging_wizard = PackagingWizard.as_view([
('seleccontainer-packaging', ContainerFormSelection),
('base-packaging', BasePackagingForm),
- ('multiselecitems-packaging', FindPackagingFormSelection),
+ # ('multiselecitems-packaging', FindPackagingFormSelection),
('final-packaging', FinalForm)],
label=_(u"Packaging"),
url_name='warehouse_packaging',)
diff --git a/archaeological_warehouse/wizards.py b/archaeological_warehouse/wizards.py
index 833c1c697..5f2b4346d 100644
--- a/archaeological_warehouse/wizards.py
+++ b/archaeological_warehouse/wizards.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2012-2016 É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
@@ -25,17 +25,24 @@ from archaeological_finds.models import Treatment
class PackagingWizard(TreatmentWizard):
+
+ def get_form_kwargs(self, step):
+ kwargs = super(PackagingWizard, self).get_form_kwargs(step)
+ if 'base-packaging' not in step:
+ return kwargs
+ kwargs['user'] = self.request.user
+ return kwargs
+
+
def save_model(self, dct, m2m, whole_associated_models, form_list,
return_object):
dct = self.get_extra_model(dct, form_list)
obj = self.get_current_saved_object()
dct['location'] = dct['container'].location
- items = dct.pop('finds')
+ basket = dct.pop('basket')
treatment = Treatment(**dct)
treatment.save()
- if not hasattr(items, '__iter__'):
- items = [items]
- for item in items:
+ for item in basket.items.all():
new = item.duplicate(self.request.user)
item.downstream_treatment = treatment
item.save()
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index f3974d04d..dcf141dde 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -581,6 +581,8 @@ class HistoryError(Exception):
def __str__(self):
return repr(self.value)
+PRIVATE_FIELDS = ('id', 'history_modifier', 'order')
+
class BaseHistorizedItem(Imported):
IS_BASKET = False
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index 59cfe6321..2df1f4b44 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -61,7 +61,7 @@ from archaeological_files.forms import DashboardForm as DashboardFormFile
from ishtar_common.forms import FinalForm, FinalDeleteForm
from ishtar_common import forms_common as forms
from ishtar_common import wizards
-from ishtar_common.models import HistoryError
+from ishtar_common.models import HistoryError, PRIVATE_FIELDS
import models
@@ -325,7 +325,6 @@ def format_val(val):
HIERARCHIC_LEVELS = 5
HIERARCHIC_FIELDS = ['periods', 'period', 'unit', 'material_types',
'material_type', 'conservatory_state']
-PRIVATE_FIELDS = ('id', 'history_modifier', 'order')
def get_item(model, func_name, default_name, extra_request_keys=[],