Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/stepper refinement #700

Open
wants to merge 29 commits into
base: major/4
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
f6803fe
feat: remove stepper from creation & simplifiy
EdoStorm96 Sep 11, 2024
2b67e08
feat: preassessment flow
EdoStorm96 Sep 11, 2024
262a2f2
fix: clean up some wmo funk
EdoStorm96 Sep 11, 2024
47fcb81
fix: bug in ProposalTypeChecker
EdoStorm96 Sep 11, 2024
b843c22
feat: PreApproved flow
EdoStorm96 Sep 11, 2024
18555b1
feat: WmoApplicationChecker
EdoStorm96 Sep 11, 2024
30b94a9
feat: make wmostatus waiting block on preAss (?)
EdoStorm96 Sep 11, 2024
6dc61ae
fix: fix on url for wmoapplicationchecker
EdoStorm96 Sep 11, 2024
5bd7246
feat: simple workaround for disabled styling
EdoStorm96 Sep 12, 2024
5e0b405
fix: remove pointless init i found
EdoStorm96 Sep 12, 2024
446e388
fix: remove other pointless init
EdoStorm96 Sep 12, 2024
6ec1e40
feat: let stepper do validation
EdoStorm96 Sep 12, 2024
36e0477
feat: method to validate sessions and tasks
EdoStorm96 Sep 12, 2024
e09b50f
feat: improve sessionEndForm.clean()
EdoStorm96 Sep 12, 2024
c87b1e7
feat: turn WmoChecker into ModelFormChecker
EdoStorm96 Sep 12, 2024
71cbd12
feat: implement some more css
EdoStorm96 Sep 12, 2024
09f850f
fix: remove unused function
EdoStorm96 Sep 12, 2024
b147936
style: paint it black
EdoStorm96 Sep 12, 2024
69a2537
fix: improve disabled stepper item
EdoStorm96 Sep 17, 2024
1aa20a3
fix: stepper logic on proposal_form
EdoStorm96 Sep 17, 2024
55b1387
fix: logic for ContainerItem css_classes
EdoStorm96 Sep 17, 2024
56ae70a
fix: improve working of validate_proposal.py
EdoStorm96 Sep 17, 2024
06d081b
fix: minor fix for order of get_form_errors
EdoStorm96 Sep 17, 2024
a33de8d
feat: remove containerItems & reordering
EdoStorm96 Sep 18, 2024
8a103a6
feat: make stepper do validation
EdoStorm96 Sep 18, 2024
83f37fa
feat: allow for custom errors from checker
EdoStorm96 Sep 18, 2024
3e20a88
feat: get_checker_errors for SessionsChecker
EdoStorm96 Sep 18, 2024
d902caf
style: formatting
EdoStorm96 Sep 18, 2024
3d74064
fix: ensure get_cheker_errors outputs iterable
EdoStorm96 Sep 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions proposals/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -881,9 +881,6 @@ class Meta:

_soft_validation_fields = ["translated_forms", "translated_forms_languages"]

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

def clean(self):
cleaned_data = super(TranslatedConsentForms, self).clean()

Expand Down
8 changes: 8 additions & 0 deletions proposals/templates/proposals/proposal_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@
{% trans "Algemene informatie over de aanvraag" %} - {{ block.super }}
{% endblock %}

{% block stepper %}
{% if create %}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A simple if stepper would be better IMO.

<!--No stepper on creation-->
{% else %}
{% include stepper %}
{% endif %}
{% endblock %}

{% block html_head %}
{{ block.super }}
<script>
Expand Down
256 changes: 163 additions & 93 deletions proposals/utils/checkers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from django.urls import reverse

from proposals import forms as proposal_forms
from proposals.models import Wmo
from studies import forms as study_forms
from interventions import forms as intervention_forms
from observations import forms as observation_forms
Expand All @@ -26,14 +27,19 @@ class ProposalTypeChecker(
):

def check(self):
# TODO: check stepper.proposal_type_hint
# and proposal.is_pre_approved etc. for non-standard layouts
return self.regular_proposal()

def regular_proposal(self):
from .stepper import RegularProposalLayout
"""Each proposal type receives a specific create checker and layout"""
from .stepper import (
RegularProposalLayout,
PreApprProposalLayout,
PreAssProposalLayout,
)

self.stepper.layout = RegularProposalLayout
if self.proposal.is_pre_approved:
self.stepper.layout = PreApprProposalLayout
elif self.proposal.is_pre_assessment:
self.stepper.layout = PreAssProposalLayout
else:
self.stepper.layout = RegularProposalLayout
return [ProposalCreateChecker]


Expand All @@ -51,56 +57,21 @@ class ProposalCreateChecker(
form_class = proposal_forms.ProposalForm

def get_url(self):
if self.proposal.pk:
return reverse(
"proposals:update",
args=[self.proposal.pk],
)
return reverse(
"proposals:create",
"proposals:update",
args=[self.proposal.pk],
)

def check(self):
self.parent = BasicDetailsItem(self.stepper)
self.stepper.items.append(self.parent)
if self.proposal.pk:
return self.proposal_exists()
return self.new_proposal()

def new_proposal(self):
self.stepper.items.append(self.make_stepper_item())
placeholders = [
PlaceholderItem(
self.stepper,
title=_("Onderzoeker"),
parent=self.parent,
),
PlaceholderItem(
self.stepper,
title=_("Andere onderzoekers"),
parent=self.parent,
),
PlaceholderItem(
self.stepper,
title=_("Financiering"),
parent=self.parent,
),
PlaceholderItem(
self.stepper,
title=_("Onderzoeksdoel"),
parent=self.parent,
),
]
self.stepper.items += placeholders
return []

def proposal_exists(self):
stepper_item = ModelFormItem(
self.stepper,
title=self.title,
parent=self.parent,
form_object=self.proposal,
form_class=self.form_class,
form_kwargs={},
url_func=self.get_url,
)
self.stepper.items.append(
Expand Down Expand Up @@ -139,6 +110,13 @@ class OtherResearchersChecker(

def check(self):
self.stepper.items.append(self.make_stepper_item())
if self.proposal.is_pre_assessment:
return [
GoalChecker(
self.stepper,
parent=self.parent,
)
]
return [
FundingChecker(
self.stepper,
Expand Down Expand Up @@ -183,6 +161,13 @@ class GoalChecker(

def check(self):
self.stepper.items.append(self.make_stepper_item())
if self.proposal.is_pre_approved:
return [
PreApprovedChecker(
self.stepper,
parent=self.parent,
)
]
return [WMOChecker]

def get_url(self):
Expand All @@ -192,79 +177,132 @@ def get_url(self):
)


class WMOItem(
StepperItem,
class PreApprovedChecker(
ModelFormChecker,
):

title = _("Eerdere toetsing")
form_class = proposal_forms.PreApprovedForm

def check(self):
self.stepper.items.append(self.make_stepper_item())
return [SubmitChecker]

def get_url(self):
return reverse(
"proposals:pre_approved",
args=(self.proposal.pk,),
)


class WMOChecker(ModelFormChecker):

title = "WMO"
form_class = proposal_forms.WmoForm
location = "wmo"
title = _("WMO")

def __init__(
def check(
self,
*args,
**kwargs,
):
super().__init__(*args, **kwargs)
self.proposal = self.stepper.proposal
self.wmo = self.get_wmo()
self.item = self.make_stepper_item()
self.stepper.items.append(
self.item,
)
if self.object_exists():
return self.check_wmo()
else:
return []

def get_wmo(
def check_wmo(
self,
):
if hasattr(
self.proposal,
"wmo",
):
return self.proposal.wmo
return None
"""
This method should check the correctness of the
WMO object.
"""
if self.proposal.wmo.status != Wmo.WMOStatuses.NO_WMO:
return [
WMOApplicationChecker(
self.stepper,
parent=self.item,
)
]
if self.proposal.is_pre_assessment:
return [SubmitChecker]
return [TrajectoriesChecker]

def get_url(
self,
):
if self.wmo:
return reverse(
"proposals:wmo_update",
args=[self.wmo.pk],
)
def get_url(self):
if self.object_exists():
return self.get_update_url()
else:
return reverse(
"proposals:wmo_create",
args=[self.proposal.pk],
)
return self.get_create_url()

def wmo_exists(
def object_exists(
self,
):
return hasattr(
self.proposal,
"wmo",
)

def get_create_url(
self,
):
if self.proposal.is_pre_assessment:
url = "proposals:wmo_create_pre"
else:
url = "proposals:wmo_create"
return reverse(
url,
args=[self.proposal.pk],
)

class WMOChecker(
Checker,
):

def check(
def get_update_url(
self,
):
self.item = WMOItem(self.stepper)
self.stepper.items.append(self.item)
if self.item.wmo:
return self.check_wmo()
if self.proposal.is_pre_assessment:
url = "proposals:wmo_update_pre"
else:
return []
url = "proposals:wmo_update"
return reverse(
url,
args=[self.proposal.wmo.pk],
)

def check_wmo(
def get_form_object(
self,
):
"""
This method should check the correctness of the
WMO object.
"""
# Just assume any WMO is correct as long as it exists
if self.item.wmo:
return [TrajectoriesChecker]
return [] # TODO next item
if self.object_exists():
return self.proposal.wmo
else:
return None


class WMOApplicationChecker(ModelFormChecker):

title = _("WMO applicatie")
form_class = proposal_forms.WmoApplicationForm

def check(self):
self.stepper.items.append(self.make_stepper_item())
if self.proposal.wmo.status == Wmo.WMOStatuses.WAITING:
return []
if self.proposal.is_pre_assessment:
return [SubmitChecker]
return [TrajectoriesChecker]

def get_url(self):
if self.proposal.is_pre_assessment:
pre_suffix = "_pre"
else:
pre_suffix = ""
return reverse(
f"proposals:wmo_application{pre_suffix}",
args=(self.proposal.wmo.pk,),
)

def get_form_object(self):
return self.proposal.wmo


class TrajectoriesChecker(
Expand Down Expand Up @@ -314,6 +352,11 @@ def get_url(
args=[self.proposal.pk],
)

def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["proposal"] = self.proposal
return kwargs


class StudyChecker(
Checker,
Expand Down Expand Up @@ -419,6 +462,14 @@ def get_url(
],
)

def get_form_object(self):
return self.study

def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["proposal"] = self.proposal
return kwargs


class DesignChecker(
ModelFormChecker,
Expand Down Expand Up @@ -481,6 +532,9 @@ def get_url(
],
)

def get_form_object(self):
return self.study


class InterventionChecker(
UpdateOrCreateChecker,
Expand Down Expand Up @@ -517,6 +571,11 @@ def get_form_object(
):
return self.study.intervention

def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["study"] = self.study
return kwargs

def get_create_url(
self,
):
Expand Down Expand Up @@ -586,6 +645,11 @@ def get_form_object(
):
return self.study.observation

def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["study"] = self.study
return kwargs


class SessionsChecker(
ModelFormChecker,
Expand Down Expand Up @@ -826,3 +890,9 @@ def get_url(
self.stepper.proposal.pk,
],
)

def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["proposal"] = self.proposal
kwargs["request"] = self.stepper.request
return kwargs
Loading
Loading