def view_pdf(meeting_id, person_id): meeting = sugar.get_object_or_404(models.Meeting, id=meeting_id) person = sugar.get_person_or_404(meeting_id, person_id) labeled = schema.common.labels_for_values(person.data, meeting_id) category = sugar.get_person_category_or_404(meeting_id, category_id=person.category_id(meeting.id)) phrases = {p.data['name']: p for p in meeting.get_phrases} event_form = EventCitesForm(meeting_model=meeting, person=person) # render form in participant language participant_lang = {"E": "en", "S": "es", "F": "fr"}.get(person.lang, "E") sugar.set_lang(participant_lang) pdf = sugar.generate_pdf_from_html( flask.render_template('participant/credentials.html', **{ 'person': person, 'category': category, 'meeting': meeting, 'labeled': labeled, 'phrases': phrases, 'credentials_strings': refdata.credentials_strings, 'event_form': event_form, }) ) return flask.Response(response=pdf, mimetype='application/pdf')
def form(meeting_id): app = flask.current_app # render form in local language lang = flask.request.args.get('lang', 'en') if lang not in ('en', 'fr', 'es'): flask.abort(400) sugar.set_lang(lang) meeting = sugar.get_object_or_404(models.Meeting, id=meeting_id) form = MediaParticipantForm(meeting=meeting) response = {} if flask.request.method == 'POST': if form.validate(): media_person = models.MediaPerson() media_person.data = {} form.save(media_person) sugar.activity(meeting_id, "add-media-participant", media_person.name, media_person.id) if form.data['personal_email']: send_mail_to_media_participant(meeting, form, lang) # language will change here to english sugar.set_lang("en") refresh() send_mail_to_admin(meeting, form, media_person.id) phrase_lang = {'en': 'E', 'es': 'S', 'fr': 'F'}.get(lang, 'E') phrase = models.Phrase.select().where( data__contains={'name': 'Media registration confirmation'}, meeting=meeting_id).get() template = app.jinja_env.get_template('participant/form_success.html') response['data'] = template.render({ 'content': phrase.decoded_data['description_%s' % phrase_lang], }) return response['data'] else: log.warn("validation errors in media participant form", extra={'errors': form.errors, 'form_data': form.data}) template = app.jinja_env.get_template('participant/media_form.html') response['data'] = template.render({ 'meeting': meeting, 'form': form, }) return response['data']
def credentials(meeting_id, person_id): meeting = sugar.get_object_or_404(models.Meeting, id=meeting_id) fees = meeting.get_fees person = sugar.get_person_or_404(meeting_id, person_id) category = sugar.get_person_category_or_404(meeting_id, person_id=person_id) labeled = schema.labels_for_values(person.decoded_data, meeting_id, in_participant_language=True, category=category) phrases = {p.data['name']: p for p in meeting.get_phrases} event_form = EventCitesForm(meeting_model=meeting, person=person) # render form in participant language participant_lang = {"E": "en", "S": "es", "F": "fr"}.get(person.lang, "E") sugar.set_lang(participant_lang) return { 'meeting': meeting, 'category': category, 'phrases': phrases, 'person': person, 'labeled': labeled, 'credentials_strings': refdata.credentials_strings, 'event_form': event_form, }
def form(meeting_id): app = flask.current_app meeting = schema.Meeting.get_or_404(meeting_id) # render form in local language lang = flask.request.args.get('lang', 'en') if lang not in ('en', 'fr', 'es'): flask.abort(400) sugar.set_lang(lang) meeting_model = sugar.get_object_or_404(models.Meeting, id=meeting_id) # you can define custom forms based on meeting types # in forms/custom_participant.py RegistrationForm = get_registration_form(meeting_model.data['info_type']) form = RegistrationForm(meeting=meeting_model) if meeting_model.is_photo_required is False: delattr(form, 'photo') event_form = EventRegistrationForm(meeting=meeting_model) question_form = QuestionRegistrationForm(meeting=meeting_model) if meeting['info']['online_registration'] == 'closed': return flask.render_template('participant/registration_closed.html', acronym=meeting['info'].get('acronym')) if flask.request.method == 'POST': if form.validate(): person = models.Person() person.data = {} photo = form.data.get('photo') if photo: #use last name for the photo_name photo_name = '%s.' % secure_filename(form.data['personal_last_name']) filename = photos.save(photo, name=photo_name) file_path = app.config['UPLOADED_PHOTOS_DEST'] / filename file_size = app.config['UPLOADED_PHOTO_RESOLUTION'] new_file_path = sugar.optimize_photo(file_path, file_size) filename = new_file_path.name original_filename = file_path.name else: filename = '' original_filename = '' form_data = dict(form.data, photo=filename, uploaded_photo=original_filename) meeting_flags = getattr(form, 'meeting_flags_data', {}) files_data = form.upload_files() if files_data: form_data.update(files_data) person.data.update(form_data.items()) personal_category = int(person.data.pop('personal_category')) select_country = form.data['representing_country'] or form.data['personal_country'] or None if select_country: country = models.Country.select().where( data__contains={'iso': select_country}).get() person.data['representing_region'] = country.data['region'] person.data['printout_representing'] = person.rep(meeting, category_id=personal_category) or '' category = sugar.get_person_category_or_None(meeting_id, personal_category) person.data['room'] = category.data.get('room', '') person.save() person.data['_text_for_search'] = person.text_for_search person.save() sugar.activity(meeting_id, "add-participant", person.name, person.id) meeting_data = {} meeting_data.update(MEETING_FLAGS) meeting_data.update(meeting_flags) meeting_data['registered_date'] = str(datetime.now().replace( second=0, microsecond=0)) person_meeting = models.PersonMeeting.create( person=person.id, meeting=meeting_id, category=personal_category, token=sugar.random_string(), data=meeting_data) event_form.save(person) question_form.save(person) events = _get_events(event_form.data['events']) if form.data['personal_email']: _send_mail_to_self_registering_participant( meeting_model, events, form, lang) # language will change here to english sugar.set_lang("en") refresh() _send_mail_to_admin(meeting_model, events, form, person.id) phrase_lang = {"en": "E", "es": "S", "fr": "F"}.get(lang, "E") phrase = models.Phrase.select().where( data__contains={'name': 'Registration confirmation'}, meeting=meeting_id).get() return flask.render_template( 'participant/form/success.html', content=phrase.decoded_data['description_%s' % phrase_lang]) else: log.warn("validation errors in participant form", extra={'errors': form.errors, 'form_data': form.data}) return flask.render_template( form.TEMPLATE, meeting=meeting, meeting_model=meeting_model, form=form, lang={"en": "E", "es": "S", "fr": "F"}.get(lang, "E"), event_form=event_form, question_form=question_form)
def send_mail(meeting_id, person_id): app = flask.current_app meeting = sugar.get_object_or_404(models.Meeting, id=meeting_id) session = database.get_session() person = sugar.get_person_or_404(meeting_id, person_id) lang_code = person.decoded_data['personal_language'] or 'en' labeled = schema.labels_for_values(person.data, meeting_id, in_participant_language=True) category = person.category_model(meeting_id) cc_addresses = [] phrases = {p.data['name']: p for p in meeting.get_phrases} event_form = EventCitesForm(meeting_model=meeting, person=person) if flask.request.method == "POST": mail = Mail(app) form_data = flask.request.form.to_dict() if form_data['mail_to'].find(',') != -1: to_addresses = form_data['mail_to'].split(',') if form_data.get('mail_cc'): cc_addresses = form_data['mail_cc'].split(',') else: to_addresses = form_data["mail_to"].split(";") if form_data.get('mail_cc'): cc_addresses = form_data["mail_cc"].split(";") # populate schema with data from POST mail_schema = schema.MailSchema.from_flat(form_data) to_member_schema = mail_schema['to'].member_schema cc_member_schema = mail_schema['cc'].member_schema for address in to_addresses: mail_schema['to'].append(to_member_schema(address)) for address in cc_addresses: mail_schema['cc'].append(cc_member_schema(address)) if mail_schema.validate(): # flatten schema mail_data = {} mail_data.update(mail_schema.flatten()) mail_data['mail_to'] = to_addresses mail_data['mail_cc'] = cc_addresses # construct recipients from "to" recipients = mail_data['mail_to'] # send email msg = Message(mail_data['mail_subject'], sender = meeting.decoded_data['info_admin_email'], recipients=recipients, cc=mail_data['mail_cc'], body=mail_data['mail_message']) # render form in participant language participant_lang = {"E": "en", "S": "es", "F": "fr"}.get(person.lang, "E") sugar.set_lang(participant_lang) pdf = sugar.generate_pdf_from_html( flask.render_template('participant/credentials.html', **{ 'person': person, 'meeting': meeting, 'credentials_strings': refdata.credentials_strings, 'labeled': labeled, 'phrases': phrases, 'category': category, 'event_form': event_form, }) ) msg.attach('registration_details.pdf', 'application/pdf', pdf) mail.send(msg) # log mail mail_log_data = { 'date': date.today(), 'meeting_id': meeting.id, 'person_id': person_id, 'type': 'single_mail', } mail_log_data.update(mail_data) mail_log_schema = schema.MailLogSchema.from_flat(mail_log_data) if mail_log_schema.validate(): mail_log_row = database.new('mail_log') mail_log_row.update(mail_log_schema.flatten()) session.save(mail_log_row) session.commit() # update acknowledged date person.update_meeting_flags(meeting_id, { 'meeting_flags_acknowledged': str(datetime.now().replace( second=0, microsecond=0)) }) if app.config['MAIL_SUPPRESS_SEND']: flask.flash(u'This is a demo, no real email was sent', 'info') else: # flash a success message success_msg = u'Mail sent to %d recipients.' % ( len(to_addresses) + len(cc_addresses)) flask.flash(success_msg, 'success') return flask.redirect( flask.url_for('participant.send_mail', meeting_id=meeting_id, person_id=person_id)) else: flask.flash(u'Errors in mail information', 'error') else: # create a schema with default data mail_schema = schema.MailSchema({ 'to': [person.data['personal_email']], 'subject': phrases['EM_Subj'].decoded_data['description_%s' % lang_code], 'message': '\n\n\n%s' % phrases['Intro'].decoded_data['description_%s' % lang_code], }) return { 'mk': sugar.MarkupGenerator( app.jinja_env.get_template('widgets/widgets_mail.html') ), 'person': person, 'category': category, 'mail_schema': mail_schema, 'meeting': meeting, 'phrases': phrases, }