summaryrefslogtreecommitdiff
path: root/archaeological_warehouse
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_warehouse')
-rw-r--r--archaeological_warehouse/models.py6
-rw-r--r--archaeological_warehouse/templates/ishtar/sheet_container.html22
-rw-r--r--archaeological_warehouse/templates/ishtar/sheet_warehouse.html19
-rw-r--r--archaeological_warehouse/urls.py8
-rw-r--r--archaeological_warehouse/views.py25
5 files changed, 73 insertions, 7 deletions
diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py
index ffc491ddc..f89092dba 100644
--- a/archaeological_warehouse/models.py
+++ b/archaeological_warehouse/models.py
@@ -118,7 +118,8 @@ class DivisionContainer(DashboardFormItem):
@property
def number_of_finds_by_place(self, update=False):
- return self._get_or_set_stats('_number_of_finds_by_place', update)
+ return self._get_or_set_stats('_number_of_finds_by_place', update,
+ expected_type=list)
def _number_of_containers_by_place(self):
return self._number_of_items_by_place(
@@ -126,7 +127,8 @@ class DivisionContainer(DashboardFormItem):
@property
def number_of_containers_by_place(self, update=False):
- return self._get_or_set_stats('_number_of_containers_by_place', update)
+ return self._get_or_set_stats('_number_of_containers_by_place', update,
+ expected_type=list)
def _get_divisions(self, current_path, remaining_division, depth=0):
if not remaining_division:
diff --git a/archaeological_warehouse/templates/ishtar/sheet_container.html b/archaeological_warehouse/templates/ishtar/sheet_container.html
index 336684bc8..7ca39645d 100644
--- a/archaeological_warehouse/templates/ishtar/sheet_container.html
+++ b/archaeological_warehouse/templates/ishtar/sheet_container.html
@@ -154,7 +154,23 @@
role="tabpanel" aria-labelledby="{{window_id}}-stats-tab">
<h3>{% trans "Statistics" %}</h3>
- <small class="centered"><em>{% trans "These numbers are updated hourly" %}</em></small>
+ <div class="row mt-2 mb-2">
+ <div class="col">
+ <div class="btn-group btn-group-sm" role="group"
+ aria-label="{% trans 'Export' %}">
+ <a class="btn btn-success"
+ onclick="long_wait();return true;"
+ href="{% url 'generate-stats-container' item.pk %}">
+
+ {% trans "Regenerate statistics" %}
+ </a>
+ </div>
+ {% with item.last_stats_update as last_stats_update%}
+ {% if last_stats_update %}<small class="ml-2">
+ <em>{% trans "Last update:" %} {{last_stats_update}}</em>
+ </small>{% endif %}{% endwith %}
+ </div>
+ </div>
{% if not item.number_containers and not item.number_divisions %}
<div class="alert alert-info">
@@ -188,10 +204,8 @@
{% endif %}
{% endfor %}
- <h4>{% trans "Containers" %}</h4>
-
{% if item.number_of_containers_by_place %}
- <h4>{% trans "Containers by location in the warehouse" %}</h4>
+ <h4>{% trans "Containers by location" %}</h4>
{% for items in item.number_of_containers_by_place %}
{% if items %}
<table class='table table-striped datatables'
diff --git a/archaeological_warehouse/templates/ishtar/sheet_warehouse.html b/archaeological_warehouse/templates/ishtar/sheet_warehouse.html
index e6717f230..b4786de5b 100644
--- a/archaeological_warehouse/templates/ishtar/sheet_warehouse.html
+++ b/archaeological_warehouse/templates/ishtar/sheet_warehouse.html
@@ -136,7 +136,24 @@
<div class="tab-pane fade" id="{{window_id}}-stats"
role="tabpanel" aria-labelledby="{{window_id}}-stats-tab">
<h3>{% trans "Statistics" %}</h3>
- <small class="centered"><em>{% trans "These numbers are updated hourly" %}</em></small>
+
+ <div class="row mt-2 mb-2">
+ <div class="col">
+ <div class="btn-group btn-group-sm" role="group"
+ aria-label="{% trans 'Export' %}">
+ <a class="btn btn-success"
+ onclick="long_wait();return true;"
+ href="{% url 'generate-stats-warehouse' item.pk %}">
+
+ {% trans "Regenerate statistics" %}
+ </a>
+ </div>
+ {% with item.last_stats_update as last_stats_update%}
+ {% if last_stats_update %}<small class="ml-2">
+ <em>{% trans "Last update:" %} {{last_stats_update}}</em>
+ </small>{% endif %}{% endwith %}
+ </div>
+ </div>
{% if not item.number_containers and not item.number_divisions %}
<div class="alert alert-info">
diff --git a/archaeological_warehouse/urls.py b/archaeological_warehouse/urls.py
index 2f43d74a6..46d812def 100644
--- a/archaeological_warehouse/urls.py
+++ b/archaeological_warehouse/urls.py
@@ -128,4 +128,12 @@ urlpatterns = [
url(r'container-manual-merge-items/(?P<pks>[0-9_]+?)/$',
views.ContainerManualMergeItems.as_view(),
name='container_manual_merge_items'),
+
+ url(r'generate-stats-container/(?P<pk>.+)/',
+ views.GenerateStatsContainer.as_view(),
+ name='generate-stats-container'),
+
+ url(r'generate-stats-warehouse/(?P<pk>.+)/',
+ views.GenerateStatsWarehouse.as_view(),
+ name='generate-stats-warehouse'),
]
diff --git a/archaeological_warehouse/views.py b/archaeological_warehouse/views.py
index 34def58cf..de0c64d19 100644
--- a/archaeological_warehouse/views.py
+++ b/archaeological_warehouse/views.py
@@ -21,6 +21,7 @@ import json
from django.core.urlresolvers import reverse
from django.db.models import Q
+from django.views.generic import RedirectView
from django.views.generic.edit import FormView
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.shortcuts import redirect
@@ -313,3 +314,27 @@ class QAContainerForm(QAItemEditForm):
# item list is necessary to verify uniqueness rules
kwargs['items'] = self.items
return kwargs
+
+
+class GenerateStats(IshtarMixin, LoginRequiredMixin, RedirectView):
+ model = None
+
+ def get_redirect_url(self, *args, **kwargs):
+ return reverse('display-item',
+ args=[self.model.SLUG, self.item.pk]) + "#stats"
+
+ def get(self, request, *args, **kwargs):
+ self.item = self.model.objects.get(pk=kwargs['pk'])
+ self.item._get_or_set_stats('_number_of_finds_by_place', update=True,
+ expected_type=list)
+ self.item._get_or_set_stats('_number_of_containers_by_place',
+ update=True, expected_type=list)
+ return super(GenerateStats, self).get(request, *args, **kwargs)
+
+
+class GenerateStatsContainer(GenerateStats):
+ model = models.Container
+
+
+class GenerateStatsWarehouse(GenerateStats):
+ model = models.Warehouse