def hotel(self, session, message='', id=None, edit_id=None, requested_hotel_info=False): id = edit_id or id if not id: raise HTTPRedirect('form') if not c.PREREG_REQUEST_HOTEL_INFO_OPEN: if cherrypy.request.method == 'POST': raise HTTPRedirect('index?message={}', 'Requests for hotel booking info have already been closed') else: raise HTTPRedirect('form?edit_id={}', id) attendee = self._get_unsaved( id, if_not_found=HTTPRedirect('form?message={}', 'Could not find the given preregistration')) is_group_leader = not attendee.is_unassigned and attendee.promo_code_groups > 0 if cherrypy.request.method == 'POST': attendee.requested_hotel_info = requested_hotel_info target = attendee track_type = c.EDITED_PREREG if target.id in Charge.unpaid_preregs else c.UNPAID_PREREG Charge.unpaid_preregs[target.id] = Charge.to_sessionized(attendee) Tracking.track(track_type, attendee) raise HTTPRedirect('index') return { 'message': message, 'id': id, 'edit_id': edit_id, 'is_group_leader': is_group_leader, 'requested_hotel_info': attendee.requested_hotel_info if edit_id else True }
def repurchase(self, session, id, **params): if 'csrf_token' in params: new_attendee = Attendee( **session.attendee(id).to_dict(c.UNTRANSFERABLE_ATTRS)) Charge.unpaid_preregs[new_attendee.id] = to_sessionized( new_attendee, Group()) Tracking.track(c.UNPAID_PREREG, new_attendee) raise HTTPRedirect("form?edit_id={}", new_attendee.id) return {'id': id}
def repurchase(self, session, id, **params): if 'csrf_token' in params: old_attendee = session.attendee(id).to_dict(c.UNTRANSFERABLE_ATTRS) del old_attendee['id'] new_attendee = Attendee(**old_attendee) Charge.unpaid_preregs[new_attendee.id] = Charge.to_sessionized(new_attendee) Tracking.track(c.UNPAID_PREREG, new_attendee) raise HTTPRedirect("form?edit_id={}", new_attendee.id) return { 'id': id }
def form(self, session, message='', edit_id=None, **params): """ Our production NGINX config caches the page at /preregistration/form. Since it's cached, we CAN'T return a session cookie with the page. We must POST to a different URL in order to bypass the cache and get a valid session cookie. Thus, this page is also exposed as "post_form". """ params['id'] = 'None' # security! group = Group() if edit_id is not None: attendee = self._get_unsaved( edit_id, if_not_found=HTTPRedirect('form?message={}', 'That preregistration has already been finalized')) attendee.apply(params, restricted=True) params.setdefault('pii_consent', True) else: attendee = session.attendee(params, ignore_csrf=True, restricted=True) if attendee.badge_type == c.PSEUDO_DEALER_BADGE: if not c.DEALER_REG_OPEN: return render('static_views/dealer_reg_closed.html') if c.AFTER_DEALER_REG_START \ else render('static_views/dealer_reg_not_open.html') # Both the Attendee class and Group class have identically named # address fields. In order to distinguish the two sets of address # fields in the params, the Group fields are prefixed with "group_" # when the form is submitted. To prevent instantiating the Group object # with the Attendee's address fields, we must clone the params and # rename all the "group_" fields. group_params = dict(params) for field_name in ['country', 'region', 'zip_code', 'address1', 'address2', 'city']: group_params[field_name] = params.get('group_{}'.format(field_name), '') if params.get('copy_address'): params[field_name] = group_params[field_name] attendee.apply(params) group = session.group(group_params, ignore_csrf=True, restricted=True) if c.PAGE == 'post_dealer': attendee.badge_type = c.PSEUDO_DEALER_BADGE elif not attendee.badge_type: attendee.badge_type = c.ATTENDEE_BADGE if cherrypy.request.method == 'POST' or edit_id is not None: message = check_pii_consent(params, attendee) or message if not message and attendee.badge_type not in c.PREREG_BADGE_TYPES: message = 'Invalid badge type!' if not message and c.BADGE_PROMO_CODES_ENABLED and params.get('promo_code'): if session.lookup_promo_or_group_code(params.get('promo_code'), PromoCodeGroup): Charge.universal_promo_codes[attendee.id] = params.get('promo_code') message = session.add_promo_code_to_attendee(attendee, params.get('promo_code')) if message: return { 'message': message, 'attendee': attendee, 'group': group, 'edit_id': edit_id, 'affiliates': session.affiliates(), 'cart_not_empty': Charge.unpaid_preregs, 'copy_address': params.get('copy_address'), 'promo_code_code': params.get('promo_code', ''), 'pii_consent': params.get('pii_consent'), 'name': params.get('name', ''), 'badges': params.get('badges', 0), } if 'first_name' in params: if attendee.badge_type == c.PSEUDO_DEALER_BADGE: message = check(group, prereg=True) message = message or check(attendee, prereg=True) if attendee.badge_type in [c.PSEUDO_GROUP_BADGE, c.PSEUDO_DEALER_BADGE]: message = "Please enter a group name" if not params.get('name') else message else: params['badges'] = 0 params['name'] = '' if not message: if attendee.badge_type == c.PSEUDO_DEALER_BADGE: attendee.paid = c.PAID_BY_GROUP group.attendees = [attendee] session.assign_badges(group, params['badges']) group.status = c.WAITLISTED if c.DEALER_REG_SOFT_CLOSED else c.UNAPPROVED attendee.ribbon = add_opt(attendee.ribbon_ints, c.DEALER_RIBBON) attendee.badge_type = c.ATTENDEE_BADGE session.add_all([attendee, group]) session.commit() try: send_email.delay( c.MARKETPLACE_EMAIL, c.MARKETPLACE_EMAIL, '{} Received'.format(c.DEALER_APP_TERM.title()), render('emails/dealers/reg_notification.txt', {'group': group}, encoding=None), model=group.to_dict('id')) send_email.delay( c.MARKETPLACE_EMAIL, attendee.email, '{} Received'.format(c.DEALER_APP_TERM.title()), render('emails/dealers/application.html', {'group': group}, encoding=None), 'html', model=group.to_dict('id')) except Exception: log.error('unable to send marketplace application confirmation email', exc_info=True) raise HTTPRedirect('dealer_confirmation?id={}', group.id) else: track_type = c.UNPAID_PREREG if attendee.id in Charge.unpaid_preregs: track_type = c.EDITED_PREREG # Clear out any previously cached targets, in case the unpaid badge # has been edited and changed from a single to a group or vice versa. del Charge.unpaid_preregs[attendee.id] Charge.unpaid_preregs[attendee.id] = Charge.to_sessionized(attendee, params.get('name'), params.get('badges')) Tracking.track(track_type, attendee) if session.attendees_with_badges().filter_by( first_name=attendee.first_name, last_name=attendee.last_name, email=attendee.email).count(): raise HTTPRedirect('duplicate?id={}', group.id if attendee.paid == c.PAID_BY_GROUP else attendee.id) if attendee.banned: raise HTTPRedirect('banned?id={}', group.id if attendee.paid == c.PAID_BY_GROUP else attendee.id) if c.PREREG_REQUEST_HOTEL_INFO_OPEN: hotel_page = 'hotel?edit_id={}' if edit_id else 'hotel?id={}' raise HTTPRedirect(hotel_page, group.id if attendee.paid == c.PAID_BY_GROUP else attendee.id) else: raise HTTPRedirect('index') else: if edit_id is None: if attendee.badge_type == c.PSEUDO_DEALER_BADGE: # All new dealer signups should default to receiving the # hotel info email, even if the deadline has passed. # There's a good chance some dealers will apply for a table # AFTER the hotel booking deadline, but BEFORE the hotel # booking is sent out. This ensures they'll still receive # the email, as requested by the Marketplace Department. attendee.requested_hotel_info = True if attendee.badge_type == c.PSEUDO_DEALER_BADGE and c.DEALER_REG_SOFT_CLOSED: message = '{} is closed, but you can ' \ 'fill out this form to add yourself to our waitlist'.format(c.DEALER_REG_TERM.title()) promo_code_group = None if attendee.promo_code: promo_code_group = session.query(PromoCode).filter_by(code=attendee.promo_code.code).first().group return { 'message': message, 'attendee': attendee, 'badges': params.get('badges', 0), 'name': params.get('name', ''), 'group': group, 'promo_code_group': promo_code_group, 'edit_id': edit_id, 'affiliates': session.affiliates(), 'cart_not_empty': Charge.unpaid_preregs, 'copy_address': params.get('copy_address'), 'promo_code_code': params.get('promo_code', ''), 'pii_consent': params.get('pii_consent'), }
def form(self, session, message='', edit_id=None, **params): """ Our production NGINX config caches the page at /preregistration/form. Since it's cached, we CAN'T return a session cookie with the page. We must POST to a different URL in order to bypass the cache and get a valid session cookie. Thus, this page is also exposed as "post_form". """ params['id'] = 'None' # security! group = Group() if edit_id is not None: attendee = self._get_unsaved( edit_id, if_not_found=HTTPRedirect('form?message={}', 'That preregistration has already been finalized')) attendee.apply(params, restricted=True) params.setdefault('pii_consent', True) else: attendee = session.attendee(params, ignore_csrf=True, restricted=True) if attendee.badge_type == c.PSEUDO_DEALER_BADGE: if not c.DEALER_REG_OPEN: return render('static_views/dealer_reg_closed.html') if c.AFTER_DEALER_REG_START \ else render('static_views/dealer_reg_not_open.html') # Both the Attendee class and Group class have identically named # address fields. In order to distinguish the two sets of address # fields in the params, the Group fields are prefixed with "group_" # when the form is submitted. To prevent instantiating the Group object # with the Attendee's address fields, we must clone the params and # rename all the "group_" fields. group_params = dict(params) for field_name in ['country', 'region', 'zip_code', 'address1', 'address2', 'city']: group_params[field_name] = params.get('group_{}'.format(field_name), '') if params.get('copy_address'): params[field_name] = group_params[field_name] group = session.group(group_params, ignore_csrf=True, restricted=True) if c.PAGE == 'post_dealer': attendee.badge_type = c.PSEUDO_DEALER_BADGE elif not attendee.badge_type: attendee.badge_type = c.ATTENDEE_BADGE if cherrypy.request.method == 'POST' or edit_id is not None: message = check_pii_consent(params, attendee) or message if not message and attendee.badge_type not in c.PREREG_BADGE_TYPES: message = 'Invalid badge type!' if not message and c.BADGE_PROMO_CODES_ENABLED and params.get('promo_code'): message = session.add_promo_code_to_attendee(attendee, params.get('promo_code')) if message: return { 'message': message, 'attendee': attendee, 'group': group, 'edit_id': edit_id, 'affiliates': session.affiliates(), 'cart_not_empty': Charge.unpaid_preregs, 'copy_address': params.get('copy_address'), 'promo_code': params.get('promo_code', ''), 'pii_consent': params.get('pii_consent'), } if 'first_name' in params: message = check(attendee, prereg=True) if not message and attendee.badge_type == c.PSEUDO_DEALER_BADGE: message = check(group, prereg=True) if attendee.badge_type in [c.PSEUDO_GROUP_BADGE, c.PSEUDO_DEALER_BADGE]: message = "Please enter a group name" if not params.get('name') else '' else: params['badges'] = 0 params['name'] = '' if not message: if attendee.badge_type == c.PSEUDO_DEALER_BADGE: attendee.paid = c.PAID_BY_GROUP group.attendees = [attendee] session.assign_badges(group, params['badges']) group.status = c.WAITLISTED if c.DEALER_REG_SOFT_CLOSED else c.UNAPPROVED attendee.ribbon = add_opt(attendee.ribbon_ints, c.DEALER_RIBBON) attendee.badge_type = c.ATTENDEE_BADGE session.add_all([attendee, group]) session.commit() try: send_email.delay( c.MARKETPLACE_EMAIL, c.MARKETPLACE_EMAIL, 'Dealer Application Received', render('emails/dealers/reg_notification.txt', {'group': group}, encoding=None), model=group.to_dict('id')) send_email.delay( c.MARKETPLACE_EMAIL, attendee.email, 'Dealer Application Received', render('emails/dealers/application.html', {'group': group}, encoding=None), 'html', model=group.to_dict('id')) except Exception: log.error('unable to send marketplace application confirmation email', exc_info=True) raise HTTPRedirect('dealer_confirmation?id={}', group.id) else: track_type = c.UNPAID_PREREG if attendee.id in Charge.unpaid_preregs: track_type = c.EDITED_PREREG # Clear out any previously cached targets, in case the unpaid badge # has been edited and changed from a single to a group or vice versa. del Charge.unpaid_preregs[attendee.id] Charge.unpaid_preregs[attendee.id] = Charge.to_sessionized(attendee, params.get('name'), params.get('badges')) Tracking.track(track_type, attendee) if session.attendees_with_badges().filter_by( first_name=attendee.first_name, last_name=attendee.last_name, email=attendee.email).count(): raise HTTPRedirect('duplicate?id={}', group.id if attendee.paid == c.PAID_BY_GROUP else attendee.id) if attendee.banned: raise HTTPRedirect('banned?id={}', group.id if attendee.paid == c.PAID_BY_GROUP else attendee.id) if c.PREREG_REQUEST_HOTEL_INFO_OPEN: hotel_page = 'hotel?edit_id={}' if edit_id else 'hotel?id={}' raise HTTPRedirect(hotel_page, group.id if attendee.paid == c.PAID_BY_GROUP else attendee.id) else: raise HTTPRedirect('index') else: if edit_id is None: if attendee.badge_type == c.PSEUDO_DEALER_BADGE: # All new dealer signups should default to receiving the # hotel info email, even if the deadline has passed. # There's a good chance some dealers will apply for a table # AFTER the hotel booking deadline, but BEFORE the hotel # booking is sent out. This ensures they'll still receive # the email, as requested by the Marketplace Department. attendee.requested_hotel_info = True if attendee.badge_type == c.PSEUDO_DEALER_BADGE and c.DEALER_REG_SOFT_CLOSED: message = 'Dealer registration is closed, but you can ' \ 'fill out this form to add yourself to our waitlist' promo_code_group = None if attendee.promo_code: promo_code_group = session.query(PromoCode).filter_by(code=attendee.promo_code.code).first().group return { 'message': message, 'attendee': attendee, 'group': group, 'promo_code_group': promo_code_group, 'edit_id': edit_id, 'affiliates': session.affiliates(), 'cart_not_empty': Charge.unpaid_preregs, 'copy_address': params.get('copy_address'), 'promo_code': params.get('promo_code', ''), 'pii_consent': params.get('pii_consent'), }