summaryrefslogtreecommitdiff
path: root/archaeological_warehouse
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_warehouse')
-rw-r--r--archaeological_warehouse/admin.py4
-rw-r--r--archaeological_warehouse/forms.py88
-rw-r--r--archaeological_warehouse/ishtar_menu.py14
-rw-r--r--archaeological_warehouse/locale/django.pot62
-rw-r--r--archaeological_warehouse/models.py17
-rw-r--r--archaeological_warehouse/urls.py4
-rw-r--r--archaeological_warehouse/views.py38
-rw-r--r--archaeological_warehouse/wizards.py20
8 files changed, 131 insertions, 116 deletions
diff --git a/archaeological_warehouse/admin.py b/archaeological_warehouse/admin.py
index b76c48308..cf71dbab6 100644
--- a/archaeological_warehouse/admin.py
+++ b/archaeological_warehouse/admin.py
@@ -17,13 +17,13 @@
# See the file COPYING for details.
-from django.conf import settings
from django.contrib import admin
from ishtar_common.admin import HistorizedObjectAdmin, GeneralTypeAdmin
import models
+
class WarehouseAdmin(HistorizedObjectAdmin):
list_display = ('name', 'warehouse_type', 'town')
list_filter = ('warehouse_type',)
@@ -32,6 +32,7 @@ class WarehouseAdmin(HistorizedObjectAdmin):
admin.site.register(models.Warehouse, WarehouseAdmin)
+
class ContainerTypeAdmin(admin.ModelAdmin):
list_display = ('label', 'reference', 'length', 'width', 'height',
'volume')
@@ -39,6 +40,7 @@ class ContainerTypeAdmin(admin.ModelAdmin):
admin.site.register(models.ContainerType, ContainerTypeAdmin)
+
class ContainerAdmin(admin.ModelAdmin):
list_display = ('reference', 'location', 'container_type',)
list_filter = ("container_type",)
diff --git a/archaeological_warehouse/forms.py b/archaeological_warehouse/forms.py
index ff869c5fb..d56df8139 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
@@ -17,19 +17,19 @@
# See the file COPYING for details.
-import datetime
-
from django import forms
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):
# !FIXME hard_link, reverse_lazy doen't seem to work with formsets
@@ -38,16 +38,19 @@ def get_warehouse_field(label=_(u"Warehouse"), required=True):
return forms.IntegerField(widget=widget, label=label, required=required,
validators=[valid_id(models.Warehouse)])
+
class WarehouseForm(forms.Form):
name = forms.CharField(label=_(u"Name"), max_length=40,
- validators=[name_validator])
+ validators=[name_validator])
warehouse_type = forms.ChoiceField(label=_(u"Warehouse type"),
choices=[])
- person_in_charge = forms.IntegerField(label=_(u"Person in charge"),
- widget=widgets.JQueryAutoComplete(
- reverse_lazy('autocomplete-person'), associated_model=models.Person),
- validators=[valid_id(models.Person)],
- required=False)
+ person_in_charge = forms.IntegerField(
+ label=_(u"Person in charge"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-person'),
+ associated_model=models.Person),
+ validators=[valid_id(models.Person)],
+ required=False)
comment = forms.CharField(label=_(u"Comment"), widget=forms.Textarea,
required=False)
address = forms.CharField(label=_(u"Address"), widget=forms.Textarea,
@@ -64,52 +67,60 @@ class WarehouseForm(forms.Form):
required=False)
def __init__(self, *args, **kwargs):
+ if 'limits' in kwargs:
+ kwargs.pop('limits')
super(WarehouseForm, self).__init__(*args, **kwargs)
self.fields['warehouse_type'].choices = \
- models.WarehouseType.get_types()
+ models.WarehouseType.get_types()
self.fields['warehouse_type'].help_text = \
- models.WarehouseType.get_help()
+ models.WarehouseType.get_help()
def save(self, user):
dct = self.cleaned_data
dct['history_modifier'] = user
dct['warehouse_type'] = models.WarehouseType.objects.get(
- pk=dct['warehouse_type'])
+ pk=dct['warehouse_type'])
if 'person_in_charge' in dct and dct['person_in_charge']:
dct['person_in_charge'] = models.Person.objects.get(
- pk=dct['person_in_charge'])
+ pk=dct['person_in_charge'])
new_item = models.Warehouse(**dct)
new_item.save()
return new_item
+
class ContainerForm(forms.Form):
form_label = _(u"Container")
reference = forms.CharField(label=_(u"Ref."))
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=[valid_id(models.Warehouse)])
+ location = forms.IntegerField(
+ label=_(u"Warehouse"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-warehouse'),
+ associated_model=models.Warehouse, new=True),
+ validators=[valid_id(models.Warehouse)])
comment = forms.CharField(label=_(u"Comment"),
widget=forms.Textarea, required=False)
def __init__(self, *args, **kwargs):
+ if 'limits' in kwargs:
+ kwargs.pop('limits')
super(ContainerForm, self).__init__(*args, **kwargs)
- self.fields['container_type'].choices = models.ContainerType.get_types()
+ self.fields['container_type'].choices = \
+ models.ContainerType.get_types()
self.fields['container_type'].help_text = \
- models.ContainerType.get_help()
+ 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'])
+ pk=dct['container_type'])
dct['location'] = models.Warehouse.objects.get(pk=dct['location'])
new_item = models.Container(**dct)
new_item.save()
return new_item
+
class ContainerSelect(TableSelect):
location = get_warehouse_field()
container_type = forms.ChoiceField(label=_(u"Container type"), choices=[])
@@ -118,9 +129,9 @@ class ContainerSelect(TableSelect):
def __init__(self, *args, **kwargs):
super(ContainerSelect, self).__init__(*args, **kwargs)
self.fields['container_type'].choices = \
- models.ContainerType.get_types()
+ models.ContainerType.get_types()
self.fields['container_type'].help_text = \
- models.ContainerType.get_help()
+ models.ContainerType.get_help()
ContainerFormSelection = get_form_selection(
'ContainerFormSelection', _(u"Container search"), 'container',
@@ -128,23 +139,28 @@ ContainerFormSelection = get_form_selection(
_(u"You should select a container."), new=True,
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}
+ associated_models = {'treatment_type': TreatmentType,
+ 'person': Person,
+ 'location': models.Warehouse,
+ 'basket': FindBasket}
treatment_type = forms.IntegerField(label="", widget=forms.HiddenInput)
- person = forms.IntegerField(label=_(u"Packager"),
- widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person'),
- associated_model=Person, new=True),
- validators=[valid_id(Person)])
- start_date = forms.DateField(label=_(u"Date"), required=False,
- widget=widgets.JQueryDate)
+ person = forms.IntegerField(
+ label=_(u"Packager"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-person'),
+ associated_model=Person, new=True),
+ validators=[valid_id(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 = \
- TreatmentType.objects.get(txt_idx='packaging').pk
+ TreatmentType.objects.get(txt_idx='packaging').pk
+
class FindPackagingFormSelection(FindMultipleFormSelection):
form_label = _(u"Packaged finds")
diff --git a/archaeological_warehouse/ishtar_menu.py b/archaeological_warehouse/ishtar_menu.py
index 2da50e7ce..f9f0daf33 100644
--- a/archaeological_warehouse/ishtar_menu.py
+++ b/archaeological_warehouse/ishtar_menu.py
@@ -27,13 +27,13 @@ from archaeological_finds.models import Treatment
MENU_SECTIONS = [
- # (60, SectionItem('find_management', _(u"Find"),
- # profile_restriction='warehouse',
- # childs=[
- # MenuItem('warehouse_packaging', _(u"Packaging"),
- # model=Treatment,
- # access_controls=['add_treatment', 'add_own_treatment']),
- # ])),
+ (60, SectionItem('find_management', _(u"Find"),
+ profile_restriction='warehouse',
+ childs=[
+ MenuItem('warehouse_packaging', _(u"Packaging"),
+ model=Treatment,
+ access_controls=['add_treatment', 'add_own_treatment']),
+ ])),
]
"""
(60, SectionItem('warehouse', _(u"Warehouse"),
diff --git a/archaeological_warehouse/locale/django.pot b/archaeological_warehouse/locale/django.pot
index cb0992a12..264ef3791 100644
--- a/archaeological_warehouse/locale/django.pot
+++ b/archaeological_warehouse/locale/django.pot
@@ -6,91 +6,95 @@
msgid ""
msgstr ""
-#: forms.py:34 forms.py:89 models.py:44 models.py:71
+#: forms.py:34 forms.py:96 models.py:44 models.py:73
msgid "Warehouse"
msgstr ""
-#: forms.py:42 models.py:35
+#: forms.py:43 models.py:35
msgid "Name"
msgstr ""
-#: forms.py:44 models.py:30 models.py:37
+#: forms.py:45 models.py:29 models.py:37
msgid "Warehouse type"
msgstr ""
-#: forms.py:46 models.py:40
+#: forms.py:48 models.py:40
msgid "Person in charge"
msgstr ""
-#: forms.py:51 forms.py:94 models.py:41 models.py:75
+#: forms.py:54 forms.py:101 models.py:41 models.py:77
msgid "Comment"
msgstr ""
-#: forms.py:53
+#: forms.py:56
msgid "Address"
msgstr ""
-#: forms.py:55
+#: forms.py:58
msgid "Address complement"
msgstr ""
-#: forms.py:57
+#: forms.py:60
msgid "Postal code"
msgstr ""
-#: forms.py:59 forms.py:63
+#: forms.py:62 forms.py:66
msgid "Town"
msgstr ""
-#: forms.py:60
+#: forms.py:63
msgid "Country"
msgstr ""
-#: forms.py:62
+#: forms.py:65
msgid "Phone"
msgstr ""
-#: forms.py:86 models.py:78
+#: forms.py:92 models.py:80
msgid "Container"
msgstr ""
-#: forms.py:87 forms.py:116 models.py:62
+#: forms.py:93 forms.py:127 models.py:63
msgid "Ref."
msgstr ""
-#: forms.py:88 forms.py:115 models.py:65 models.py:73
+#: forms.py:94 forms.py:126 models.py:66 models.py:75
msgid "Container type"
msgstr ""
-#: forms.py:126
+#: forms.py:137
msgid "Container search"
msgstr ""
-#: forms.py:128
+#: forms.py:139
msgid "You should select a container."
msgstr ""
-#: forms.py:129
+#: forms.py:140
msgid "Add a new container"
msgstr ""
-#: forms.py:132 views.py:94
+#: forms.py:144 ishtar_menu.py:33 views.py:94
msgid "Packaging"
msgstr ""
-#: forms.py:137
+#: forms.py:151
msgid "Packager"
msgstr ""
-#: forms.py:141
+#: forms.py:157
msgid "Date"
msgstr ""
-#: forms.py:150
+#: forms.py:166
msgid "Packaged finds"
msgstr ""
-#: models.py:31
+#: ishtar_menu.py:30
+msgid "Find"
+msgstr ""
+
+#: models.py:30
msgid "Warehouse types"
msgstr ""
@@ -118,30 +122,30 @@ msgstr ""
msgid "Can delete own Warehouse"
msgstr ""
-#: models.py:58
+#: models.py:59
msgid "Length (mm)"
msgstr ""
-#: models.py:59
+#: models.py:60
msgid "Width (mm)"
msgstr ""
-#: models.py:60
+#: models.py:61
msgid "Height (mm)"
msgstr ""
-#: models.py:61
+#: models.py:62
msgid "Volume (l)"
msgstr ""
-#: models.py:66
+#: models.py:67
msgid "Container types"
msgstr ""
-#: models.py:74
+#: models.py:76
msgid "Container ref."
msgstr ""
-#: models.py:79
+#: models.py:81
msgid "Containers"
msgstr ""
diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py
index 86e430a7e..3591f554a 100644
--- a/archaeological_warehouse/models.py
+++ b/archaeological_warehouse/models.py
@@ -17,12 +17,11 @@
# See the file COPYING for details.
-from django.conf import settings
from django.contrib.gis.db import models
from django.utils.translation import ugettext_lazy as _, ugettext
-from ishtar_common.models import GeneralType, BaseHistorizedItem, \
- LightHistorizedItem, OwnPerms, Address, Person
+from ishtar_common.models import GeneralType, \
+ LightHistorizedItem, OwnPerms, Address, Person
class WarehouseType(GeneralType):
@@ -31,13 +30,14 @@ class WarehouseType(GeneralType):
verbose_name_plural = _(u"Warehouse types")
ordering = ('label',)
+
class Warehouse(Address, OwnPerms):
name = models.CharField(_(u"Name"), max_length=40)
warehouse_type = models.ForeignKey(WarehouseType,
verbose_name=_(u"Warehouse type"))
- person_in_charge = models.ForeignKey(Person, on_delete=models.SET_NULL,
- related_name='warehouse_in_charge',
- verbose_name=_(u"Person in charge"), null=True, blank=True)
+ person_in_charge = models.ForeignKey(
+ Person, on_delete=models.SET_NULL, related_name='warehouse_in_charge',
+ verbose_name=_(u"Person in charge"), null=True, blank=True)
comment = models.TextField(_(u"Comment"), null=True, blank=True)
class Meta:
@@ -54,6 +54,7 @@ class Warehouse(Address, OwnPerms):
def __unicode__(self):
return u"%s (%s)" % (self.name, unicode(self.warehouse_type))
+
class ContainerType(GeneralType):
length = models.IntegerField(_(u"Length (mm)"), blank=True, null=True)
width = models.IntegerField(_(u"Width (mm)"), blank=True, null=True)
@@ -66,8 +67,9 @@ class ContainerType(GeneralType):
verbose_name_plural = _(u"Container types")
ordering = ('label',)
+
class Container(LightHistorizedItem):
- TABLE_COLS = ['reference', 'container_type', 'location',]
+ TABLE_COLS = ['reference', 'container_type', 'location']
location = models.ForeignKey(Warehouse, verbose_name=_(u"Warehouse"))
container_type = models.ForeignKey(ContainerType,
verbose_name=_("Container type"))
@@ -82,4 +84,3 @@ class Container(LightHistorizedItem):
lbl = u" - ".join((self.reference, unicode(self.container_type),
unicode(self.location)))
return lbl
-
diff --git a/archaeological_warehouse/urls.py b/archaeological_warehouse/urls.py
index 58f594bcd..9094f0a91 100644
--- a/archaeological_warehouse/urls.py
+++ b/archaeological_warehouse/urls.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2010-2012 É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
@@ -27,8 +27,6 @@ import views
# forms
urlpatterns = patterns(
'',
- # url(r'treatment_creation/(?P<step>.+)?$',
- # views.treatment_creation_wizard, name='treatment_creation'),
url(r'warehouse_packaging/(?P<step>.+)?$',
views.warehouse_packaging_wizard, name='warehouse_packaging'),
)
diff --git a/archaeological_warehouse/views.py b/archaeological_warehouse/views.py
index 22eed80e3..486c2a1e0 100644
--- a/archaeological_warehouse/views.py
+++ b/archaeological_warehouse/views.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2010-2012 É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
@@ -21,7 +21,6 @@ import json
from django.db.models import Q
from django.http import HttpResponse
-from django.shortcuts import render_to_response
from django.utils.translation import ugettext_lazy as _
from ishtar_common.views import get_item, new_item
@@ -30,13 +29,14 @@ from wizards import *
from ishtar_common.forms import FinalForm
from forms import *
-get_container = get_item(models.Container,
- 'get_container', 'container',
- extra_request_keys={
- 'location':'location__pk',
- 'container_type':'container_type__pk',
- 'reference':'reference__icontains',
- })
+get_container = get_item(
+ models.Container,
+ 'get_container', 'container',
+ extra_request_keys={
+ 'location': 'location__pk',
+ 'container_type': 'container_type__pk',
+ 'reference': 'reference__icontains',
+ })
new_warehouse = new_item(models.Warehouse, WarehouseForm)
new_container = new_item(models.Container, ContainerForm)
@@ -54,12 +54,12 @@ def autocomplete_warehouse(request):
query = Q()
for q in q.split(' '):
extra = Q(name__icontains=q) | \
- Q(warehouse_type__label__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])
+ data = json.dumps([{'id': warehouse.pk, 'value': unicode(warehouse)}
+ for warehouse in warehouses])
return HttpResponse(data, mimetype='text/plain')
@@ -75,21 +75,21 @@ def autocomplete_container(request):
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)
+ 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])
+ data = json.dumps([{'id': container.pk, 'value': unicode(container)}
+ for container in containers])
return HttpResponse(data, mimetype='text/plain')
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 c40894c25..62b441e00 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
@@ -19,30 +19,24 @@
from django.shortcuts import render_to_response
from django.template import RequestContext
-from django.utils.translation import ugettext_lazy as _
from archaeological_finds.wizards import TreatmentWizard
from archaeological_finds.models import Treatment
class PackagingWizard(TreatmentWizard):
+ basket_step = 'base-packaging'
+
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')
+ items = dct.pop('basket')
treatment = Treatment(**dct)
- treatment.save()
- if not hasattr(items, '__iter__'):
- items = [items]
- for item in items:
- new = item.duplicate(self.request.user)
- item.downstream_treatment = treatment
- item.save()
- new.upstream_treatment = treatment
- new.container = dct['container']
- new.save()
+ extra_args_for_new = {"container": dct['container']}
+ treatment.save(items=items, user=self.request.user,
+ extra_args_for_new=extra_args_for_new)
res = render_to_response('ishtar/wizard/wizard_done.html', {},
context_instance=RequestContext(self.request))
return return_object and (obj, res) or res