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