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, }