diff --git a/HISTORY.rst b/HISTORY.rst index b3b2c5d..a63cdc8 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,6 +1,18 @@ ======= History ======= +UNRELEASED +------------------ +* Fix progress bar on changeview for ImportJob and ExportJob +* Improve celery-import-result page + + * Add displaying resources for import form + * Fix autofill `Format` by file extension + * Add `Totals` section + * Remove extra loop if errors in input file (https://github.com/saritasa-nest/django-import-export-extensions/issues/74) + +* Fixed display of progress bar when task is waiting to run (https://github.com/saritasa-nest/django-import-export-extensions/issues/68) +* Improve progress bar style (https://github.com/saritasa-nest/django-import-export-extensions/issues/72) 1.0.1 (2024-11-08) ------------------ diff --git a/import_export_extensions/admin/mixins/import_mixin.py b/import_export_extensions/admin/mixins/import_mixin.py index 3b31a3a..9bd25d2 100644 --- a/import_export_extensions/admin/mixins/import_mixin.py +++ b/import_export_extensions/admin/mixins/import_mixin.py @@ -16,6 +16,7 @@ from import_export import admin as import_export_admin from import_export import mixins as import_export_mixins +from import_export import resources as import_export_resources from ... import models from ..forms import ForceImportForm @@ -170,24 +171,16 @@ def celery_import_action( ) # GET: display Import Form - resources = [ - resource_class(**resource_kwargs) - for resource_class in resource_classes - ] - context.update(self.admin_site.each_context(request)) context["title"] = _("Import") context["form"] = form context["opts"] = self.model_info.meta context["media"] = self.media + form.media - context["fields_list"] = [ - ( - resource.get_display_name(), - [f.column_name for f in resource.get_user_visible_fields()], - ) - for resource in resources - ] + context["fields_list"] = self._get_fields_list_for_resources( + resource_classes=resource_classes, + resource_kwargs=resource_kwargs, + ) request.current_app = self.admin_site.name return TemplateResponse( @@ -282,9 +275,16 @@ def celery_import_job_results_view( context["confirm_form"] = Form() else: # display import form + resource_classes = self.get_import_resource_classes(request) + resource_kwargs = self.get_import_resource_kwargs(request) + context["import_form"] = ForceImportForm( formats=self.get_import_formats(), - resources=self.get_import_resource_classes(request), + resources=resource_classes, + ) + context["fields_list"] = self._get_fields_list_for_resources( + resource_classes=resource_classes, + resource_kwargs=resource_kwargs, ) context.update(self.admin_site.each_context(request)) @@ -376,6 +376,27 @@ def _redirect_to_results_page( return HttpResponseRedirect(redirect_to=url) + def _get_fields_list_for_resources( + self, + resource_classes: list[type[import_export_resources.ModelResource]], + resource_kwargs, + ) -> list[tuple[str, list[str]]]: + """Get fields list for resource classes.""" + resources = [ + resource_class(**resource_kwargs) + for resource_class in resource_classes + ] + return [ + ( + resource.get_display_name(), + [ + field.column_name + for field in resource.get_user_visible_fields() + ], + ) + for resource in resources + ] + def changelist_view( self, request: WSGIRequest, diff --git a/import_export_extensions/admin/widgets.py b/import_export_extensions/admin/widgets.py index b0e5a34..e0ef621 100644 --- a/import_export_extensions/admin/widgets.py +++ b/import_export_extensions/admin/widgets.py @@ -1,5 +1,6 @@ from django import forms +from django.template.loader import render_to_string class ProgressBarWidget(forms.Widget): @@ -9,6 +10,8 @@ class ProgressBarWidget(forms.Widget): """ + template_name = "admin/import_export_extensions/progress_bar.html" + def __init__(self, *args, **kwargs): """Get ``ImportJob`` or ``ExportJob`` instance from kwargs. @@ -28,16 +31,7 @@ def render(self, *args, **kwargs) -> str: to send GET requests. """ - progress_bar = f""" - - - """ - - return progress_bar + return render_to_string(self.template_name, {"job_url": self.url}) class Media: """Class with custom assets for widget.""" diff --git a/import_export_extensions/static/import_export_extensions/css/widgets/progress_bar.css b/import_export_extensions/static/import_export_extensions/css/widgets/progress_bar.css index bcb3202..098ca38 100644 --- a/import_export_extensions/static/import_export_extensions/css/widgets/progress_bar.css +++ b/import_export_extensions/static/import_export_extensions/css/widgets/progress_bar.css @@ -4,7 +4,7 @@ progress { width: 100%; -webkit-appearance: none; border: none; - position:relative; + position: relative; } progress:before { content: attr(data-label); @@ -24,8 +24,13 @@ progress::-webkit-progress-bar { background-color: var(--breadcrumbs-fg); } progress::-webkit-progress-value { - background-color: var(--breadcrumbs-bg); + background-color: var(--primary); } progress::-moz-progress-bar { background-color: var(--breadcrumbs-bg); } + +html[data-theme="dark"] +progress::-webkit-progress-bar { + background-color: var(--darkened-bg); +} diff --git a/import_export_extensions/templates/admin/import_export_extensions/celery_export_results.html b/import_export_extensions/templates/admin/import_export_extensions/celery_export_results.html index 650f4e0..e054070 100644 --- a/import_export_extensions/templates/admin/import_export_extensions/celery_export_results.html +++ b/import_export_extensions/templates/admin/import_export_extensions/celery_export_results.html @@ -17,7 +17,7 @@ {% endblock %} {% block breadcrumbs_last %} - + {% trans "Export" %} › {% trans "Export results" %} @@ -40,7 +40,7 @@

{% trans "You can download exported data with following link" %}

- Download export data + {% trans "Download export data" %} {% endif %} {% endblock %} {% endblock %} diff --git a/import_export_extensions/templates/admin/import_export_extensions/celery_export_status.html b/import_export_extensions/templates/admin/import_export_extensions/celery_export_status.html index 0e35957..d7e0875 100644 --- a/import_export_extensions/templates/admin/import_export_extensions/celery_export_status.html +++ b/import_export_extensions/templates/admin/import_export_extensions/celery_export_status.html @@ -4,8 +4,6 @@ {% comment %} Template to show status of export job. - Similar to job's admin page. - {% endcomment %} {% block extrastyle %} @@ -24,7 +22,7 @@ {% block breadcrumbs_last %} - + {% trans "Export" %} › @@ -35,37 +33,14 @@
-

{{ export_job.export_status|title }}

+ +

{{ export_job.export_status|title }}

{% if export_job.export_status not in export_job.export_finished_statuses %}
- -

- -

-
- {% endif %} - - {% if export_job.export_status == export_job.ExportStatus.EXPORTED %} -
- -

- {% for total, stat in export_job.result.totals.items %} - {{ total.title }}:  {{ stat }}
- {% endfor %} -

-
- {% endif %} - - {% if export_job.export_status == export_job.ExportStatus.EXPORT_ERROR %} -
- -

{{ export_job.error_message }}

-
-
- - {{ export_job.traceback | linebreaks }} + + {% include "admin/import_export_extensions/progress_bar.html" with job_url=export_job_url %}
{% endif %}
diff --git a/import_export_extensions/templates/admin/import_export_extensions/celery_import_results.html b/import_export_extensions/templates/admin/import_export_extensions/celery_import_results.html index b68240f..7b28486 100644 --- a/import_export_extensions/templates/admin/import_export_extensions/celery_import_results.html +++ b/import_export_extensions/templates/admin/import_export_extensions/celery_import_results.html @@ -15,12 +15,18 @@ - + + + {% if confirm_form %} + {{ confirm_form.media }} + {% else %} + {{ import_form.media }} + {% endif %} {% endblock %} {% block breadcrumbs_last %} - + {% trans "Import" %} › {% trans "Import results" %} @@ -50,6 +56,8 @@
{% csrf_token %} + {% include "admin/import_export/resource_fields_list.html" with import_or_export="import" %} +
{% for field in import_form %}
@@ -99,62 +107,66 @@

{% trans "Errors" %}

{% endfor %} {% endfor %} - {% for invalid_row in result.invalid_rows %} -

{% trans "Some rows failed to validate" %}

+

{% trans "Some rows failed to validate" %}

-

{% trans "Please correct these errors in your data where possible, then reupload it using the form above." %}

- - +

{% trans "Please correct these errors in your data where possible, then reupload it using the form above." %}

+
+ + + + + {% for field in result.diff_headers %} + + {% endfor %} + + + + {% for row in result.invalid_rows %} - - - {% for field in result.diff_headers %} - + + + {% for field in row.values %} + {% endfor %} - - - {% for row in result.invalid_rows %} - - - - {% for field in row.values %} - - {% endfor %} - - {% endfor %} - -
{% trans "Row" %}{% trans "Errors" %}{{ field }}
{% trans "Row" %}{% trans "Errors" %}{{ field }}{{ row.number }} + {{ row.error_count }} +
+
    + {% for field_name, error_list in row.field_specific_errors.items %} +
  • + {{ field_name }} +
      + {% for error in error_list %} +
    • {{ error }}
    • + {% endfor %} +
    +
  • + {% endfor %} + {% if row.non_field_specific_errors %} +
  • + {% trans "Non field specific" %} +
      + {% for error in row.non_field_specific_errors %} +
    • {{ error }}
    • + {% endfor %} +
    +
  • + {% endif %} +
+
+
{{ field }}
{{ row.number }} - {{ row.error_count }} -
-
    - {% for field_name, error_list in row.field_specific_errors.items %} -
  • - {{ field_name }} -
      - {% for error in error_list %} -
    • {{ error }}
    • - {% endfor %} -
    -
  • - {% endfor %} - {% if row.non_field_specific_errors %} -
  • - {% trans "Non field specific" %} -
      - {% for error in row.non_field_specific_errors %} -
    • {{ error }}
    • - {% endfor %} -
    -
  • - {% endif %} -
-
-
{{ field }}
- {% endfor %} + {% endfor %} + + {% endif %} {% if import_job.import_status in import_job.success_statuses %} +

{% trans "Totals" %}

+
+ {% for total, stat in import_job.result.totals.items %} + {{ total.title }}: {{ stat }}
+ {% endfor %} +

{% if import_job.import_status == "PARSED" %} {% trans "These elements will be imported successfully" %} diff --git a/import_export_extensions/templates/admin/import_export_extensions/celery_import_status.html b/import_export_extensions/templates/admin/import_export_extensions/celery_import_status.html index 728a659..b17e00d 100644 --- a/import_export_extensions/templates/admin/import_export_extensions/celery_import_status.html +++ b/import_export_extensions/templates/admin/import_export_extensions/celery_import_status.html @@ -4,8 +4,6 @@ {% comment %} Template to show status of import job. - Similar to job's admin page. - {% endcomment %} {% block extrastyle %} @@ -24,7 +22,7 @@ {% block breadcrumbs_last %} - + {% trans "Import" %} › {% trans "Importing..." %} @@ -35,37 +33,13 @@
-

{{ import_job.import_status|title }}

+

{{ import_job.import_status|title }}

- {% if import_job.import_status in import_job.progress_statuses %} -
- -

- -

-
- {% endif %} - - {% if import_job.import_status in import_job.success_statuses %} -
- -

- {% for total, stat in import_job.result.totals.items %} - {{ total.title }}:  {{ stat }}
- {% endfor %} -

-
- {% endif %} - - {% if import_job.import_status in import_job.failure_statuses %} -
- -

{{ import_job.error_message }}

-
+ {% if import_job.import_status not in import_job.results_statuses %}
- - {{ import_job.traceback | linebreaks }} + + {% include "admin/import_export_extensions/progress_bar.html" with job_url=import_job_url %}
{% endif %}
diff --git a/import_export_extensions/templates/admin/import_export_extensions/progress_bar.html b/import_export_extensions/templates/admin/import_export_extensions/progress_bar.html new file mode 100644 index 0000000..3c763a5 --- /dev/null +++ b/import_export_extensions/templates/admin/import_export_extensions/progress_bar.html @@ -0,0 +1,3 @@ +{% load i18n %} + + diff --git a/test_project/urls.py b/test_project/urls.py index cc9051d..413e23c 100644 --- a/test_project/urls.py +++ b/test_project/urls.py @@ -28,14 +28,6 @@ if settings.DEBUG: import debug_toolbar - urlpatterns += static( - settings.MEDIA_URL, - document_root=settings.MEDIA_ROOT, - ) - urlpatterns += static( - settings.STATIC_URL, - document_root=settings.STATIC_ROOT, - ) urlpatterns += [ path( "api/schema/", @@ -49,3 +41,12 @@ ), path("__debug__/", include(debug_toolbar.urls)), ] + + urlpatterns += static( + settings.MEDIA_URL, + document_root=settings.MEDIA_ROOT, + ) + urlpatterns += static( + settings.STATIC_URL, + document_root=settings.STATIC_ROOT, + )