Exemplo n.º 1
0
Arquivo: util.py Projeto: javfg/indico
def create_registration(regform,
                        data,
                        invitation=None,
                        management=False,
                        notify_user=True,
                        skip_moderation=None):
    user = session.user if session else None
    registration = Registration(registration_form=regform,
                                user=get_user_by_email(data['email']),
                                base_price=regform.base_price,
                                currency=regform.currency)
    if skip_moderation is None:
        skip_moderation = management
    for form_item in regform.active_fields:
        default = form_item.field_impl.default_value
        can_modify = management or not form_item.parent.is_manager_only
        value = data.get(form_item.html_field_name,
                         default) if can_modify else default
        data_entry = RegistrationData()
        registration.data.append(data_entry)
        if form_item.is_purged:
            # Leave the registration data empty
            continue

        for attr, value in form_item.field_impl.process_form_data(
                registration, value).items():
            setattr(data_entry, attr, value)
        if form_item.type == RegistrationFormItemType.field_pd and form_item.personal_data_type.column:
            setattr(registration, form_item.personal_data_type.column, value)
    if invitation is None:
        # Associate invitation based on email in case the user did not use the link
        invitation = (RegistrationInvitation.query.filter_by(
            email=data['email'],
            registration_id=None).with_parent(regform).first())
    if invitation:
        invitation.state = InvitationState.accepted
        invitation.registration = registration
    if not management and regform.needs_publish_consent:
        registration.consent_to_publish = data.get(
            'consent_to_publish', RegistrationVisibility.nobody)
    registration.sync_state(_skip_moderation=skip_moderation)
    db.session.flush()
    signals.event.registration_created.send(registration,
                                            management=management,
                                            data=data)
    notify_registration_creation(registration, notify_user)
    logger.info('New registration %s by %s', registration, user)
    registration.log(
        EventLogRealm.management if management else EventLogRealm.participants,
        LogKind.positive,
        'Registration',
        f'New registration: {registration.full_name}',
        user,
        data={'Email': registration.email})
    return registration