|
42 | 42 | HasProjectProgressObjectPermission, |
43 | 43 | HasProjectsPermission, |
44 | 44 | ) |
45 | | -from .progress import compute_navigation, compute_progress |
| 45 | +from .progress import ( |
| 46 | + compute_navigation, |
| 47 | + compute_next_relevant_page, |
| 48 | + compute_progress, |
| 49 | + compute_sets, |
| 50 | + compute_show_page, |
| 51 | + resolve_conditions, |
| 52 | +) |
46 | 53 | from .serializers.v1 import ( |
47 | 54 | IntegrationSerializer, |
48 | 55 | InviteSerializer, |
@@ -521,29 +528,34 @@ def dispatch(self, *args, **kwargs): |
521 | 528 |
|
522 | 529 | def retrieve(self, request, *args, **kwargs): |
523 | 530 | page = self.get_object() |
524 | | - conditions = page.conditions.select_related('source', 'target_option') |
525 | | - |
| 531 | + catalog = self.project.catalog |
| 532 | + # conditions = page.conditions.select_related('source', 'target_option') |
526 | 533 | values = self.project.values.filter(snapshot=None).select_related('attribute', 'option') |
527 | 534 |
|
528 | | - if check_conditions(conditions, values): |
| 535 | + sets = compute_sets(values) |
| 536 | + resolved_conditions = resolve_conditions(catalog, values, sets) |
| 537 | + |
| 538 | + # Check if the current page meets conditions |
| 539 | + if compute_show_page(page, resolved_conditions): |
529 | 540 | serializer = self.get_serializer(page) |
530 | 541 | return Response(serializer.data) |
531 | 542 | 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) |
538 | | - else: |
539 | | - 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) |
543 | | - |
544 | | - # indicate end of catalog |
| 543 | + # Determine the direction of navigation (back or forward) |
| 544 | + direction = 'prev' if request.GET.get('back') == 'true' else 'next' |
| 545 | + |
| 546 | + # Find the next relevant page with precomputed values and conditions |
| 547 | + next_page = compute_next_relevant_page(page, direction, catalog, resolved_conditions) |
| 548 | + |
| 549 | + if next_page: |
| 550 | + url = reverse('v1-projects:project-page-detail', args=[self.project.id, next_page.id]) |
| 551 | + if direction == 'prev': |
| 552 | + url += '?back=true' |
| 553 | + return HttpResponseRedirect(url, status=303) |
| 554 | + |
| 555 | + # If no next relevant page is found, end of catalog |
545 | 556 | return Response(status=204) |
546 | 557 |
|
| 558 | + |
547 | 559 | @action(detail=False, url_path='continue', permission_classes=(HasModelPermission | HasProjectPagePermission, )) |
548 | 560 | def get_continue(self, request, pk=None, parent_lookup_project=None): |
549 | 561 | try: |
|
0 commit comments