From dd4f1587b0fadad7d9f8ef43ae69a5dfc3cf6168 Mon Sep 17 00:00:00 2001
From: Jean-Baptiste Pasquier <contact@jbpasquier.eu>
Date: Mon, 16 Sep 2024 09:24:19 +0200
Subject: [PATCH] feature: improve ssr, keep failures records

---
 djangoldp/management/commands/generate_static_content.py | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/djangoldp/management/commands/generate_static_content.py b/djangoldp/management/commands/generate_static_content.py
index 6ef2a90..dc5473a 100644
--- a/djangoldp/management/commands/generate_static_content.py
+++ b/djangoldp/management/commands/generate_static_content.py
@@ -14,6 +14,7 @@ class StaticContentGenerator:
         self.max_depth = getattr(settings, 'MAX_RECURSION_DEPTH', 5)
         self.request_timeout = getattr(settings, 'SSR_REQUEST_TIMEOUT', 10)
         self.regenerated_urls = set()
+        self.failed_urls = set()
         self.output_dir = 'ssr'
         self.output_dir_filtered = 'ssr_filtered'
 
@@ -32,13 +33,13 @@ class StaticContentGenerator:
     def _process_model(self, model):
         self.stdout.write(f"Generating content for model: {model}")
         url = self._build_url(model)
-        if url not in self.regenerated_urls:
+        if url not in self.regenerated_urls and url not in self.failed_urls:
             self._fetch_and_save_content(model, url, self.output_dir)
         else:
             self.stdout.write(self.style.WARNING(f'Skipping {url} as it has already been fetched'))
         if hasattr(model._meta, 'static_params'):
             url = self._build_url(model, True)
-            if url not in self.regenerated_urls:
+            if url not in self.regenerated_urls and url not in self.failed_urls:
                 self._fetch_and_save_content(model, url, self.output_dir_filtered)
             else:
                 self.stdout.write(self.style.WARNING(f'Skipping {url} as it has already been fetched'))
@@ -149,6 +150,9 @@ class StaticContentGenerator:
         if url in self.regenerated_urls:
             self.stdout.write(self.style.WARNING(f'Skipping {url} as it has already been fetched'))
             return
+        if url in self.failed_urls:
+            self.stdout.write(self.style.WARNING(f'Skipping {url} as it has already been tried and failed'))
+            return
 
         file_path = os.path.join(self.output_dir, new_path.strip('/'))
         if file_path.endswith('/'):
@@ -168,6 +172,7 @@ class StaticContentGenerator:
                 self.regenerated_urls.add(url)
                 self.stdout.write(self.style.SUCCESS(f'Successfully fetched and saved associated content from {url} to {file_path}'))
             else:
+                self.failed_urls.add(url)
                 self.stdout.write(self.style.ERROR(f'Failed to fetch associated content from {url}: HTTP {response.status_code}'))
         except requests.exceptions.RequestException as e:
             self.stdout.write(self.style.ERROR(f'Error fetching associated content from {url}: {str(e)}'))
-- 
GitLab