From b97b7d8975d9b0843e2fd84e00630b67b2ca291a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:04:39 +0000 Subject: [PATCH 1/2] Initial plan From c482377b8cb5eb6fd8e3ee1cdf3ebbdd7bd37084 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:18:46 +0000 Subject: [PATCH 2/2] Add file field, generate_report(), and finish_validations() to XMLErrorReport; update template to show error reports in downloads table Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com> --- upload/migrations/0011_xmlerrorreport_file.py | 23 +++++++++++ upload/models.py | 39 +++++++++++++++++++ .../modeladmin/upload/package/inspect.html | 11 ++++++ 3 files changed, 73 insertions(+) create mode 100644 upload/migrations/0011_xmlerrorreport_file.py diff --git a/upload/migrations/0011_xmlerrorreport_file.py b/upload/migrations/0011_xmlerrorreport_file.py new file mode 100644 index 000000000..e6eee3347 --- /dev/null +++ b/upload/migrations/0011_xmlerrorreport_file.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.3 + +import upload.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("upload", "0010_alter_package_category_alter_package_status"), + ] + + operations = [ + migrations.AddField( + model_name="xmlerrorreport", + name="file", + field=models.FileField( + blank=True, + null=True, + upload_to=upload.models.upload_package_directory_path, + verbose_name="Report File", + ), + ), + ] diff --git a/upload/models.py b/upload/models.py index 8d241eae9..0b1bd5b59 100644 --- a/upload/models.py +++ b/upload/models.py @@ -1960,11 +1960,15 @@ class XMLErrorReport(BaseValidationReport, ClusterableModel): null=True, default=False, ) + file = models.FileField( + _("Report File"), upload_to=upload_package_directory_path, null=True, blank=True + ) panels = ( [] + BaseValidationReport.panels + [ + FieldPanel("file"), # FieldPanel("package"), InlinePanel("xml_error", label=_("XML error")), FieldPanel("xml_producer_ack"), @@ -1989,6 +1993,41 @@ class Meta: def validation_results(self): return self.xml_error + def save_file(self, filename, content): + try: + self.file.delete(save=True) + except Exception as e: + pass + self.file.save(filename, ContentFile(content)) + + def generate_report(self): + item = self.validation_results.first() + + if not item: + return + + fieldnames = ["package"] + fieldnames.extend(XMLError.cols) + + filename = self.package.name + f"-{report_datetime()}-xml_errors.csv" + with TemporaryDirectory() as targetdir: + target = os.path.join(targetdir, filename) + + with open(target, "w", newline="") as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=fieldnames) + writer.writeheader() + + for row in self.ValidationResultClass.rows(self.package, fieldnames): + writer.writerow(row) + + with open(target, "rb") as fp: + self.save_file(filename, fp.read()) + + def finish_validations(self): + self.generate_report() + self.creation = choices.REPORT_CREATION_DONE + self.save() + @property def data(self): d = super().data diff --git a/upload/templates/modeladmin/upload/package/inspect.html b/upload/templates/modeladmin/upload/package/inspect.html index fca5a9f96..c6edea6b5 100644 --- a/upload/templates/modeladmin/upload/package/inspect.html +++ b/upload/templates/modeladmin/upload/package/inspect.html @@ -179,6 +179,17 @@