summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changelog/en/changelog_2022-06-15.md11
-rw-r--r--changelog/fr/changelog_2023-01-25.md1
-rw-r--r--ishtar_common/models_imports.py21
-rw-r--r--ishtar_common/templates/ishtar/import_associated_item.html23
-rw-r--r--ishtar_common/templates/ishtar/import_delete.html28
-rw-r--r--ishtar_common/templates/ishtar/import_list.html2
-rw-r--r--ishtar_common/templates/ishtar/import_table.html5
-rw-r--r--ishtar_common/templates/ishtar/sheet_import.html108
-rw-r--r--ishtar_common/templates/ishtar/sheet_import_pdf.html14
-rw-r--r--ishtar_common/templates/ishtar/sheet_import_window.html3
-rw-r--r--ishtar_common/urls.py5
-rw-r--r--ishtar_common/utils.py8
-rw-r--r--ishtar_common/views.py2
-rw-r--r--ishtar_common/views_item.py9
14 files changed, 198 insertions, 42 deletions
diff --git a/changelog/en/changelog_2022-06-15.md b/changelog/en/changelog_2022-06-15.md
index 9940ffad1..6e9d4744e 100644
--- a/changelog/en/changelog_2022-06-15.md
+++ b/changelog/en/changelog_2022-06-15.md
@@ -5,11 +5,12 @@ v4.0.XX - 2099-12-31
- pre-import forms
- imports form: reorganisation of field order
- import table :
- - built-in CSV viewer
- - automatic progress refresh
- - reorganization of fields
- - improved presentation
- -
+ - built-in CSV viewer
+ - automatic progress refresh
+ - reorganization of fields
+ - improved presentation
+- sheet import
+
### Technical ###
- update relationship between imports and main items
diff --git a/changelog/fr/changelog_2023-01-25.md b/changelog/fr/changelog_2023-01-25.md
index 82accf4f1..d3dd55247 100644
--- a/changelog/fr/changelog_2023-01-25.md
+++ b/changelog/fr/changelog_2023-01-25.md
@@ -9,6 +9,7 @@ v4.0.XX - 2099-12-31
- rafraîchissement automatique de l'avancement
- réorganisation des champs
- amélioration de la présentation
+- fiche d'import
### Technique ###
- relation de mise à jour entre imports et les éléments principaux
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index af907d44d..02b86849c 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -1744,15 +1744,20 @@ class ImportGroup(BaseImport):
self.save()
self._archive_pending = False
-
- def get_all_imported(self):
+ def _get_all_related(self, key):
imported = []
for imp in self.imports.all():
- for related, zorg in get_all_related_m2m_objects_with_model(imp):
+ for related, zorg in get_all_related_m2m_objects_with_model(imp, related_name=key):
accessor = related.get_accessor_name()
imported += [(accessor, obj) for obj in getattr(imp, accessor).all()]
return sorted(imported, key=lambda i: i[1].__class__.__name__)
+ def get_all_imported(self):
+ return self._get_all_related("imported_")
+
+ def get_all_updated(self):
+ return self._get_all_related("import_updated_")
+
def save(self, *args, **kwargs):
add = self._state.adding
super().save(*args, **kwargs)
@@ -2547,13 +2552,19 @@ class Import(BaseImport):
self.save()
self._archive_pending = False
- def get_all_imported(self):
+ def _get_all_related(self, key):
imported = []
- for related, zorg in get_all_related_m2m_objects_with_model(self):
+ for related, zorg in get_all_related_m2m_objects_with_model(self, related_name=key):
accessor = related.get_accessor_name()
imported += [(accessor, obj) for obj in getattr(self, accessor).all()]
return imported
+ def get_all_imported(self):
+ return self._get_all_related("imported_")
+
+ def get_all_updated(self):
+ return self._get_all_related("import_updated_")
+
def pre_delete_import(sender, **kwargs):
# deleted imported items when an import is delete
diff --git a/ishtar_common/templates/ishtar/import_associated_item.html b/ishtar_common/templates/ishtar/import_associated_item.html
new file mode 100644
index 000000000..359e22a90
--- /dev/null
+++ b/ishtar_common/templates/ishtar/import_associated_item.html
@@ -0,0 +1,23 @@
+{% load i18n inline_formset verbose_names %}
+ {% ifchanged imported|verbose_model_name %}
+ {% if forloop.counter0 %}
+ </div>
+ </div>
+ {% endif %}
+ <div class="card w-100">
+ <div class="card-header">
+ {{ imported|verbose_model_name }}
+ </div>
+ <div class="card-body">
+ {% else %}
+ <hr>
+ {% endifchanged %}
+ {% if imported.SLUG %}
+ {% url "show-"|add:imported.SLUG imported.pk "" as current_url %}
+ {% if current_url %}
+ <a class="display_details_inline" href="#" onclick='load_window("{% url "show-"|add:imported.SLUG imported.pk "" %}")'>
+ <i class="fa fa-info-circle" aria-hidden="true"></i>
+ </a>
+ {% endif %}
+ {% endif %}
+ {{ imported }}
diff --git a/ishtar_common/templates/ishtar/import_delete.html b/ishtar_common/templates/ishtar/import_delete.html
index db3df8fe4..f6698d97d 100644
--- a/ishtar_common/templates/ishtar/import_delete.html
+++ b/ishtar_common/templates/ishtar/import_delete.html
@@ -14,31 +14,13 @@
{% endblock %}
<h3>{{object}}</h3>
- {% for accessor, imported in object.get_all_imported %}
- {% ifchanged imported|verbose_model_name %}
- {% if forloop.counter0 %}
+ {% for accessor, imported in object.get_all_imported %}
+ {% include "ishtar/import_associated_item.html" %}
+ {% endfor %}
+ {% comment %}<div><div>{% endcomment %}
+ </div>
</div>
</div>
- {% endif %}
- <div class="card">
- <div class="card-header">
- {{ imported|verbose_model_name }}
- </div>
- <div class="card-body">
- {% else %}
- <hr>
- {% endifchanged %}
- {% if imported.SLUG %}
- {% url "show-"|add:imported.SLUG imported.pk "" as current_url %}
- {% if current_url %}
- <a class="display_details_inline" href="#" onclick='load_window("{% url "show-"|add:imported.SLUG imported.pk "" %}")'>
- <i class="fa fa-info-circle" aria-hidden="true"></i>
- </a>
- {% endif %}
- {% endif %}
- {{ imported }}
- {% endfor %}
- </div>
</div>
{% block "footer" %}
<div id="footer">
diff --git a/ishtar_common/templates/ishtar/import_list.html b/ishtar_common/templates/ishtar/import_list.html
index 254ba8429..35821c5bf 100644
--- a/ishtar_common/templates/ishtar/import_list.html
+++ b/ishtar_common/templates/ishtar/import_list.html
@@ -16,7 +16,7 @@
{% endblock %}
{% block content %}
-<div class="text-center">
+<div class="text-center m-3">
{% if has_import_table %}<a href="{% url 'new_import' %}" class="btn btn-success">
<i class="fa fa-plus"></i> {% trans 'import (table)' %}
</a>{% endif %}
diff --git a/ishtar_common/templates/ishtar/import_table.html b/ishtar_common/templates/ishtar/import_table.html
index 57e28abc3..0a894b778 100644
--- a/ishtar_common/templates/ishtar/import_table.html
+++ b/ishtar_common/templates/ishtar/import_table.html
@@ -64,7 +64,10 @@
<tr id="import-{{import.import_id}}"
class='import-row{% if import.has_error or not import.pre_import_form_is_valid %}-error{% endif %}{% if import.pk in refreshed_pks %} bg-info{% endif %}'>
<td><ul class="simple">
- <li><strong>{{import.name|default:"-"}}</strong></li>
+ <li>
+ <a class="display_details" href="#" onclick="load_window('{% url 'show-import' import.pk %}')"><i class="fa fa-info-circle" aria-hidden="true"></i></a>
+ <strong>{{import.name|default:"-"}}</strong>
+ </li>
<li><small><i class="fa fa-fw fa-calendar" aria-hidden="true"></i>&nbsp; {{import.creation_date|date:"DATE_FORMAT"}} {{import.creation_date|time:"H:i"}} - {% if import.end_date %}{{import.end_date|date:"DATE_FORMAT"}} {{import.end_date|time:"H:i"}}{% endif %}</small></li>
<li><small><i class="fa fa-fw fa-user" aria-hidden="true"></i>&nbsp; {{import.user}}</small></li>
</ul></td>
diff --git a/ishtar_common/templates/ishtar/sheet_import.html b/ishtar_common/templates/ishtar/sheet_import.html
new file mode 100644
index 000000000..6ee4837a9
--- /dev/null
+++ b/ishtar_common/templates/ishtar/sheet_import.html
@@ -0,0 +1,108 @@
+{% extends "ishtar/sheet.html" %}
+{% load i18n window_header window_field window_tables %}
+
+{% block head_title %}<strong>{% trans "Import" %}</strong> &ndash; {{item.name}}{% endblock %}
+
+{% block toolbar %}
+{% window_nav item window_id 'show-import' %}
+{% endblock %}
+
+{% block content %}
+{% trans "Source" as source_label %}
+{% trans "Media" as media_label %}
+{% trans "Result" as result_label %}
+{% trans "Error" as error_label %}
+{% trans "Match" as match_label %}
+
+{% with current_import=item %}{% with object=item %}
+{% with imported_list=object.get_all_imported %}
+{% with updated_list=object.get_all_updated %}
+
+{% if output != "ODT" and output != "PDF" %}
+<ul class="nav nav-tabs" id="{{window_id}}-tabs" role="tablist">
+ <li class="nav-item">
+ <a class="nav-link active" id="{{window_id}}-general-tab"
+ data-toggle="tab" href="#{{window_id}}-general" role="tab"
+ aria-controls="{{window_id}}-general" aria-selected="false">
+ {% trans "General" %}
+ </a>
+ </li>
+ {% if imported_list %}<li class="nav-item">
+ <a class="nav-link" id="{{window_id}}-created-tab"
+ data-toggle="tab" href="#{{window_id}}-created" role="tab"
+ aria-controls="{{window_id}}-general" aria-selected="false">
+ {% trans "Created" %}
+ </a>
+ </li>{% endif %}
+ {% if updated_list %}<li class="nav-item">
+ <a class="nav-link" id="{{window_id}}-updated-tab"
+ data-toggle="tab" href="#{{window_id}}-updated" role="tab"
+ aria-controls="{{window_id}}-updated" aria-selected="false">
+ {% trans "Updated" %}
+ </a>
+ </li>{% endif %}
+</ul>
+{% endif %}
+
+<div class="tab-content" id="{{window_id}}-tab-content">
+ <div class="tab-pane fade show active" id="{{window_id}}-general"
+ role="tabpanel" aria-labelledby="{{window_id}}-general-tab">
+ <div class="row mb-3">
+ {% field_flex "Name" item.name %}
+ {% field_flex "Type" item.importer_type %}
+
+ <div class="col-12 col-md-6 col-lg-3 flex-wrap">
+ <i class="fa fa-hourglass-start" aria-hidden="true"></i>&nbsp; {{item.creation_date|date:"DATE_FORMAT"}} {{item.creation_date|time:"H:i"}}
+ {% if item.end_date %}<br><i class="fa fa-hourglass-end" aria-hidden="true"></i>&nbsp; {{item.end_date|date:"DATE_FORMAT"}} {{item.end_date|time:"H:i"}}{% endif %}
+ </div>
+ <div class="col-12 col-md-6 col-lg-3 flex-wrap">
+ <i class="fa fa-fw fa-user" aria-hidden="true"></i>&nbsp; {{item.user}}
+ </div>
+
+ {% if item.imported_file %}
+ <div class="col-12 col-md-6 col-lg-3 flex-wrap">
+ {% with file_label=source_label logo='fa fa-fw fa-file-text-o' file_type='source' file=item.imported_file %}
+ {% include "ishtar/blocks/import_table_buttons_view.html" %}
+ {% endwith %}
+ </div>
+
+ {% if item.get_imported_images %}
+ <div class="col-12 col-md-6 col-lg-3 flex-wrap">
+ {% with file_label=media_label logo='fa fa-fw fa-file-image-o' file_type='' file=item.get_imported_images %}
+ {% include "ishtar/blocks/import_table_buttons_view.html" %}
+ {% endwith %}
+ </div>{% endif %}
+ {% elif item.archive_file %}
+ <div class="col-12 col-md-6 col-lg-3 flex-wrap">
+ <i class="fa fa-fw fa-file-archive-o" aria-hidden="true"></i> <a href='{{item.archive_file.url}}'>{% trans "Archive" context "name" %}</a>
+ </div>{% endif %}
+ </div>
+ </div>
+ {% if imported_list %}
+ <div class="tab-pane fade" id="{{window_id}}-created"
+ role="tabpanel" aria-labelledby="{{window_id}}-created-tab">
+ <div class="row">
+ {% for accessor, imported in imported_list %}
+ {% include "ishtar/import_associated_item.html" %}
+ {% endfor %}
+ {% comment %}<div><div>{% endcomment %}
+ </div>
+ </div>
+ </div>
+ </div>{% endif %}
+ {% if updated_list %}
+ <div class="tab-pane fade" id="{{window_id}}-updated"
+ role="tabpanel" aria-labelledby="{{window_id}}-updated-tab">
+ <div class="row">
+ {% for accessor, imported in updated_list %}
+ {% include "ishtar/import_associated_item.html" %}
+ {% endfor %}
+ {% comment %}<div><div>{% endcomment %}
+ </div>
+ </div>
+ </div>
+ </div>{% endif %}
+</div>
+
+{% endwith %}{% endwith %}{% endwith %}{% endwith %}
+{% endblock %}
diff --git a/ishtar_common/templates/ishtar/sheet_import_pdf.html b/ishtar_common/templates/ishtar/sheet_import_pdf.html
new file mode 100644
index 000000000..47f28239f
--- /dev/null
+++ b/ishtar_common/templates/ishtar/sheet_import_pdf.html
@@ -0,0 +1,14 @@
+{% extends "ishtar/sheet_import.html" %}
+{% block header %}
+{% endblock %}
+{% block main_head %}
+{{ block.super }}
+<div id="pdfheader">
+Ishtar &ndash; {{APP_NAME}} &ndash; {{item}}
+</div>
+{% endblock %}
+{%block head_sheet%}{%endblock%}
+{%block main_foot%}
+</body>
+</html>
+{%endblock%}
diff --git a/ishtar_common/templates/ishtar/sheet_import_window.html b/ishtar_common/templates/ishtar/sheet_import_window.html
new file mode 100644
index 000000000..40ad00320
--- /dev/null
+++ b/ishtar_common/templates/ishtar/sheet_import_window.html
@@ -0,0 +1,3 @@
+{% extends "ishtar/sheet_import.html" %}
+{% block main_head %}{%endblock%}
+{% block main_foot %}{%endblock%}
diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py
index 2dbc13434..099839102 100644
--- a/ishtar_common/urls.py
+++ b/ishtar_common/urls.py
@@ -455,6 +455,11 @@ urlpatterns += [
name="show-organization",
),
url(
+ r"show-import(?:/(?P<pk>\d+))?/(?P<type>odt|pdf)?$",
+ views.show_import,
+ name="show-import",
+ ),
+ url(
r"autocomplete-organization/([0-9_]+)?$",
views.autocomplete_organization,
name="autocomplete-organization",
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 7b708cd76..dd2f3afe3 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -1240,11 +1240,15 @@ def get_all_field_names(model):
)
-def get_all_related_m2m_objects_with_model(model):
+def get_all_related_m2m_objects_with_model(model, related_name=None):
+ for f in model._meta.get_fields(include_hidden=True):
+ if f.many_to_many and f.auto_created:
+ print(f.related_name)
return [
(f, f.model if f.model != model else None)
for f in model._meta.get_fields(include_hidden=True)
- if f.many_to_many and f.auto_created
+ if f.many_to_many and f.auto_created and
+ (not related_name or f.related_name.startswith(related_name))
]
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index ca9df098c..fe0e94e87 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -1094,7 +1094,7 @@ get_ishtaruser = get_item(models.IshtarUser, "get_ishtaruser", "ishtaruser")
show_town = show_item(models.Town, "town")
show_area = show_item(models.Area, "area")
-
+show_import = show_item(models.Import, "import")
def action(request, action_slug, obj_id=None, *args, **kwargs):
"""
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index 7ca1f4b59..7596f493f 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -435,10 +435,11 @@ def show_item(model, name, extra_dct=None, model_for_perms=None):
dct.update(extra_dct(request, item))
context_instance = deepcopy(dct)
context_instance["output"] = "html"
- if hasattr(item, "history_object"):
- filename = item.history_object.associated_filename
- else:
- filename = item.associated_filename
+ if hasattr(item, "associated_filename"):
+ if hasattr(item, "history_object"):
+ filename = item.history_object.associated_filename
+ else:
+ filename = item.associated_filename
if doc_type == "odt" and settings.ODT_TEMPLATE:
tpl = loader.get_template("ishtar/sheet_%s.html" % name)
context_instance["output"] = "ODT"