summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2020-09-29 18:06:04 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-02-28 12:15:20 +0100
commit143b337b67195504ebbbe54984ab2e4b42ff6f2d (patch)
tree53ee5c521dba28a415f184f97cd21ee8c947eeff
parent3b0d8214cb1c4a05a3a2de392e49181ffeaf2ff6 (diff)
downloadIshtar-143b337b67195504ebbbe54984ab2e4b42ff6f2d.tar.bz2
Ishtar-143b337b67195504ebbbe54984ab2e4b42ff6f2d.zip
Warehouse sheet: display divisions table, display number of items, divisions, containers
-rw-r--r--archaeological_warehouse/models.py23
-rw-r--r--archaeological_warehouse/templates/ishtar/sheet_warehouse.html25
-rw-r--r--archaeological_warehouse/urls.py4
-rw-r--r--archaeological_warehouse/views.py8
-rw-r--r--ishtar_common/templatetags/window_tables.py6
-rw-r--r--ishtar_common/views_item.py8
6 files changed, 65 insertions, 9 deletions
diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py
index 4b7201bcc..a8a38c34d 100644
--- a/archaeological_warehouse/models.py
+++ b/archaeological_warehouse/models.py
@@ -31,6 +31,7 @@ from django.db.models.signals import post_save, post_delete, m2m_changed
from django.template.defaultfilters import slugify
from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy
+from django.apps import apps
from ishtar_common.data_importer import post_importer_action
from ishtar_common.model_managers import ExternalIdManager, UUIDModelManager
from ishtar_common.models import Document, GeneralType, get_external_id, \
@@ -155,6 +156,28 @@ class Warehouse(Address, DocumentItem, GeoItem, QRCodeItem, DashboardFormItem,
return self.name
@property
+ def number_divisions(self):
+ return Container.objects.filter(
+ location=self.pk, container_type__stationary=True).count()
+
+ @property
+ def number_containers(self):
+ return Container.objects.filter(
+ location=self.pk, container_type__stationary=False).count()
+
+ @property
+ def number_finds(self):
+ Find = apps.get_model("archaeological_finds", "Find")
+ return Find.objects.filter(
+ container__location_id=self.pk).count()
+
+ @property
+ def number_owned_finds(self):
+ Find = apps.get_model("archaeological_finds", "Find")
+ return Find.objects.filter(
+ container_ref__location_id=self.pk).count()
+
+ @property
def short_label(self):
return self.name
diff --git a/archaeological_warehouse/templates/ishtar/sheet_warehouse.html b/archaeological_warehouse/templates/ishtar/sheet_warehouse.html
index aec248b07..8e143aae9 100644
--- a/archaeological_warehouse/templates/ishtar/sheet_warehouse.html
+++ b/archaeological_warehouse/templates/ishtar/sheet_warehouse.html
@@ -60,12 +60,28 @@
<div class='row'>
- {% include "ishtar/blocks/sheet_creation_section.html" %}
+ <dl class="col-6 col-md-3 flex-wrap">
+ <dt>{% trans "Number of container" %}</dt>
+ <dd>{{item.number_containers}}</dd>
+ </dl>
+ <dl class="col-6 col-md-3 flex-wrap">
+ <dt>{% trans "Number of divisions" %}</dt>
+ <dd>{{item.number_divisions}}</dd>
+ </dl>
+ <dl class="col-6 col-md-3 flex-wrap">
+ <dt>{% trans "Number of finds" %}</dt>
+ <dd>{{item.number_finds}}</dd>
+ </dl>
+ <dl class="col-6 col-md-3 flex-wrap">
+ <dt>{% trans "Number of owned finds" %}</dt>
+ <dd>{{item.number_owned_finds}}</dd>
+ </dl>
{% field_flex_detail "Person in charge" item.person_in_charge %}
{% field_flex_detail "Organization" item.organization %}
- {% trans "Default divisions" as def_div_label %}
+ {% trans "Default divisions (imports)" as def_div_label %}
{% field_flex def_div_label item.default_location_types|join:", " %}
{% field_flex_full "Comment" item.comment "<pre>" "</pre>" %}
+ {% include "ishtar/blocks/sheet_creation_section.html" %}
{% include "ishtar/blocks/sheet_json.html" %}
</div>
@@ -87,10 +103,11 @@
<div class="tab-pane fade" id="{{window_id}}-content"
role="tabpanel" aria-labelledby="{{window_id}}-content-tab">
{% if item.containers.count %}
+ <h4>{% trans "Divisions" %}</h4>
+ {% dynamic_table_document '' 'divisions' 'location_id' item.pk 'TABLE_COLS' output %}
<h4>{% trans "Containers" %}</h4>
- {% dynamic_table_document '' 'containers' 'location_id' item.pk 'TABLE_COLS' output %}
+ {% dynamic_table_document '' 'non-divisions' 'location_id' item.pk 'TABLE_COLS' output %}
{% else %}
-
<div class="alert alert-info">
<i class="fa fa-exclamation-triangle"></i>
{% trans "No container inside this warehouse" %}
diff --git a/archaeological_warehouse/urls.py b/archaeological_warehouse/urls.py
index c1b589315..2f43d74a6 100644
--- a/archaeological_warehouse/urls.py
+++ b/archaeological_warehouse/urls.py
@@ -46,6 +46,10 @@ urlpatterns = [
views.new_container, name='new-container'),
url(r'get-container/(?P<type>.+)?$', views.get_container,
name='get-container'),
+ url(r'get-divisions-container/(?P<type>.+)?$',
+ views.get_divisions_container, name='get-divisions-container'),
+ url(r'get-non-divisions-container/(?P<type>.+)?$',
+ views.get_non_divisions_container, name='get-non-divisions-container'),
url(r'get-warehouse/(?P<type>.+)?$', views.get_warehouse,
name='get-warehouse'),
url(r'get-warehouse-shortcut/(?P<type>.+)?$',
diff --git a/archaeological_warehouse/views.py b/archaeological_warehouse/views.py
index 3a11c0e05..34def58cf 100644
--- a/archaeological_warehouse/views.py
+++ b/archaeological_warehouse/views.py
@@ -46,6 +46,14 @@ from archaeological_warehouse.wizards import PackagingWizard, WarehouseSearch, \
get_container = get_item(models.Container, 'get_container', 'container',
search_form=forms.ContainerSelect)
+get_divisions_container = get_item(
+ models.Container, 'get_container', 'container',
+ search_form=forms.ContainerSelect,
+ base_request={"container_type__stationary": 'True'})
+get_non_divisions_container = get_item(
+ models.Container, 'get_container', 'container',
+ search_form=forms.ContainerSelect,
+ base_request={"container_type__stationary": 'False'})
show_container = show_item(models.Container, 'container')
get_warehouse = get_item(models.Warehouse, 'get_warehouse', 'warehouse',
diff --git a/ishtar_common/templatetags/window_tables.py b/ishtar_common/templatetags/window_tables.py
index a46f404ba..8193f1061 100644
--- a/ishtar_common/templatetags/window_tables.py
+++ b/ishtar_common/templatetags/window_tables.py
@@ -65,6 +65,9 @@ ASSOCIATED_MODELS['base_treatments'] = (
Treatment, 'get-treatment', '')
ASSOCIATED_MODELS['treatment_files'] = (TreatmentFile, 'get-treatmentfile', '')
ASSOCIATED_MODELS['containers'] = (Container, 'get-container', '')
+ASSOCIATED_MODELS['divisions'] = (Container, 'get-divisions-container', '')
+ASSOCIATED_MODELS['non-divisions'] = (
+ Container, 'get-non-divisions-container', '')
ASSOCIATED_MODELS['warehouses'] = (Warehouse, 'get-warehouse', '')
ASSOCIATED_MODELS['documents'] = (Document, 'get-document', '')
@@ -88,7 +91,8 @@ def dynamic_table_document(
t = get_template('ishtar/blocks/window_tables/dynamic_documents.html')
context = {
'caption': caption,
- 'name': '{}{}{}'.format(slugify(caption), key, int(time.time())),
+ 'name': '{}{}{}'.format(slugify(caption), key,
+ int(time.time() * 1000)),
'source': source + source_attrs,
'source_full': source_full,
'simple_source': source,
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index 33d817a25..1ef98e3c2 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -705,11 +705,11 @@ def _manage_bool_fields(model, bool_fields, reversed_bool_fields, dct, or_reqs):
for k in bool_fields:
if k not in dct:
continue
- elif dct[k] == u"1":
+ elif dct[k] == "1":
dct.pop(k)
continue
- dct[k] = dct[k].replace(u'"', u'')
- if dct[k] in [u"2", u"yes", str(_(u"Yes")).lower()]:
+ dct[k] = dct[k].replace('"', '')
+ if dct[k] in ["2", "yes", str(_("Yes")).lower(), "True"]:
dct[k] = True
else:
dct[k] = False
@@ -1399,7 +1399,7 @@ def get_item(model, func_name, default_name, extra_request_keys=None,
:param own_table_cols:
:param relation_types_prefix:
:param do_not_deduplicate: duplication of id can occurs on large queryset a
- mecanism of deduplication is used. But duplicate ids can be normal (for
+ mechanism of deduplication is used. But duplicate ids can be normal (for
instance for record_relations view).
:param model_for_perms: use another model to check permission
:param alt_query_own: name of alternate method to get query_own