module
pretalx.submission.domain.signup
Functions 6
can_user_signup(submission, user)source
def can_user_signup(submission, user):
if not user or not user.is_authenticated:
return False
event = submission.event
if not event.get_feature_flag("attendee_signup"):
return False
if not submission.requires_signup:
return False
return email_domain_allowed(event, user.email)
cancel_signup(submission, *, user)source
def cancel_signup(submission, *, user):
with transaction.atomic():
locked = _lock_submission(submission)
signup = get_confirmed_signup_for_user(locked, user)
if not signup:
return None
signup.state = AttendeeSignupStates.CANCELED
signup.save(update_fields=["state"])
signup.log_action(".cancel", person=user)
return signup
create_signup(submission, *, user)source
def create_signup(submission, *, user):
event = submission.event
if not event.get_feature_flag("attendee_signup"):
raise SubmissionError(_("Attendee signup is not enabled for this event."))
if not submission.requires_signup:
raise SubmissionError(_("This session does not require attendee signup."))
if not email_domain_allowed(event, user.email):
# Not revealing email domain config
raise SubmissionError(_("You cannot sign up for this session."))
with transaction.atomic():
locked = _lock_submission(submission)
profile, _created = AttendeeProfile.objects.get_or_create(
event=event, user=user
)
signup = (
locked.attendee_signups.select_related("submission__event")
.filter(attendee=profile)
.first()
)
if signup and signup.state == AttendeeSignupStates.CONFIRMED:
return signup
capacity = locked.effective_signup_capacity
if capacity is not None:
current = locked.attendee_signups.filter(
state=AttendeeSignupStates.CONFIRMED
).count()
if current >= capacity:
raise SubmissionError(_("This session is currently full."))
if signup is None:
signup = AttendeeSignup.objects.create(
submission=locked,
attendee=profile,
state=AttendeeSignupStates.CONFIRMED,
)
else:
signup.state = AttendeeSignupStates.CONFIRMED
signup.save(update_fields=["state"])
signup.log_action(".signup", person=user)
return signup
email_domain_allowed(event, email)source
def email_domain_allowed(event, email):
domains = (event.attendee_signup_settings or {}).get("signup_domains") or []
if not domains:
return True
if not email or "@" not in email:
return False
user_domain = email.lower().rsplit("@", 1)[-1]
return user_domain in [d.lower() for d in domains]
get_confirmed_signup_for_user(submission, user)source
def get_confirmed_signup_for_user(submission, user):
signup = get_signup_for_user(submission, user)
if signup and signup.state == AttendeeSignupStates.CONFIRMED:
return signup
return None
get_signup_for_user(submission, user)source
def get_signup_for_user(submission, user):
if not user or not user.is_authenticated:
return None
return (
submission.attendee_signups.select_related("submission__event")
.filter(attendee__user=user)
.first()
)