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

refactor signup method #64

Merged
merged 3 commits into from
Sep 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
45 changes: 19 additions & 26 deletions contrib/signup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,28 @@

from event_management.models import AbstractParticipation
from event_management.signup import (
AbstractSignupMethod,
BaseSignupMethod,
register_signup_methods,
ParticipationError,
)
from user_management.models import Qualification


class SimpleQualificationsRequiredSignupMethod(AbstractSignupMethod):
class SimpleQualificationsRequiredSignupMethod(BaseSignupMethod):
def __init__(self, shift):
super().__init__(shift)
if shift is not None:
self.configuration.required_qualifications = Qualification.objects.filter(
pk__in=self.configuration.required_qualification_ids
)

def get_signup_errors(self, participator):
errors = super().get_signup_errors(participator)
if (error := self.check_qualification(participator)) is not None:
errors.append(error)
return errors
@property
def signup_checkers(self):
return super().signup_checkers + [self.check_qualification]

def get_decline_errors(self, participator):
errors = super().get_decline_errors(participator)
if (error := self.check_qualification(participator)) is not None:
errors.append(error)
return errors

def check_qualification(self, participator):
if not participator.has_qualifications(self.configuration.required_qualifications):
@staticmethod
def check_qualification(method, participator):
if not participator.has_qualifications(method.configuration.required_qualifications):
return ParticipationError(_("You are not qualified."))

def get_configuration_fields(self):
Expand All @@ -44,6 +37,7 @@ def get_configuration_fields(self):
label=_("Required Qualifications"),
queryset=Qualification.objects.all(),
widget=Select2MultipleWidget,
required=False,
),
"default": [],
"publish_with_label": _("Required Qualification"),
Expand All @@ -59,18 +53,17 @@ class InstantConfirmationSignupMethod(SimpleQualificationsRequiredSignupMethod):
verbose_name = _("Instant Confirmation")
description = _("""This method instantly confirms a signup.""")

def get_signup_errors(self, participator):
errors = super().get_signup_errors(participator)
if (error := self.check_maximum_number_of_participants()) is not None:
errors.append(error)
return errors
@property
def signup_checkers(self):
return super().signup_checkers + [self.check_maximum_number_of_participants]

def check_maximum_number_of_participants(self):
if self.configuration.maximum_number_of_participants is not None:
@staticmethod
def check_maximum_number_of_participants(method, participator):
if method.configuration.maximum_number_of_participants is not None:
current_count = AbstractParticipation.objects.filter(
shift=self.shift, state=AbstractParticipation.CONFIRMED
shift=method.shift, state=AbstractParticipation.CONFIRMED
).count()
if current_count >= self.configuration.maximum_number_of_participants:
if current_count >= method.configuration.maximum_number_of_participants:
return ParticipationError(_("The maximum number of participants is reached."))

def get_configuration_fields(self):
Expand All @@ -86,8 +79,8 @@ def get_configuration_fields(self):
def render_shift_state(self):
return get_template("jepcontrib/signup_instant_state.html").render({"shift": self.shift})

def perform_signup(self, participator):
participation = super().perform_signup(participator)
def perform_signup(self, participator, **kwargs):
participation = super().perform_signup(participator, **kwargs)
participation.state = AbstractParticipation.CONFIRMED
participation.save()
return participation
3 changes: 2 additions & 1 deletion event_management/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
TextField,
Manager,
)
from django.utils.functional import cached_property
from polymorphic.models import PolymorphicModel
from django.utils import dateformat, formats
from jsonfallback.fields import FallbackJSONField
Expand Down Expand Up @@ -92,7 +93,7 @@ class Meta:
verbose_name = _("shift")
verbose_name_plural = _("shifts")

@property
@cached_property
def signup_method(self):
from event_management.signup import signup_method_from_slug

Expand Down
Loading