Skip to content

account_views

main.views.account_views ¤

Views for the account-related pages of the main app.

Classes¤

AccountOverviewView ¤

Bases: TermsAcceptedMixin, RedirectView

Route users to the appropriate account page based on their skills.

Methods:¤
get_redirect_url(*args, **kwargs) ¤

Redirect to skill profile if skills exist, otherwise self-assess.

Source code in main/views/account_views.py
115
116
117
118
119
def get_redirect_url(self, *args: Any, **kwargs: Any) -> str:
    """Redirect to skill profile if skills exist, otherwise self-assess."""
    if UserSkill.objects.filter(user=self.request.user).exists():
        return reverse("skills_profile")
    return reverse("self_assess")

AuthenticatedHttpRequest ¤

Bases: HttpRequest

Custom HttpRequest type for authenticated users.

SelfAssessPageView ¤

Bases: TermsAcceptedMixin, FormView[UserSkillsForm]

View that renders the self-assessment questionnaire page.

Methods:¤
form_valid(form) ¤

Handle valid form submission.

Source code in main/views/account_views.py
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
def form_valid(self, form: UserSkillsForm) -> HttpResponse:
    """Handle valid form submission."""
    created_skills, updated_skills = form.save(self.request.user)

    # Add success messages
    if created_skills:
        messages.success(
            self.request,
            f"Successfully created {len(created_skills)} new skill assessments.",
        )
    if updated_skills:
        messages.success(
            self.request,
            f"Successfully updated {len(updated_skills)} "
            f"existing skill assessments.",
        )

    return super().form_valid(form)
get_form_kwargs() ¤

Return the keyword arguments for instantiating the form.

Source code in main/views/account_views.py
144
145
146
147
148
def get_form_kwargs(self) -> dict[str, Any]:
    """Return the keyword arguments for instantiating the form."""
    kwargs = super().get_form_kwargs()
    kwargs["user"] = self.request.user
    return kwargs

SkillProfileView ¤

Bases: TermsAcceptedMixin, TemplateView

View that renders the skill profile page.

Methods:¤
get_context_data(**kwargs) ¤

Add user skills and skill levels to the template context.

Source code in main/views/account_views.py
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
def get_context_data(self, **kwargs: Any) -> dict[str, Any]:
    """Add user skills and skill levels to the template context."""
    context = super().get_context_data(**kwargs)
    logger.info("Rendering skills-profile page.")

    user_skills = UserSkill.objects.filter(user=self.request.user.pk)
    user_skills_data = [
        {
            "skill": user_skill.skill.name,
            "category": user_skill.skill.competency.competency_domain.name,
            "subcategory": user_skill.skill.competency.name,
            "skill_level": user_skill.skill_level.level,
        }
        for user_skill in user_skills
    ]

    context["chart_data"] = dumps(
        [
            {
                "user_id": "root",
                "user_data": user_skills_data,
            }
        ]
    )
    context["skill_levels"] = dumps(
        list(SkillLevel.objects.values("level", "name"))
    )
    return context

TermsAcceptanceView ¤

Bases: LoginRequiredMixin, FormView[TermsAcceptanceForm]

Prompt authenticated users to accept terms before continuing.

Methods:¤
form_valid(form) ¤

Persist acceptance and the acceptance timestamp.

Source code in main/views/account_views.py
65
66
67
68
69
70
71
def form_valid(self, form: TermsAcceptanceForm) -> HttpResponse:
    """Persist acceptance and the acceptance timestamp."""
    user = cast("UserType", self.request.user)
    user.agreed_to_tos = form.cleaned_data["tos"]
    user.date_agreed = timezone.now()
    user.save(update_fields=["agreed_to_tos", "date_agreed"])
    return HttpResponseRedirect(str(self.success_url))

TermsAcceptedMixin ¤

Bases: LoginRequiredMixin

Require authenticated users to accept terms before accessing account pages.

Methods:¤
dispatch(request, *args, **kwargs) ¤

Redirect to terms acceptance page when the user has not accepted terms.

Source code in main/views/account_views.py
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
def dispatch(
    self, request: HttpRequest, *args: Any, **kwargs: Any
) -> HttpResponseBase:
    """Redirect to terms acceptance page when the user has not accepted terms."""
    if not request.user.is_authenticated:
        return self.handle_no_permission()

    if request.user.agreed_to_tos:
        return super().dispatch(request, *args, **kwargs)

    resolver_match = request.resolver_match
    if resolver_match and resolver_match.url_name == self.terms_acceptance_url_name:
        return super().dispatch(request, *args, **kwargs)

    return HttpResponseRedirect(reverse(self.terms_acceptance_url_name))

UserUpdateView ¤

Bases: TermsAcceptedMixin, UpdateView['UserType', ModelForm['UserType']]

View that renders the user update form page.

Methods:¤
get_object(queryset=None) ¤

Remove the need for url args by returning the current user.

Source code in main/views/account_views.py
131
132
133
def get_object(self, queryset: Any | None = None) -> "UserType":
    """Remove the need for url args by returning the current user."""
    return self.request.user