summaryrefslogtreecommitdiff
path: root/archaeological_operations
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2020-12-04 16:12:23 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-02-28 12:15:22 +0100
commit78b76b596213369146488cb9964ae877502c5aab (patch)
tree9367c07079dc213b09d6dff6719fe3bb49aa3e67 /archaeological_operations
parentd4d22c491fd57a383e9cb3a03686d27f7e9d13ee (diff)
downloadIshtar-78b76b596213369146488cb9964ae877502c5aab.tar.bz2
Ishtar-78b76b596213369146488cb9964ae877502c5aab.zip
Add documents to administrative acts (refs #4999)
Diffstat (limited to 'archaeological_operations')
-rw-r--r--archaeological_operations/migrations/0106_auto_20201204_1557.py32
-rw-r--r--archaeological_operations/models.py47
-rw-r--r--archaeological_operations/templates/ishtar/sheet_administrativeact.html83
-rw-r--r--archaeological_operations/urls.py3
-rw-r--r--archaeological_operations/views.py33
5 files changed, 152 insertions, 46 deletions
diff --git a/archaeological_operations/migrations/0106_auto_20201204_1557.py b/archaeological_operations/migrations/0106_auto_20201204_1557.py
new file mode 100644
index 000000000..d93419443
--- /dev/null
+++ b/archaeological_operations/migrations/0106_auto_20201204_1557.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.27 on 2020-12-04 15:57
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0205_auto_20201203_1453'),
+ ('archaeological_operations', '0105_auto_20201203_1453'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='administrativeact',
+ name='documents',
+ field=models.ManyToManyField(blank=True, related_name='administrativeacts', to='ishtar_common.Document', verbose_name='Documents'),
+ ),
+ migrations.AddField(
+ model_name='administrativeact',
+ name='main_image',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='main_image_administrativeacts', to='ishtar_common.Document', verbose_name='Main image'),
+ ),
+ migrations.AddField(
+ model_name='historicaladministrativeact',
+ name='main_image',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='ishtar_common.Document', verbose_name='Main image'),
+ ),
+ ]
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index 5ca822f73..f5bf540fa 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -598,11 +598,11 @@ class ArchaeologicalSite(DocumentItem, BaseHistorizedItem, CompleteIdentifierIte
else:
current_operations.pop(relation.right_record.pk)
rel_type = RelationType.get_cache('has_got')
- for missing in current_operations:
+ for missing, value in current_operations.items():
RecordRelations.objects.create(
left_record=top_operation,
- right_record=current_operations[missing],
- relation_type=rel_type
+ right_record=value,
+ relation_type=rel_type,
)
@@ -1708,12 +1708,11 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem,
return self._get_or_set_stats('_nb_documents', update)
def _nb_documents(self):
- nbs = self.documents.count() + \
+ return self.documents.count() + \
Document.objects.filter(
context_records__operation=self).count() + \
Document.objects.filter(
finds__base_finds__context_record__operation=self).count()
- return nbs
@property
def nb_documents_by_types(self, update=False):
@@ -1910,7 +1909,8 @@ post_save.connect(post_save_cache, sender=ActType)
post_delete.connect(post_save_cache, sender=ActType)
-class AdministrativeAct(BaseHistorizedItem, OwnPerms, ValueGetter):
+class AdministrativeAct(DocumentItem, BaseHistorizedItem, OwnPerms,
+ ValueGetter):
TABLE_COLS = ['full_ref', 'signature_date__year', 'index', 'act_type',
'act_object', 'signature_date',
'associated_file__cached_label',
@@ -2190,6 +2190,13 @@ class AdministrativeAct(BaseHistorizedItem, OwnPerms, ValueGetter):
towns_label = models.TextField(
_("Towns"), blank=True, default="",
help_text=_("Cached values get from associated towns"))
+ documents = models.ManyToManyField(
+ Document, related_name="administrativeacts",
+ verbose_name=_("Documents"), blank=True)
+ main_image = models.ForeignKey(
+ Document, related_name='main_image_administrativeacts',
+ on_delete=models.SET_NULL,
+ verbose_name=_("Main image"), blank=True, null=True)
history = HistoricalRecords()
_prefix = 'adminact_'
@@ -2225,13 +2232,26 @@ class AdministrativeAct(BaseHistorizedItem, OwnPerms, ValueGetter):
return 'delete-administrativeact-treatmentfile'
def __str__(self):
- return settings.JOINT.join(
+ lbl = ""
+ if self.year:
+ lbl = str(self.year)
+ if self.index:
+ lbl += "-{}".format(self.index)
+ if lbl:
+ lbl += " - "
+ lbl += self.act_type.label + " - "
+ return lbl + settings.JOINT.join(
[str(item) for item in [
self.related_item, self.act_object]
if item])
full_ref_lbl = _("Ref.")
+ def _get_base_image_path(self):
+ if self.year:
+ return str(self.year)
+ return ""
+
@property
def full_ref(self):
lbl = []
@@ -2294,14 +2314,11 @@ class AdministrativeAct(BaseHistorizedItem, OwnPerms, ValueGetter):
return self.treatment_file
def get_extra_templates(self, request):
- templates = []
- for template in self.act_type.associated_template.all():
- urlname = "generatedoc-administrativeactop"
- templates.append(
- (template.name, reverse(
- urlname, args=[self.pk, template.pk]))
- )
- return templates
+ urlname = "generatedoc-administrativeactop"
+ return [
+ (template.name, reverse(urlname, args=[self.pk, template.pk]))
+ for template in self.act_type.associated_template.all()
+ ]
def get_filename(self):
filename = self.related_item.associated_filename
diff --git a/archaeological_operations/templates/ishtar/sheet_administrativeact.html b/archaeological_operations/templates/ishtar/sheet_administrativeact.html
index f0026807c..843d5fc8d 100644
--- a/archaeological_operations/templates/ishtar/sheet_administrativeact.html
+++ b/archaeological_operations/templates/ishtar/sheet_administrativeact.html
@@ -1,5 +1,5 @@
{% extends "ishtar/sheet.html" %}
-{% load i18n window_header window_field %}
+{% load i18n window_header window_field window_tables link_to_window %}
{% block head_title %}<strong>{% trans "Administrative act" %}</strong> - {{item.full_ref}}{% endblock %}
@@ -20,37 +20,62 @@
{% block content %}
-<h3>{% trans "General"%}</h3>
-<div class="row">
- {% field_flex "Year" item.year %}
- {% field_flex "Index" item.index %}
- {% field_flex "Internal reference" item.ref_sra %}
- {% field_flex "Type" item.act_type %}
- {% field_flex "Object" item.act_object %}
- {% field_flex_detail "Signatory" item.signatory %}
- {% field_flex "Signature date" item.signature_date %}
- {% field_flex "In charge" item.in_charge %}
- {% field_flex "Archaeological preventive operator" item.operator %}
- {% field_flex_detail "Associated file" item.associated_file %}
- {% field_flex_detail "Operation" item.operation %}
- {% field_flex_detail "Treatment" item.treatment %}
- {% field_flex_detail "Treatment request" item.treatment_file %}
-
- {% if item.operation and item.operation.surface %}
- <div class="col-12 col-md-6 col-lg-4 d-flex flex-wrap row">
- <dt class="col-5">{% trans "Surface"%}</dt>
- <dd class='col-7'>
- {{ item.operation.surface }} m<sup>2</sup> ({{ item.operation.surface_ha }} ha)
- </dd>
+{% with pdf_attached=item.pdf_attached %}
+{% if pdf_attached %}
+<p class="text-center col-12 p-2">
+ <a href="{{pdf_attached}}" target="_blank">
+ {% trans "View PDF" %}
+ <i class="fa fa-external-link" aria-hidden="true"></i>
+ </a>
+</p>
+{% endif %}
+{% endwith %}
+
+<div class="clearfix">
+ {% if item.images.count %}
+ <div class="card float-left col-12 col-md-6 col-lg-4">
+ {% include "ishtar/blocks/window_image.html" %}
</div>
{% endif %}
- {% field_flex_detail "Created by" item.history_creator.ishtaruser.person %}
+ <h3>{% trans "General"%}</h3>
+ <div class="row">
+ {% field_flex "Year" item.year %}
+ {% field_flex "Index" item.index %}
+ {% field_flex "Internal reference" item.ref_sra %}
+ {% field_flex "Type" item.act_type %}
+ {% field_flex "Object" item.act_object %}
+ {% field_flex_detail "Signatory" item.signatory %}
+ {% field_flex "Signature date" item.signature_date %}
+ {% field_flex "In charge" item.in_charge %}
+ {% field_flex "Archaeological preventive operator" item.operator %}
+ {% field_flex_detail "Associated file" item.associated_file %}
+ {% field_flex_detail "Operation" item.operation %}
+ {% field_flex_detail "Treatment" item.treatment %}
+ {% field_flex_detail "Treatment request" item.treatment_file %}
+
+ {% if item.operation and item.operation.surface %}
+ <div class="col-12 col-md-6 col-lg-4 d-flex flex-wrap row">
+ <dt class="col-5">{% trans "Surface"%}</dt>
+ <dd class='col-7'>
+ {{ item.operation.surface }} m<sup>2</sup> ({{ item.operation.surface_ha }} ha)
+ </dd>
+ </div>
+ {% endif %}
+ {% field_flex_detail "Created by" item.history_creator.ishtaruser.person %}
- {% comment %}{% if item.general_contractor.attached_to %}<p>
- <label>{% trans "General contractor organisation"%}</label>
- <span class='value'>{{ item.general_contractor.attached_to }}</span></p>{% endif %} <!-- Contractor's organisation displayed as concat of Name/Adress/postal_code/city -->
- {% if item.general_contractor %}<p><label>{%trans "General contractor"%}</label> <span class='value'>{{ item.general_contractor.full_label }}</span></p>{% endif %}
- {% endcomment %}
+ {% comment %}{% if item.general_contractor.attached_to %}<p>
+ <label>{% trans "General contractor organisation"%}</label>
+ <span class='value'>{{ item.general_contractor.attached_to }}</span></p>{% endif %} <!-- Contractor's organisation displayed as concat of Name/Adress/postal_code/city -->
+ {% if item.general_contractor %}<p><label>{%trans "General contractor"%}</label> <span class='value'>{{ item.general_contractor.full_label }}</span></p>{% endif %}
+ {% endcomment %}
+ </div>
</div>
+ {% if item.documents.count %}
+ <div class="row spacer">
+ <div class="col-12">
+ {% dynamic_table_document 'Documents' 'documents' 'administrativeacts' item.pk '' output %}
+ </div>
+ </div>
+ {% endif %}
{% endblock %}
diff --git a/archaeological_operations/urls.py b/archaeological_operations/urls.py
index 72e06641d..6961af39a 100644
--- a/archaeological_operations/urls.py
+++ b/archaeological_operations/urls.py
@@ -128,6 +128,9 @@ urlpatterns = [
name='generatedoc-administrativeactop'),
url(r'dashboard_operation/$', views.dashboard_operation,
name='dashboard-operation'),
+ url(r'autocomplete-administrativeact/$',
+ views.autocomplete_administrativeact,
+ name='autocomplete-administrativeact'),
url(r'autocomplete-archaeologicalsite/$',
views.autocomplete_archaeologicalsite,
diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py
index 897302828..0c3dc28a1 100644
--- a/archaeological_operations/views.py
+++ b/archaeological_operations/views.py
@@ -84,7 +84,7 @@ def autocomplete_archaeologicalsite(request):
query = query & qt
limit = 15
sites = models.ArchaeologicalSite.objects.filter(
- query).order_by('reference')[:limit]
+ query).distinct().order_by('reference')[:limit]
data = json.dumps([{'id': site.pk,
'value': str(site)[:60]}
for site in sites])
@@ -125,7 +125,7 @@ def autocomplete_operation(request):
pass
query = query & extra
limit = 15
- operations = models.Operation.objects.filter(query)[:limit]
+ operations = models.Operation.objects.filter(query).distinct()[:limit]
data = json.dumps([{'id': operation.pk, 'value': str(operation)}
for operation in operations])
return HttpResponse(data, content_type='text/plain')
@@ -566,6 +566,35 @@ def administrativeactfile_document(
return render(request, 'ishtar/administrativeact_document.html', dct)
+def autocomplete_administrativeact(request):
+ if (not request.user.has_perm(
+ 'archaeological_operations.view_administrativeact',
+ models.AdministrativeAct)
+ and not request.user.has_perm(
+ 'archaeological_operations.view_own_administrativeact',
+ models.AdministrativeAct)):
+ return HttpResponse(content_type='text/plain')
+ if not request.GET.get('term'):
+ return HttpResponse(content_type='text/plain')
+ q = request.GET.get('term')
+ query = Q()
+ for q in q.split(' '):
+ qt = Q(act_type__label__icontains=q) | Q(towns_label=q)
+ try:
+ if len(q) == 4:
+ qt |= Q(year=int(q))
+ qt |= Q(index=int(q))
+ except ValueError:
+ pass
+ query = query & qt
+ limit = 15
+ items = models.AdministrativeAct.objects.filter(
+ query).order_by('year', 'index').distinct()[:limit]
+ data = json.dumps([{'id': item.pk, 'value': str(item)[:80] + " (...)"}
+ for item in items])
+ return HttpResponse(data, content_type='text/plain')
+
+
def reset_wizards(request):
for wizard_class, url_name in (
(wizards.OperationWizard, 'operation_creation'),