コード例 #1
0
ファイル: meeting.py プロジェクト: pombredanne/cites-meetings
def send_mail(meeting_id):
    app = flask.current_app
    session = database.get_session()
    meeting = sugar.get_object_or_404(models.Meeting, id=meeting_id)
    all_categories = meeting.get_categories()

    if flask.request.method == 'POST':
        mail = Mail(app)

        initial_form_data = flask.request.form
        form_data = initial_form_data.to_dict()

        categories = initial_form_data.getlist('mail_categories')
        categories = map(int, categories)

        mail_schema = schema.BulkMailSchema.from_flat(form_data)
        mail_schema['categories'].set(categories)
        mail_schema.set_category_labels(all_categories)

        if mail_schema.validate():
            mail_data = {}
            mail_data.update(mail_schema.flatten())

            mail_data['mail_categories'] = categories
            lang = form_data['mail_to']
            filters = {
                'personal_language': lang
            }
            if not categories:
                persons = (models.Person.select().where(data__contains=filters))
                persons = sugar.append_persons_query(persons, meeting_id)
                recipients = set([p.data['personal_email']
                              for p in persons if p.data.get('personal_email')])
            else:
                persons = (
                    models.Person.select().where(data__contains=filters)
                          .where(data_value_in('personal_category',
                                               map(str, categories)))
                )
                persons = sugar.append_persons_query(persons, meeting_id)
                recipients = set([p.data['personal_email']
                              for p in persons if p.data.get('personal_email')])

            with mail.connect() as conn:
                for person in recipients:
                    msg = Message(mail_data['mail_subject'],
                                  sender=meeting.data['info_admin_email'],
                                  recipients=[person],
                                  body=mail_data['mail_message'])
                    conn.send(msg)

            mail_log_data = {
                'date': date.today(),
                'meeting_id': meeting.id,
                'type': 'bulk_mail',
            }

            mail_log_data.update(mail_data)
            mail_log_schema = schema.BulkMailLogSchema.from_flat(mail_log_data)
            mail_log_schema.set_category_labels(all_categories)

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

            language = refdata.language.get(lang)
            if app.config['MAIL_SUPPRESS_SEND']:
                flask.flash(u'This is a demo, no real email was sent', 'info')
            else:
                success_msg = u'Mail sent to all %s speakers' % language
                flask.flash(success_msg, 'success')

                return flask.redirect(flask.url_for('meeting.send_mail',
                                      meeting_id=meeting.id))
        else:
            flask.flash(u'Errors in mail information', 'error')

    else:
        mail_schema = schema.BulkMailSchema({})
        mail_schema.set_category_labels(all_categories)

    return {
        'mk': sugar.MarkupGenerator(
            app.jinja_env.get_template('widgets/widgets_mail.html')
        ),
        'meeting': meeting,
        'mail_schema': mail_schema,
    }