Skip to content

Commit 9796e9e

Browse files
committed
feat(projects): add check for finding next relevant page
Signed-off-by: David Wallace <[email protected]>
1 parent 1eadee5 commit 9796e9e

File tree

1 file changed

+36
-12
lines changed

1 file changed

+36
-12
lines changed

rdmo/projects/viewsets.py

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -522,27 +522,51 @@ def dispatch(self, *args, **kwargs):
522522
def retrieve(self, request, *args, **kwargs):
523523
page = self.get_object()
524524
conditions = page.conditions.select_related('source', 'target_option')
525-
526525
values = self.project.values.filter(snapshot=None).select_related('attribute', 'option')
527526

527+
# Check if the current page meets conditions
528528
if check_conditions(conditions, values):
529529
serializer = self.get_serializer(page)
530530
return Response(serializer.data)
531531
else:
532-
if request.GET.get('back') == 'true':
533-
prev_page = self.project.catalog.get_prev_page(page)
534-
if prev_page is not None:
535-
url = reverse('v1-projects:project-page-detail',
536-
args=[self.project.id, prev_page.id]) + '?back=true'
537-
return HttpResponseRedirect(url, status=303)
532+
# Determine the direction of navigation (back or forward)
533+
direction = 'prev' if request.GET.get('back') == 'true' else 'next'
534+
next_page = self._find_next_relevant_page(page, direction)
535+
536+
if next_page:
537+
url = reverse('v1-projects:project-page-detail', args=[self.project.id, next_page.id])
538+
if direction == 'prev':
539+
url += '?back=true'
540+
return HttpResponseRedirect(url, status=303)
541+
542+
# If no next relevant page is found, end of catalog
543+
return Response(status=204)
544+
545+
def _find_next_relevant_page(self, page, direction):
546+
"""
547+
Helper method to find the next page that meets conditions.
548+
:param page: current page object
549+
:param direction: 'next' or 'prev' direction for navigation
550+
:return: next relevant page or None if no further page meets conditions
551+
"""
552+
while True:
553+
if direction == 'prev':
554+
next_page = self.project.catalog.get_prev_page(page)
538555
else:
539556
next_page = self.project.catalog.get_next_page(page)
540-
if next_page is not None:
541-
url = reverse('v1-projects:project-page-detail', args=[self.project.id, next_page.id])
542-
return HttpResponseRedirect(url, status=303)
543557

544-
# indicate end of catalog
545-
return Response(status=204)
558+
# Break the loop if no more pages are available
559+
if not next_page:
560+
return None
561+
562+
# Check if the next page meets conditions
563+
conditions = next_page.conditions.select_related('source', 'target_option')
564+
values = self.project.values.filter(snapshot=None).select_related('attribute', 'option')
565+
if check_conditions(conditions, values):
566+
return next_page # Found the final target page
567+
568+
# Move to the next page in the loop
569+
page = next_page
546570

547571
@action(detail=False, url_path='continue', permission_classes=(HasModelPermission | HasProjectPagePermission, ))
548572
def get_continue(self, request, pk=None, parent_lookup_project=None):

0 commit comments

Comments
 (0)