Exemplo n.º 1
0
    def create(self, first_name, last_name, email, params):
        """
        Create an attendee with at least a first name, last name, and email. Prevents duplicate attendees.

        `params` should be a dictionary with column name: value to set other values, or a falsey value.
        Use labels for Choice and MultiChoice columns, and a string like "no" or "yes" for Boolean columns.
        Date and DateTime columns should be parsed correctly as long as they follow a standard format.

        Example `params` dictionary for setting extra parameters:
        <pre>{"placeholder": "yes", "legal_name": "First Last", "cellphone": "5555555555"}</pre>
        """
        with Session() as session:
            attendee_query = session.query(Attendee).filter(
                Attendee.first_name.ilike("first_name"),
                Attendee.last_name.ilike("last_name"),
                Attendee.email.ilike("*****@*****.**"))

            if attendee_query.first():
                raise HTTPError(
                    400,
                    'An attendee with this name and email address already exists'
                )

            attendee = Attendee(first_name=first_name,
                                last_name=last_name,
                                email=email)

            if params:
                for key, val in params.items():
                    params[key] = _parse_if_datetime(key, val)
                    params[key] = _parse_if_boolean(key, val)

            attendee.apply(params, restricted=False)
            session.add(attendee)

            message = check(attendee)
            if message:
                session.rollback()
                raise HTTPError(400, message)

            # Duplicates functionality on the admin form that makes placeholder badges need not pay
            # Staff (not volunteers) also almost never need to pay by default
            if (attendee.placeholder
                    or attendee.staffing and c.VOLUNTEER_RIBBON
                    not in attendee.ribbon_ints) and 'paid' not in params:
                attendee.paid = c.NEED_NOT_PAY

            return attendee.id
Exemplo n.º 2
0
def duplicate_badge_num_preconditions():
    group_id = None
    leader_id = None
    with Session() as session:
        leader = Attendee(
            first_name='Fearless',
            last_name='Leader',
            email='*****@*****.**',
            zip_code='21211',
            ec_name='Nana Fearless',
            ec_phone='555-555-1234',
            cellphone='555-555-2345',
            birthdate=date(1964, 12, 30),
            registered=localized_now(),
            paid=c.PAID_BY_GROUP,
            ribbon='',
            staffing=True,
            badge_type=c.PSEUDO_GROUP_BADGE)

        group = Group(name='Too Many Badges!')
        group.attendees = [leader]
        group.leader = leader
        session.add(leader)
        session.add(group)
        assert session.assign_badges(
            group,
            15,
            new_badge_type=c.STAFF_BADGE,
            new_ribbon_type='',
            paid=c.NEED_NOT_PAY) is None
        session.flush()

        group_id = group.id
        leader_id = leader.id

    with Session() as session:
        console = Department(name='DEPT_01', description='DEPT_01')
        leader = session.query(Attendee).get(leader_id)
        leader.paid = c.NEED_NOT_PAY
        leader.badge_printed_name = 'Fearmore'
        leader.badge_type = c.STAFF_BADGE
        leader.assigned_depts = [console]

        group = session.query(Group).get(group_id)
        group.auto_recalc = False

    for i in range(10):
        with Session() as session:
            console = session.query(Department).filter_by(name='DEPT_01').one()
            group = session.query(Group).get(group_id)

            is_staff = (i < 9)
            params = {
                'first_name': 'Doubtful',
                'last_name': 'Follower{}'.format(i),
                'email': 'fearsome{}@example.com'.format(i),
                'zip_code': '21211',
                'ec_name': 'Nana Fearless',
                'ec_phone': '555-555-1234',
                'cellphone': '555-555-321{}'.format(i),
                'birthdate': date(1964, 12, 30),
                'registered': localized_now(),
                'staffing': is_staff,
                'badge_status': str(c.COMPLETED_STATUS),
                'badge_printed_name': 'Fears{}'.format(i) if is_staff else '',
                'assigned_depts': [console] if is_staff else ''}

            attendee = group.unassigned[0]
            attendee.apply(params, restricted=False)

        with Session() as session:
            group = session.query(Group).get(group_id)
            badge_nums = [a.badge_num for a in group.attendees]
            # SQLite doesn't support deferred constraints, so our test database
            # doesn't actually have a unique constraint on the badge_num
            # column. So we have to manually check for duplicate badge numbers.
            assert_unique(badge_nums)

    yield group_id

    with Session() as session:
        session.query(Group).filter(Group.id == group_id).delete(
            synchronize_session=False)
Exemplo n.º 3
0
def duplicate_badge_num_preconditions():
    group_id = None
    leader_id = None
    with Session() as session:
        leader = Attendee(first_name='Fearless',
                          last_name='Leader',
                          email='*****@*****.**',
                          zip_code='21211',
                          ec_name='Nana Fearless',
                          ec_phone='555-555-1234',
                          cellphone='555-555-2345',
                          birthdate=date(1964, 12, 30),
                          registered=localized_now(),
                          paid=c.PAID_BY_GROUP,
                          ribbon='',
                          staffing=True,
                          badge_type=c.PSEUDO_GROUP_BADGE)

        group = Group(name='Too Many Badges!')
        group.attendees = [leader]
        group.leader = leader
        session.add(leader)
        session.add(group)
        assert session.assign_badges(group,
                                     15,
                                     new_badge_type=c.STAFF_BADGE,
                                     new_ribbon_type='',
                                     paid=c.NEED_NOT_PAY) is None
        session.flush()

        group_id = group.id
        leader_id = leader.id

    with Session() as session:
        console = Department(name='DEPT_01', description='DEPT_01')
        leader = session.query(Attendee).get(leader_id)
        leader.paid = c.NEED_NOT_PAY
        leader.badge_printed_name = 'Fearmore'
        leader.badge_type = c.STAFF_BADGE
        leader.assigned_depts = [console]

        group = session.query(Group).get(group_id)
        group.auto_recalc = False

    for i in range(10):
        with Session() as session:
            console = session.query(Department).filter_by(name='DEPT_01').one()
            group = session.query(Group).get(group_id)

            is_staff = (i < 9)
            params = {
                'first_name': 'Doubtful',
                'last_name': 'Follower{}'.format(i),
                'email': 'fearsome{}@example.com'.format(i),
                'zip_code': '21211',
                'ec_name': 'Nana Fearless',
                'ec_phone': '555-555-1234',
                'cellphone': '555-555-321{}'.format(i),
                'birthdate': date(1964, 12, 30),
                'registered': localized_now(),
                'staffing': is_staff,
                'badge_status': str(c.COMPLETED_STATUS),
                'badge_printed_name': 'Fears{}'.format(i) if is_staff else '',
                'assigned_depts': [console] if is_staff else ''
            }

            attendee = group.unassigned[0]
            attendee.apply(params, restricted=False)

        with Session() as session:
            group = session.query(Group).get(group_id)
            badge_nums = [a.badge_num for a in group.attendees]
            # SQLite doesn't support deferred constraints, so our test database
            # doesn't actually have a unique constraint on the badge_num
            # column. So we have to manually check for duplicate badge numbers.
            assert_unique(badge_nums)

    yield group_id

    with Session() as session:
        session.query(Group).filter(Group.id == group_id).delete(
            synchronize_session=False)