summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2011-03-21 01:23:11 +0100
committerÉtienne Loks <etienne.loks@peacefrogs.net>2011-03-21 01:23:11 +0100
commit0fc73f65d80050ff3c06a99869e342f62f90c313 (patch)
treef12fbadffc066239c1dcdec466bae9ccddc3c367
parent9cb3f5c9eff4dc300795ad546a6540ed8328c2d2 (diff)
downloadIshtar-0fc73f65d80050ff3c06a99869e342f62f90c313.tar.bz2
Ishtar-0fc73f65d80050ff3c06a99869e342f62f90c313.zip
Create and modify items (refs #290)
-rw-r--r--ishtar/furnitures/forms.py160
-rw-r--r--ishtar/furnitures/menus.py39
-rw-r--r--ishtar/furnitures/models.py23
-rw-r--r--ishtar/furnitures/urls.py6
-rw-r--r--ishtar/furnitures/views.py2
-rw-r--r--ishtar/locale/fr/LC_MESSAGES/django.po13
6 files changed, 203 insertions, 40 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py
index c79d70346..0cd704f53 100644
--- a/ishtar/furnitures/forms.py
+++ b/ishtar/furnitures/forms.py
@@ -260,14 +260,57 @@ class Wizard(NamedUrlSessionFormWizard):
def save_model(self, dct, m2m, request, storage, form_list, return_object):
dct = self.get_extra_model(dct, request, storage, form_list)
obj = self.get_current_saved_object(request, storage)
+
+ # manage dependant items
+ other_objs = {}
+ for k in dct.keys():
+ if '__' not in k:
+ continue
+ vals = k.split('__')
+ assert len(vals) == 2, "Only one level of dependant item is managed"
+ dependant_item, key = vals
+ if dependant_item not in other_objs:
+ other_objs[dependant_item] = {}
+ other_objs[dependant_item][key] = dct.pop(k)
if obj:
for k in dct:
if k.startswith('pk'):
continue
setattr(obj, k, dct[k])
+ for dependant_item in other_objs:
+ c_item = getattr(obj, dependant_item)
+ if c_item:
+ # to check #
+ for k in other_objs[dependant_item]:
+ setattr(c_item, k, other_objs[dependant_item][k])
+ c_item.save()
+ else:
+ m = getattr(self.model, dependant_item)
+ if hasattr(m, 'related'):
+ c_item = m.related.model(**other_objs[dependant_item])
+ setattr(obj, dependant_item, c_item)
+ obj.save()
+ obj.save()
else:
+ adds = {}
+ for dependant_item in other_objs:
+ m = getattr(self.model, dependant_item)
+ model = m.field.rel.to
+ c_dct = other_objs[dependant_item].copy()
+ if hasattr(model, 'history'):
+ c_dct['history_modifier'] = request.user
+ c_item = model(**c_dct)
+ c_item.save()
+ if hasattr(m, 'through'):
+ adds[dependant_item] = c_item
+ elif hasattr(m, 'field'):
+ dct[dependant_item] = c_item
+ if 'pk' in dct:
+ dct.pop('pk')
obj = self.get_saved_model()(**dct)
- obj.save()
+ obj.save()
+ for k in adds:
+ getattr(obj, k).add(adds[k])
m2m_items = {}
for key, value in m2m:
if key not in m2m_items:
@@ -412,7 +455,7 @@ class Wizard(NamedUrlSessionFormWizard):
idx = int(self.session_get_value(request, storage, main_form_key,
'pk'))
current_obj = self.model.objects.get(pk=idx)
- except(TypeError, ObjectDoesNotExist):
+ except(TypeError, ValueError, ObjectDoesNotExist):
pass
return current_obj
@@ -456,15 +499,23 @@ class Wizard(NamedUrlSessionFormWizard):
request.session[obj.__class__.__name__.lower()] = unicode(obj.pk)
initial = {}
if hasattr(c_form, 'base_fields'):
- for field in c_form.base_fields.keys():
- if hasattr(obj, field):
- value = getattr(obj, field)
- if hasattr(value, 'pk'):
- value = value.pk
- if value in (True, False):
- initial[field] = value
- elif value != None:
- initial[field] = unicode(value)
+ for base_field in c_form.base_fields.keys():
+ fields = base_field.split('__')
+ value = obj
+ for field in fields:
+ if not hasattr(value, field) or \
+ getattr(value, field) == None:
+ value = obj
+ break
+ value = getattr(value, field)
+ if value == obj:
+ continue
+ if hasattr(value, 'pk'):
+ value = value.pk
+ if value in (True, False):
+ initial[base_field] = value
+ elif value != None:
+ initial[base_field] = unicode(value)
elif hasattr(c_form, 'management_form'):
initial = []
key = current_step.split('-')[0]
@@ -1768,7 +1819,7 @@ class RecordFormGeneral(forms.Form):
)
class DatingForm(forms.Form):
- form_label = _("Datings")
+ form_label = _("Dating")
base_model = 'dating'
associated_models = {'dating_type':models.DatingType,
'quality':models.DatingQuality,
@@ -1849,3 +1900,88 @@ record_deletion_wizard = RecordDeletionWizard([
('final-record_deletion', RecordDeletionForm)],
url_name='record_deletion',)
+class ItemWizard(Wizard):
+ model = models.Item
+
+ 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 ItemFormBase(forms.Form):
+ form_label = _("Base item")
+ base_model = 'base_items'
+ base_items__label = forms.CharField(label=_(u"General label"),
+ validators=[validators.MaxLengthValidator(60)])
+ base_items__description = forms.CharField(label=_("General description"),
+ widget=forms.Textarea)
+ base_items__is_isolated = forms.NullBooleanField(label=_(u"Is isolated?"),
+ required=False)
+
+class ItemForm(forms.Form):
+ form_label = _("Item")
+ associated_models = {'material_type':models.MaterialType,}
+ label = forms.CharField(label=_(u"Label"),
+ validators=[validators.MaxLengthValidator(60)])
+ description = forms.CharField(label=_("Precise description"),
+ widget=forms.Textarea)
+ material_type = forms.ChoiceField(label=_("Material type"),
+ choices=models.MaterialType.get_types())
+ volume = forms.IntegerField(label=_(u"Volume"))
+ weight = forms.IntegerField(label=_(u"Weight"))
+ item_number = forms.IntegerField(label=_(u"Item number"))
+
+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"))
+ dating__end_date = forms.IntegerField(label=_(u"End date"))
+ dating__dating_type = forms.ChoiceField(label=_("Dating type"),
+ choices=models.DatingType.get_types())
+ dating__quality = forms.ChoiceField(label=_("Quality"),
+ choices=models.DatingQuality.get_types())
+
+item_creation_wizard = ItemWizard([
+ ('selecrecord-item_creation', RecordFormSelection),
+ ('base_item-record_creation', ItemFormBase),
+ ('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 = forms.IntegerField(
+ widget=widgets.JQueryAutoComplete("/" + settings.URL_PATH + \
+ 'autocomplete-town', associated_model=models.Town),
+ validators=[models.valid_id(models.Town)], label=_(u"Town"))
+ base_items__context_record__parcel__year = forms.IntegerField(
+ label=_("Year"))
+ material_type = forms.ChoiceField(
+ label=_("Material type"), choices=models.MaterialType.get_types())
+ dating__period = forms.ChoiceField(
+ label=_("Period"), choices=models.Period.get_types())
+
+class ItemFormSelection(forms.Form):
+ form_label = _("Item")
+ 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),
+ validators=[models.valid_id(models.Item)])
+
+item_modification_wizard = ItemWizard([
+ ('selec-item_modification', ItemFormSelection),
+ ('item-item_modification', ItemForm),
+ ('dating-item_modification', DateForm),
+ ('final-item_modification', FinalForm)],
+ url_name='item_modification',)
+
diff --git a/ishtar/furnitures/menus.py b/ishtar/furnitures/menus.py
index 5f77f2507..5b47b6327 100644
--- a/ishtar/furnitures/menus.py
+++ b/ishtar/furnitures/menus.py
@@ -169,20 +169,31 @@ class Menu:
],),
]),
SectionItem('record_management', _(u"Context record management"),
- childs=[
- 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']),
- ])
+ childs=[
+ 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 management"),
+ childs=[
+ 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']),
+ ]),
]
self.items = {}
diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py
index 2aa78cf23..6afdee470 100644
--- a/ishtar/furnitures/models.py
+++ b/ishtar/furnitures/models.py
@@ -135,8 +135,10 @@ class GeneralType(models.Model):
def _get_childs(cls, item, dct, prefix=""):
prefix += "&rsaquo; "
dct['parent'] = item
- childs = cls.objects.filter(**dct).order_by('order').all()
- for child in childs:
+ childs = cls.objects.filter(**dct)
+ if hasattr(cls, 'order'):
+ childs = childs.order_by('order')
+ for child in childs.all():
yield (child.pk, SafeUnicode(prefix + \
unicode(_(unicode(child))) ))
for sub_child in cls._get_childs(child, dct, prefix):
@@ -147,8 +149,10 @@ class GeneralType(models.Model):
dct['available'] = True
yield ('', '--')
dct['parent'] = None
- items = cls.objects.filter(**dct).order_by('order').all()
- for item in items:
+ items = cls.objects.filter(**dct)
+ if hasattr(cls, 'order'):
+ items = items.order_by('order')
+ for item in items.all():
yield (item.pk, unicode(item))
for child in cls._get_childs(item, dct):
yield child
@@ -641,7 +645,8 @@ class BaseItem(BaseHistorizedItem, OwnPerms):
description = models.TextField(_(u"Description"))
context_record = models.ForeignKey(ContextRecord,
verbose_name=_(u"Context Record"))
- is_isolated = models.BooleanField(_(u"Is isolated?"))
+ is_isolated = models.NullBooleanField(_(u"Is isolated?"), blank=True,
+ null=True)
documentations = models.ManyToManyField(Source)
history = HistoricalRecords()
@@ -659,7 +664,9 @@ class BaseItem(BaseHistorizedItem, OwnPerms):
return self.label
class Item(BaseHistorizedItem, OwnPerms):
- base_items = models.ManyToManyField(BaseItem, verbose_name=_(u"Base item"))
+ TABLE_COLS = ['label', 'dating.period', 'material_type',]
+ base_items = models.ManyToManyField(BaseItem, verbose_name=_(u"Base item"),
+ related_name='item')
order = models.IntegerField(_(u"Order"))
label = models.CharField(_(u"Label"), max_length=60)
description = models.TextField(_(u"Description"))
@@ -668,9 +675,9 @@ class Item(BaseHistorizedItem, OwnPerms):
volume = models.FloatField(_(u"Volume"))
weight = models.IntegerField(_(u"Weight"))
item_number = models.IntegerField(_("Item number"))
- upstream_treatment = models.ForeignKey("Treatment",
+ upstream_treatment = models.ForeignKey("Treatment", blank=True, null=True,
related_name='downstream_treatment', verbose_name=_("Upstream treatment"))
- downstream_treatment = models.ForeignKey("Treatment",
+ downstream_treatment = models.ForeignKey("Treatment", blank=True, null=True,
related_name='upstream_treatment', verbose_name=_("Downstream treatment"))
dating = models.ForeignKey(Dating, verbose_name=_(u"Dating"))
history = HistoricalRecords()
diff --git a/ishtar/furnitures/urls.py b/ishtar/furnitures/urls.py
index 5a72a1182..5e28d6fed 100644
--- a/ishtar/furnitures/urls.py
+++ b/ishtar/furnitures/urls.py
@@ -69,6 +69,10 @@ urlpatterns = patterns('',
ishtar_forms.record_modification_wizard, name='record_modification'),
url(BASE_URL + r'record_deletion/(?P<step>.+)$',
ishtar_forms.record_deletion_wizard, name='record_deletion'),
+ url(BASE_URL + r'item_creation/(?P<step>.+)$',
+ ishtar_forms.item_creation_wizard, name='item_creation'),
+ url(BASE_URL + r'item_modification/(?P<step>.+)$',
+ ishtar_forms.item_modification_wizard, name='item_modification'),
)
for section in menu.childs:
for menu_item in section.childs:
@@ -111,4 +115,6 @@ urlpatterns += patterns('ishtar.furnitures.views',
'get_administrativeact', name='get-administrativeact'),
url(BASE_URL + r'get-contextrecord/(?P<type>.+)?$', 'get_contextrecord',
name='get-contextrecord'),
+ url(BASE_URL + r'get-item/(?P<type>.+)?$', 'get_archaeologicalitem',
+ name='get-item'),
)
diff --git a/ishtar/furnitures/views.py b/ishtar/furnitures/views.py
index 43d5a46e2..39c6bb66c 100644
--- a/ishtar/furnitures/views.py
+++ b/ishtar/furnitures/views.py
@@ -381,6 +381,8 @@ get_contextrecord = get_item(models.ContextRecord,
'get_contextrecord', 'contextrecord',
extra_request_keys={'parcel__town':'parcel__town__pk',
})
+get_archaeologicalitem = get_item(models.Item,
+ 'get_archaeologicalitem', 'item',)
def action(request, action_slug, obj_id=None, *args, **kwargs):
"""
diff --git a/ishtar/locale/fr/LC_MESSAGES/django.po b/ishtar/locale/fr/LC_MESSAGES/django.po
index d4063a30a..22faada97 100644
--- a/ishtar/locale/fr/LC_MESSAGES/django.po
+++ b/ishtar/locale/fr/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-19 00:12+0100\n"
+"POT-Creation-Date: 2011-03-19 00:30+0100\n"
"PO-Revision-Date: 2010-12-09\n"
"Last-Translator: Étienne Loks <etienne.loks at peacefrogs net>\n"
"Language-Team: \n"
@@ -884,8 +884,9 @@ msgstr "Une courte description de la situation de l'Unité d'Enregistrement"
msgid ""
"\"Terminus Ante Quem\" the context record can't have been created after this "
"date"
-msgstr "« Terminus Ante Quem » l'Unité d'Enregistrement ne peut avoir été crée "
-"après cette date"
+msgstr ""
+"« Terminus Ante Quem » l'Unité d'Enregistrement ne peut avoir été crée après "
+"cette date"
#: furnitures/models.py:597
msgid "Estimation of a \"Terminus Ante Quem\""
@@ -895,8 +896,9 @@ msgstr "Estimation d'un « Terminus Ante Quem »"
msgid ""
"\"Terminus Post Quem\" the context record can't have been created before "
"this date"
-msgstr "« Terminus Post Quem » l'Unité d'Enregistrement ne peut avoir été crée "
-"avant cette date"
+msgstr ""
+"« Terminus Post Quem » l'Unité d'Enregistrement ne peut avoir été crée avant "
+"cette date"
#: furnitures/models.py:602
msgid "Estimation of a \"Terminus Post Quem\""
@@ -1643,4 +1645,3 @@ msgid "You are now registered. Activation email sent."
msgstr ""
"Vous être maintenant enregistré. Un courriel d'activation de votre compte "
"vous a été envoyé."
-