diff --git a/dashboard_viewer/dashboard_viewer/settings.py b/dashboard_viewer/dashboard_viewer/settings.py index f80c7bb3..9d8922a1 100644 --- a/dashboard_viewer/dashboard_viewer/settings.py +++ b/dashboard_viewer/dashboard_viewer/settings.py @@ -345,6 +345,23 @@ def locks_make_key(key, key_prefix, version): # noqa "Css for the img tag displaying the app logo", str, ), + "ALLOW_ONBOARDING_UPLOAD" :( + False, + "If Onboarding reports are allowed to be uploaded, which shows a button in the uploader page if true to allow these kind of files", + bool, + ), + "CAPTION_ONBOARDING" :( + "Drug Exposure Diagnostics results for selected ingredients. Executed with minCellCount = 5, sample = 1e+06, " + "earliestStartDate = 2010-01-01. # = Number of records. Type (n,%) = Frequency and percentage of available drug types." + "Route (n,%) = Frequency and percentage of available routes. Dose Form present n (%) = Frequency and percentage with dose form present." + "Fixed amount dose form n (%) = Frequency and percentage of missing denominator unit concept id. Amount distrib. [null or missing] = Distribution of amount (median q05-q95)," + "frequency and percentage of null or missing amount. Quantity distrib. [null or missing] = Distribution of quantity (median q05-q95), frequency and percentage of null or missing quantity." + "Exposure days distrib. [null or missing] = Distribution of exposure days (median q05-q95), frequency and percentage of null days_supply or missing exposure dates." + "Neg. Days n (%) = Frequency and percentage of negative exposure days.", + "Caption Text for the table in the Onboarding Report Page", + "markdown", + ), + } CONSTANCE_CONFIG_FIELDSETS = OrderedDict( @@ -356,9 +373,10 @@ def locks_make_key(key, key_prefix, version): # noqa "UPLOADER_EXECUTE_EXPORT_PACKAGE", "UPLOADER_UPLOAD", "UPLOADER_AUTO_UPDATE", + "CAPTION_ONBOARDING" ), ), - ("Uploader Settings", ("UPLOADER_ALLOW_EDIT_DRAFT_STATUS",)), + ("Uploader Settings", ("UPLOADER_ALLOW_EDIT_DRAFT_STATUS", "ALLOW_ONBOARDING_UPLOAD")), ( "Superset", ("SUPERSET_HOST", "DATABASE_DASHBOARD_IDENTIFIER", "DATABASE_FILTER_ID"), diff --git a/dashboard_viewer/uploader/forms.py b/dashboard_viewer/uploader/forms.py index 67daaee3..5cef36af 100644 --- a/dashboard_viewer/uploader/forms.py +++ b/dashboard_viewer/uploader/forms.py @@ -33,4 +33,10 @@ class Meta(SourceForm.Meta): class AchillesResultsForm(forms.Form): - results_file = forms.FileField() + if constance.config.ALLOW_ONBOARDING_UPLOAD: + results_file = forms.FileField(required=False, label='Catalogue Export File') + else: + results_file = forms.FileField() + +class OnboardingReportForm(forms.Form): + onboarding_results_file = forms.FileField(required=False, label='Onboarding Report file (Optional)') \ No newline at end of file diff --git a/dashboard_viewer/uploader/migrations/0014_onboardingreport.py b/dashboard_viewer/uploader/migrations/0014_onboardingreport.py new file mode 100644 index 00000000..685386ad --- /dev/null +++ b/dashboard_viewer/uploader/migrations/0014_onboardingreport.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.13 on 2024-03-27 12:05 + +from django.db import migrations, models +import django.db.models.deletion +import uploader.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('uploader', '0013_auto_20210721_1715'), + ] + + operations = [ + migrations.CreateModel( + name='OnBoardingReport', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uploaded_file', models.FileField(null=True, upload_to=uploader.models.onboarding_folder)), + ('data_source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='uploader.datasource')), + ], + options={ + 'db_table': 'onboarding_report', + }, + ), + ] diff --git a/dashboard_viewer/uploader/migrations/0015_onboardingreport_upload_date.py b/dashboard_viewer/uploader/migrations/0015_onboardingreport_upload_date.py new file mode 100644 index 00000000..83021284 --- /dev/null +++ b/dashboard_viewer/uploader/migrations/0015_onboardingreport_upload_date.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.13 on 2024-03-28 12:35 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('uploader', '0014_onboardingreport'), + ] + + operations = [ + migrations.AddField( + model_name='onboardingreport', + name='upload_date', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + ] diff --git a/dashboard_viewer/uploader/models.py b/dashboard_viewer/uploader/models.py index fc247d35..149ecc2c 100644 --- a/dashboard_viewer/uploader/models.py +++ b/dashboard_viewer/uploader/models.py @@ -175,6 +175,15 @@ def success_data_source_directory(instance, filename): return datetime.datetime.now().strftime(file_path) +def onboarding_folder(instance, filename): + file_path = os.path.join( + settings.ACHILLES_RESULTS_STORAGE_PATH, + instance.data_source.hash, + "onboarding", + "%Y%m%d%H%M%S%f" + "".join(pathlib.Path(filename).suffixes), + ) + return datetime.datetime.now().strftime(file_path) + class UploadHistory(models.Model): """ @@ -266,3 +275,16 @@ class Meta: p25_value = models.FloatField(null=True) p75_value = models.FloatField(null=True) p90_value = models.FloatField(null=True) + +class OnboardingReport(models.Model): + class Meta: + db_table = "onboarding_report" + + data_source = models.ForeignKey(DataSource, on_delete=models.CASCADE) + upload_date = models.DateTimeField(auto_now_add=True) + uploaded_file = models.FileField( + null=True, upload_to=onboarding_folder + ) + + def get_status(self): + return "Done" \ No newline at end of file diff --git a/dashboard_viewer/uploader/static/js/uploader.js b/dashboard_viewer/uploader/static/js/uploader.js index cb0f8df5..bd8340c7 100644 --- a/dashboard_viewer/uploader/static/js/uploader.js +++ b/dashboard_viewer/uploader/static/js/uploader.js @@ -26,8 +26,10 @@ document.addEventListener("DOMContentLoaded", () => { const tbody = tbodys[0]; for (const tr of tbody.children) { - const status_td = tr.children[5]; - + const numberOfColumns = tr.children.length; + const status_td = tr.children[numberOfColumns-1]; + + if (status_td.dataset.failed === "yes") { add_failure_message_popup(status_td, status_td.dataset.failureMsg); } @@ -37,10 +39,10 @@ document.addEventListener("DOMContentLoaded", () => { .then(r => r.json()) .then(r => { if (r.status === "Done") { - tr.children[1].innerText = r.data.r_package_version; - tr.children[2].innerText = r.data.generation_date; - tr.children[3].innerText = r.data.cdm_version; - tr.children[4].innerText = r.data.vocabulary_version; + tr.children[numberOfColumns - 5].innerText = r.data.r_package_version; + tr.children[numberOfColumns - 4].innerText = r.data.generation_date; + tr.children[numberOfColumns - 3].innerText = r.data.cdm_version; + tr.children[numberOfColumns - 2].innerText = r.data.vocabulary_version; update_upload_status(status_td, "Done", "fas fa-check", "status-done"); diff --git a/dashboard_viewer/uploader/templates/onboarding_report.html b/dashboard_viewer/uploader/templates/onboarding_report.html new file mode 100644 index 00000000..da3912a8 --- /dev/null +++ b/dashboard_viewer/uploader/templates/onboarding_report.html @@ -0,0 +1,80 @@ +{% extends 'base.html' %} +{% load static %} +{% load bootstrap4 %} +{% load markdownify %} + +{% block head_tail %} + {{ form.media.css }} + + + +{% endblock %} + + +{% block content %} +
+ {% include "header.html" %} + + {# Achilles resutls file form #} +
+
+

Data Source: {{ obj_data_source.name }}

+
+
+
+

Database type: {{ obj_data_source.database_type }}

+
+
+

Country: {{ obj_data_source.country }}

+
+
+

Release date: {{ obj_data_source.release_date }}

+
+
+ +
+

Onboarding Report

+
+ {% if body|length > 0 %} + + + + + {% for header in headers %} + + {% endfor %} + + + + {% for list in body %} + + {% for el in list %} + + {% endfor %} + + {% endfor %} + +
{{ constance_config.CAPTION_ONBOARDING|markdownify }}
{{ header }}
{{ el }}
+ {% else %} +

Onboarding report is not available.

+ {% endif %} +
+
+
+{% endblock %} +{% block body_before_bootstrap %} + +{% endblock %} \ No newline at end of file diff --git a/dashboard_viewer/uploader/templates/upload_achilles_results.html b/dashboard_viewer/uploader/templates/upload_achilles_results.html index ce14b80b..6733e71b 100644 --- a/dashboard_viewer/uploader/templates/upload_achilles_results.html +++ b/dashboard_viewer/uploader/templates/upload_achilles_results.html @@ -29,7 +29,7 @@

Upload new database characteristics

For more information see the CatalogueExport R-package - + {%if constance_config.ALLOW_ONBOARDING_UPLOAD %}
You can also upload an Onboarding Report {% endif %} {% endblock %} @@ -43,6 +43,9 @@

Upload history

+ {% if constance_config.ALLOW_ONBOARDING_UPLOAD %} + + {% endif %} @@ -52,8 +55,11 @@

Upload history

- {% for up_hi, status in upload_history %} + {% for up_hi, status, type in upload_history %} + {% if constance_config.ALLOW_ONBOARDING_UPLOAD %} + + {% endif %} diff --git a/dashboard_viewer/uploader/templates/uploader_base.html b/dashboard_viewer/uploader/templates/uploader_base.html index 59f4e252..8efe3ffd 100644 --- a/dashboard_viewer/uploader/templates/uploader_base.html +++ b/dashboard_viewer/uploader/templates/uploader_base.html @@ -36,7 +36,18 @@ {% block title %}{% endblock %} - {% bootstrap_form form %} + {% if constance_config.ALLOW_ONBOARDING_UPLOAD and onboarding_form %} +
+
+ {% bootstrap_form form %} +
+
+ {% bootstrap_form onboarding_form %} +
+
+ {% else %} + {% bootstrap_form form %} + {% endif %} {% buttons %}
TypeUpload Date R Package Version Generation Date
{{ type }}{{ up_hi.upload_date }} {% if up_hi.r_package_version %}{{ up_hi.r_package_version }}{% else %}--{% endif %} {% if up_hi.generation_date %}{{ up_hi.generation_date }}{% else %}--{% endif %}