From c3af3f8f8cb7f4a84ad97ba38647b710deb876be Mon Sep 17 00:00:00 2001
From: autodeploy <benoit@startinblox.com>
Date: Fri, 21 Jun 2024 16:57:41 +0200
Subject: [PATCH] fix: avoid recalling multiple times the same URI

---
 .../commands/generate_static_content.py       | 55 +++++++++++--------
 1 file changed, 32 insertions(+), 23 deletions(-)

diff --git a/djangoldp/management/commands/generate_static_content.py b/djangoldp/management/commands/generate_static_content.py
index 2cce19e3..45648582 100644
--- a/djangoldp/management/commands/generate_static_content.py
+++ b/djangoldp/management/commands/generate_static_content.py
@@ -9,6 +9,7 @@ from urllib.parse import urlparse, urlunparse
 base_uri = getattr(settings, 'BASE_URL', '')
 max_depth = getattr(settings, 'MAX_RECURSION_DEPTH', 5)
 request_timeout = getattr(settings, 'SSR_REQUEST_TIMEOUT', 10)
+regenerated_urls = []
 
 class Command(BaseCommand):
     help = 'Generate static content for models having the static_version meta attribute set to 1/true'
@@ -18,7 +19,6 @@ class Command(BaseCommand):
         if not os.path.exists(output_dir):
           os.makedirs(output_dir, exist_ok=True)
 
-
         for model in apps.get_models():
             if hasattr(model._meta, 'static_version'):
                 print(f"Generating content for model: {model}")
@@ -26,29 +26,33 @@ class Command(BaseCommand):
                 url = f'{base_uri}{container_path}'
                 print(f"Current request url before adding params: {url}")
 
-                if hasattr(model._meta, 'static_params'):
-                    # static_params are added to the url as query parameters
-                    url += '?'
-                    for key, value in model._meta.static_params.items():
-                        url += f'{key}={value}&'
-                    url = url[:-1]
-
-                print(f"Current request url after adding params: {url}")
-                response = requests.get(url, timeout=request_timeout)
-
-                if response.status_code == 200:
-                    content = response.text
-                    content = self.update_ids_and_fetch_associated(content, base_uri,  output_dir, 0, max_depth)
-
-                    filename = container_path[1:-1]
-                    file_path = os.path.join(output_dir, f'{filename}.jsonld')
-
-                    print(f"Output file_path: {file_path}")
-                    with open(file_path, 'w') as f:
-                        f.write(content)
-                    self.stdout.write(self.style.SUCCESS(f'Successfully fetched and saved content for {model._meta.model_name} from {url}'))
+                if (url not in regenerated_urls):
+                  if hasattr(model._meta, 'static_params'):
+                      # static_params are added to the url as query parameters
+                      url += '?'
+                      for key, value in model._meta.static_params.items():
+                          url += f'{key}={value}&'
+                      url = url[:-1]
+
+                  print(f"Current request url after adding params: {url}")
+                  response = requests.get(url, timeout=request_timeout)
+
+                  if response.status_code == 200:
+                      content = response.text
+                      content = self.update_ids_and_fetch_associated(content, base_uri,  output_dir, 0, max_depth)
+
+                      filename = container_path[1:-1]
+                      file_path = os.path.join(output_dir, f'{filename}.jsonld')
+
+                      print(f"Output file_path: {file_path}")
+                      with open(file_path, 'w') as f:
+                          f.write(content)
+                      self.stdout.write(self.style.SUCCESS(f'Successfully fetched and saved content for {model._meta.model_name} from {url}'))
+                      regenerated_urls.append(url)
+                  else:
+                      self.stdout.write(self.style.ERROR(f'Failed to fetch content from {url}: {response.status_code}'))
                 else:
-                    self.stdout.write(self.style.ERROR(f'Failed to fetch content from {url}: {response.status_code}'))
+                  self.stdout.write(self.style.WARNING(f'Skipping {url} as it has already been fetched'))
 
     def update_ids_and_fetch_associated(self, content, base_uri, output_dir, depth, max_depth):
         if depth > max_depth:
@@ -80,6 +84,10 @@ class Command(BaseCommand):
             if not os.path.exists(associated_file_dir):
                 os.makedirs(associated_file_dir)
 
+            if associated_url in regenerated_urls:
+                self.stdout.write(self.style.WARNING(f'Skipping {associated_url} as it has already been fetched'))
+                return
+
             try:
                 response = requests.get(associated_url, timeout=request_timeout)
                 if response.status_code == 200:
@@ -90,6 +98,7 @@ class Command(BaseCommand):
                         os.makedirs(associated_file_dir)
                     with open(associated_file_path, 'w') as f:
                         f.write(associated_content)
+                    regenerated_urls.append(associated_url)
                     self.stdout.write(self.style.SUCCESS(f'Successfully fetched and saved associated content for {associated_url}'))
                 else:
                     self.stdout.write(self.style.ERROR(f'Failed to fetch associated content from {associated_url}: {response.status_code}'))
-- 
GitLab