예제 #1
0
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']
예제 #3
0
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,
    }
예제 #4
0
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)
예제 #5
0
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,
    }