diff --git a/djangoldp/management/commands/generate_static_content.py b/djangoldp/management/commands/generate_static_content.py index 2f89d136a7f4b7576d9c54c4890c8a42198e8327..7720da33f0cb69fa95ae2a17e10d809d722c89ee 100644 --- a/djangoldp/management/commands/generate_static_content.py +++ b/djangoldp/management/commands/generate_static_content.py @@ -15,6 +15,7 @@ class StaticContentGenerator: self.request_timeout = getattr(settings, 'SSR_REQUEST_TIMEOUT', 10) self.regenerated_urls = set() self.output_dir = 'ssr' + self.output_dir_filtered = 'ssr_filtered' def generate_content(self): self._create_output_directory() @@ -23,6 +24,7 @@ class StaticContentGenerator: def _create_output_directory(self): os.makedirs(self.output_dir, exist_ok=True) + os.makedirs(self.output_dir_filtered, exist_ok=True) def _get_static_models(self): return [model for model in apps.get_models() if hasattr(model._meta, 'static_version')] @@ -31,31 +33,37 @@ class StaticContentGenerator: self.stdout.write(f"Generating content for model: {model}") url = self._build_url(model) if url not in self.regenerated_urls: - self._fetch_and_save_content(model, url) + 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: + 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')) - def _build_url(self, model): + def _build_url(self, model, use_static_params=True): container_path = model.get_container_path() url = urljoin(self.base_uri, container_path) - if hasattr(model._meta, 'static_params'): + if hasattr(model._meta, 'static_params') and use_static_params: url += '?' + '&'.join(f'{k}={v}' for k, v in model._meta.static_params.items()) return url - def _fetch_and_save_content(self, model, url): + def _fetch_and_save_content(self, model, url, output_dir): try: response = requests.get(url, timeout=self.request_timeout) if response.status_code == 200: content = self._update_ids_and_fetch_associated(response.text) - self._save_content(model, url, content) + self._save_content(model, url, content, output_dir) else: self.stdout.write(self.style.ERROR(f'Failed to fetch content from {url}: HTTP {response.status_code}')) except requests.exceptions.RequestException as e: self.stdout.write(self.style.ERROR(f'Error fetching content from {url}: {str(e)}')) - def _save_content(self, model, url, content): + def _save_content(self, model, url, content, output_dir): relative_path = urlparse(url).path.strip('/') - file_path = os.path.join(self.output_dir, relative_path) + file_path = os.path.join(output_dir, relative_path) if file_path.endswith('/'): file_path = file_path[:-1] if not file_path.endswith('.jsonld'): @@ -116,18 +124,19 @@ class StaticContentGenerator: def _rewrite_ids_before_saving(self, data): if isinstance(data, dict): if '@id' in data: + original_id = data['@id'] parsed_url = urlparse(data['@id']) if not parsed_url.netloc: - content_id = urljoin(self.base_uri, content_id) + content_id = urljoin(self.base_uri, original_id) parsed_url = urlparse(content_id) - if not 'ssr/' in data['@id']: - path = parsed_url.path - if path.startswith(urlparse(self.base_uri).path): - path = path[len(urlparse(self.base_uri).path):] + if 'ssr/' not in data['@id']: + path = parsed_url.path + if path.startswith(urlparse(self.base_uri).path): + path = path[len(urlparse(self.base_uri).path):] - new_id = f'/ssr{path}' - data['@id'] = urljoin(self.base_uri, new_id) + new_id = f'/ssr{path}' + data['@id'] = urljoin(self.base_uri, new_id) for value in data.values(): if isinstance(value, (dict, list)): self._rewrite_ids_before_saving(value) diff --git a/djangoldp/views.py b/djangoldp/views.py index f45e362fd3527be96a8bfc1b0dd2d7dbdf7e33cc..fe7d20413a21d00fc41f77c67d51467bdaf8bf92 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -634,11 +634,16 @@ def serve_static_content(request, path): server_url = getattr(settings, "BASE_URL", "http://localhost") + is_filtered = request.GET.get('search-fields', False) + output_dir = "ssr" + output_dir_filtered = "ssr_filtered" if not os.path.exists(output_dir): os.makedirs(output_dir, exist_ok=True) + if not os.path.exists(output_dir_filtered): + os.makedirs(output_dir_filtered, exist_ok=True) - file_path = os.path.join(output_dir, path[:-1]) + file_path = os.path.join(output_dir if not is_filtered else output_dir_filtered, path[:-1]) if not file_path.endswith(".jsonld"): file_path += ".jsonld"