@@ -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