diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2023-10-05 11:30:02 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2024-04-16 16:38:32 +0200 |
commit | 5a33b5bd2641dd665cb450b2e95069f4d8204cd9 (patch) | |
tree | 8207cc0541c3e4d2dfd0a2372a9e8c380a008d9f | |
parent | d7a3da21149ea5da231bcb7d3b2ca2b0b39ae68f (diff) | |
download | Ishtar-5a33b5bd2641dd665cb450b2e95069f4d8204cd9.tar.bz2 Ishtar-5a33b5bd2641dd665cb450b2e95069f4d8204cd9.zip |
✨ import group sheet
-rw-r--r-- | changelog/en/changelog_2022-06-15.md | 2 | ||||
-rw-r--r-- | changelog/fr/changelog_2023-01-25.md | 2 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 25 | ||||
-rw-r--r-- | ishtar_common/models_imports.py | 7 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/blocks/sheet_creation_section.html | 4 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/import_table.html | 2 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/sheet_import.html | 98 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/sheet_import_gen.html | 98 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/sheet_importgroup.html | 12 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/sheet_importgroup_pdf.html | 14 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/sheet_importgroup_window.html | 3 | ||||
-rw-r--r-- | ishtar_common/urls.py | 5 | ||||
-rw-r--r-- | ishtar_common/utils.py | 14 | ||||
-rw-r--r-- | ishtar_common/views.py | 1 |
14 files changed, 169 insertions, 118 deletions
diff --git a/changelog/en/changelog_2022-06-15.md b/changelog/en/changelog_2022-06-15.md index 6e9d4744e..72013ebe4 100644 --- a/changelog/en/changelog_2022-06-15.md +++ b/changelog/en/changelog_2022-06-15.md @@ -9,7 +9,7 @@ v4.0.XX - 2099-12-31 - automatic progress refresh - reorganization of fields - improved presentation -- sheet import +- import sheet (links from other sheet to the import sheet) ### 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 d3dd55247..171c09bc6 100644 --- a/changelog/fr/changelog_2023-01-25.md +++ b/changelog/fr/changelog_2023-01-25.md @@ -9,7 +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 +- fiche d'import (liens des autres fiches vers la fiche import) ### Technique ### - relation de mise à jour entre imports et les éléments principaux diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 79c9600dd..43677bca4 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -49,6 +49,7 @@ from ishtar_common.utils import ( get_image_path, get_columns_from_class, human_date, + SheetItem ) from simple_history.models import HistoricalRecords as BaseHistoricalRecords from simple_history.signals import ( @@ -1111,9 +1112,16 @@ class Imported(models.Model): return [] q = getattr(self, key) if user.is_superuser or user.ishtaruser.has_right("view_import"): - return list(q.all()) - q = q.filter(Q(user=user.ishtaruser) | Q(importer_type__users__pk=user.ishtaruser.pk)) - return list(q.all()) + lst = list(q.all()) + else: + lst = q.filter(Q(user=user.ishtaruser) | Q(importer_type__users__pk=user.ishtaruser.pk)) + new_lst = [] + for imprt in lst: + if imprt.group: + new_lst.append(imprt.group) + else: + new_lst.append(imprt) + return new_lst def get_imports(self, user): return self._get_imports(user, "imports") @@ -3102,7 +3110,7 @@ class ShortMenuItem: return "" -class MainItem(ShortMenuItem, SerializeItem): +class MainItem(ShortMenuItem, SerializeItem, SheetItem): """ Item with quick actions available from tables Extra actions are available from sheets @@ -3182,15 +3190,6 @@ class MainItem(ShortMenuItem, SerializeItem): except NoReverseMatch: return - def get_show_url(self): - show_url = self.SHOW_URL - if not show_url: - show_url = "show-" + self.__class__.__name__.lower() - try: - return reverse(show_url, args=[self.pk, ""]) - except NoReverseMatch: - return - @classmethod def get_columns(cls, table_cols_attr="TABLE_COLS", dict_col_labels=True): """ diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 02b86849c..84ea42112 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -75,7 +75,8 @@ from ishtar_common.utils import ( put_session_var, reverse_coordinates, update_data, - OwnPerms + OwnPerms, + SheetItem ) from ishtar_common.data_importer import ( Importer, @@ -1340,7 +1341,7 @@ IMPORT_GEOMETRY = { } -class BaseImport(models.Model, OwnPerms): +class BaseImport(models.Model, OwnPerms, SheetItem): user = models.ForeignKey( "IshtarUser", blank=True, null=True, on_delete=models.SET_NULL ) @@ -1484,6 +1485,7 @@ class ImportGroup(BaseImport): ) ADMIN_SECTION = _("Imports") SLUG = "importgroup" + SHOW_URL = "show-importgroup" def __str__(self): return f"{self.name} ({self.importer_type.name})" @@ -1879,6 +1881,7 @@ class Import(BaseImport): ) ADMIN_SECTION = _("Imports") SLUG = "import" + SHOW_URL = "show-import" def __str__(self): return "{} | {}".format(self.name or "-", self.importer_type) diff --git a/ishtar_common/templates/ishtar/blocks/sheet_creation_section.html b/ishtar_common/templates/ishtar/blocks/sheet_creation_section.html index 4460809d4..fc969bb17 100644 --- a/ishtar_common/templates/ishtar/blocks/sheet_creation_section.html +++ b/ishtar_common/templates/ishtar/blocks/sheet_creation_section.html @@ -22,7 +22,7 @@ <dl class="col-12 col-md-6 col-lg-3 flex-wrap"> <dt>{% trans "Imports (creation)" %}</dt> <dd>{% for imprt in get_import_list %}{% if loop.counter %} ; {% endif %} - <a class="display_details" href="#" onclick="load_window('{% url 'show-import' imprt.pk %}')"> + <a class="display_details" href="#" onclick="load_window('{{ imprt.get_show_url }}')"> <i class="fa fa-info-circle" aria-hidden="true"></i> </a> {{imprt}}{% endfor %}</dd> </dl> @@ -31,7 +31,7 @@ <dl class="col-12 col-md-6 col-lg-3 flex-wrap"> <dt>{% trans "Imports (update)" %}</dt> <dd>{% for imprt in get_import_updated %}{% if loop.counter %} ; {% endif %} - <a class="display_details" href="#" onclick="load_window('{% url 'show-import' imprt.pk %}')"> + <a class="display_details" href="#" onclick="load_window('{{ imprt.get_show_url }}')"> <i class="fa fa-info-circle" aria-hidden="true"></i> </a> {{imprt}}{% endfor %}</dd> </dl> diff --git a/ishtar_common/templates/ishtar/import_table.html b/ishtar_common/templates/ishtar/import_table.html index 0a894b778..be3af600b 100644 --- a/ishtar_common/templates/ishtar/import_table.html +++ b/ishtar_common/templates/ishtar/import_table.html @@ -65,7 +65,7 @@ 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> - <a class="display_details" href="#" onclick="load_window('{% url 'show-import' import.pk %}')"><i class="fa fa-info-circle" aria-hidden="true"></i></a> + <a class="display_details" href="#" onclick="load_window('{{ import.get_show_url }}')"><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> {{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> diff --git a/ishtar_common/templates/ishtar/sheet_import.html b/ishtar_common/templates/ishtar/sheet_import.html index 6ee4837a9..8685d9ae8 100644 --- a/ishtar_common/templates/ishtar/sheet_import.html +++ b/ishtar_common/templates/ishtar/sheet_import.html @@ -8,101 +8,5 @@ {% 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> {{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> {{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> {{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 %} +{% include "ishtar/sheet_import_gen.html" %} {% endblock %} diff --git a/ishtar_common/templates/ishtar/sheet_import_gen.html b/ishtar_common/templates/ishtar/sheet_import_gen.html new file mode 100644 index 000000000..86c2ac6fe --- /dev/null +++ b/ishtar_common/templates/ishtar/sheet_import_gen.html @@ -0,0 +1,98 @@ +{% load i18n window_header window_field window_tables %} +{% 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> {{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> {{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> {{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 %} diff --git a/ishtar_common/templates/ishtar/sheet_importgroup.html b/ishtar_common/templates/ishtar/sheet_importgroup.html new file mode 100644 index 000000000..593642945 --- /dev/null +++ b/ishtar_common/templates/ishtar/sheet_importgroup.html @@ -0,0 +1,12 @@ +{% extends "ishtar/sheet.html" %} +{% load i18n window_header window_field window_tables %} + +{% block head_title %}<strong>{% trans "Import" %}</strong> – {{item.name}}{% endblock %} + +{% block toolbar %} +{% window_nav item window_id 'show-importgroup' %} +{% endblock %} + +{% block content %} +{% include "ishtar/sheet_import_gen.html" %} +{% endblock %} diff --git a/ishtar_common/templates/ishtar/sheet_importgroup_pdf.html b/ishtar_common/templates/ishtar/sheet_importgroup_pdf.html new file mode 100644 index 000000000..486f85a86 --- /dev/null +++ b/ishtar_common/templates/ishtar/sheet_importgroup_pdf.html @@ -0,0 +1,14 @@ +{% extends "ishtar/sheet_importgroup.html" %} +{% block header %} +{% endblock %} +{% block main_head %} +{{ block.super }} +<div id="pdfheader"> +Ishtar – {{APP_NAME}} – {{item}} +</div> +{% endblock %} +{%block head_sheet%}{%endblock%} +{%block main_foot%} +</body> +</html> +{%endblock%} diff --git a/ishtar_common/templates/ishtar/sheet_importgroup_window.html b/ishtar_common/templates/ishtar/sheet_importgroup_window.html new file mode 100644 index 000000000..5093cbcec --- /dev/null +++ b/ishtar_common/templates/ishtar/sheet_importgroup_window.html @@ -0,0 +1,3 @@ +{% extends "ishtar/sheet_importgroup.html" %} +{% block main_head %}{%endblock%} +{% block main_foot %}{%endblock%} diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 099839102..9a5ee4f1c 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -460,6 +460,11 @@ urlpatterns += [ name="show-import", ), url( + r"show-importgroup(?:/(?P<pk>\d+))?/(?P<type>odt|pdf)?$", + views.show_import_group, + name="show-importgroup", + ), + 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 c9bf53fc7..e0a670d56 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -62,10 +62,10 @@ from django.core.exceptions import SuspiciousOperation, ObjectDoesNotExist, \ from django.core.files import File from django.core.files.storage import FileSystemStorage from django.core.validators import EMPTY_VALUES -from django.urls import reverse from django.db import models from django.db.models import Q from django.http import HttpResponseRedirect +from django.urls import reverse, NoReverseMatch from django.utils.crypto import get_random_string from django.utils.datastructures import MultiValueDict as BaseMultiValueDict from django.utils.safestring import mark_safe @@ -275,6 +275,18 @@ def check_model_access_control(request, model, available_perms=None): return allowed, own +class SheetItem: + SHOW_URL = "" + def get_show_url(self): + show_url = self.SHOW_URL + if not show_url: + show_url = "show-" + self.__class__.__name__.lower() + try: + return reverse(show_url, args=[self.pk, ""]) + except NoReverseMatch: + return + + class OwnPerms: """ Manage special permissions for object's owner diff --git a/ishtar_common/views.py b/ishtar_common/views.py index fe0e94e87..15e0158da 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1095,6 +1095,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") +show_import_group = show_item(models.ImportGroup, "importgroup") def action(request, action_slug, obj_id=None, *args, **kwargs): """ |