|
21 | 21 |
|
22 | 22 | from rdmo.conditions.models import Condition |
23 | 23 | from rdmo.core.permissions import HasModelPermission |
24 | | -from rdmo.core.utils import human2bytes, return_file_response |
| 24 | +from rdmo.core.utils import human2bytes, is_truthy, return_file_response |
25 | 25 | from rdmo.options.models import OptionSet |
26 | 26 | from rdmo.questions.models import Catalog, Page, Question, QuestionSet |
27 | 27 | from rdmo.tasks.models import Task |
|
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, |
@@ -541,29 +548,31 @@ def dispatch(self, *args, **kwargs): |
541 | 548 |
|
542 | 549 | def retrieve(self, request, *args, **kwargs): |
543 | 550 | page = self.get_object() |
544 | | - conditions = page.conditions.select_related('source', 'target_option') |
545 | | - |
| 551 | + catalog = self.project.catalog |
546 | 552 | values = self.project.values.filter(snapshot=None).select_related('attribute', 'option') |
547 | 553 |
|
548 | | - if check_conditions(conditions, values): |
| 554 | + sets = compute_sets(values) |
| 555 | + resolved_conditions = resolve_conditions(catalog, values, sets) |
| 556 | + |
| 557 | + # check if the current page meets conditions |
| 558 | + if compute_show_page(page, resolved_conditions): |
549 | 559 | serializer = self.get_serializer(page) |
550 | 560 | return Response(serializer.data) |
551 | 561 | else: |
552 | | - if request.GET.get('back') == 'true': |
553 | | - prev_page = self.project.catalog.get_prev_page(page) |
554 | | - if prev_page is not None: |
555 | | - url = reverse('v1-projects:project-page-detail', |
556 | | - args=[self.project.id, prev_page.id]) + '?back=true' |
557 | | - return HttpResponseRedirect(url, status=303) |
558 | | - else: |
559 | | - next_page = self.project.catalog.get_next_page(page) |
560 | | - if next_page is not None: |
561 | | - url = reverse('v1-projects:project-page-detail', args=[self.project.id, next_page.id]) |
562 | | - return HttpResponseRedirect(url, status=303) |
563 | | - |
564 | | - # indicate end of catalog |
| 562 | + # determine the direction of navigation (previous or next) |
| 563 | + direction = 'prev' if is_truthy(request.GET.get('back')) else 'next' |
| 564 | + |
| 565 | + # find the next relevant page with from pages and resolved conditions |
| 566 | + next_relevant_page = compute_next_relevant_page(page, direction, catalog, resolved_conditions) |
| 567 | + |
| 568 | + if next_relevant_page is not None: |
| 569 | + url = reverse('v1-projects:project-page-detail', args=[self.project.id, next_relevant_page.id]) |
| 570 | + return HttpResponseRedirect(url, status=303) |
| 571 | + |
| 572 | + # end of catalog, if no next relevant page is found |
565 | 573 | return Response(status=204) |
566 | 574 |
|
| 575 | + |
567 | 576 | @action(detail=False, url_path='continue', permission_classes=(HasModelPermission | HasProjectPagePermission, )) |
568 | 577 | def get_continue(self, request, pk=None, parent_lookup_project=None): |
569 | 578 | try: |
|
0 commit comments