Code reference › domain › submission

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()
    )