hack4impact/maps4all

View on GitHub
app/contact/views.py

Summary

Maintainability
A
3 hrs
Test Coverage
import os
from flask import render_template, redirect, url_for, abort, flash
from flask.ext.login import login_required
from flask.ext.rq import get_queue

from wtforms.fields import SelectField

from wtforms.validators import (
    Optional
)
from .. import db
from ..models import EditableHTML, Resource, ContactCategory
from . import contact
from .forms import ContactForm, ContactCategoryForm, EditCategoryNameForm
from app import create_app
from ..email import send_email

@contact.route('/', methods=['GET', 'POST'])
def index():
    editable_html_obj = EditableHTML.get_editable_html('contact')

    if editable_html_obj is False:
        edit = EditableHTML(editor_name='contact', page_name='Contact', value='')
        db.session.add(edit)
        db.session.commit()
        editable_html_obj = edit
    setattr(ContactForm,
            'category',
            SelectField('Category',
                        choices=[(c.name, c.name) for c in ContactCategory.query.all()],
                        validators=[Optional()]
                        )
            )
    form = ContactForm()
    app = create_app(os.getenv('FLASK_CONFIG') or 'default')
    contact_email = app.config['ADMIN_EMAIL']
    if form.validate_on_submit():
        get_queue().enqueue(
            send_email,
            recipient=contact_email,
            subject=form.category.data,
            template='contact/email/contact',
            name=form.name.data,
            email=form.email.data,
            message=form.message.data
        )
        return redirect(url_for('main.index'))
    category_form = ContactCategoryForm()
    if category_form.validate_on_submit():
        if ContactCategory.query.filter_by(name = category_form.name.data).first() is not None:
            flash('Category \"{}\" already exists.'.format(category_form.name.data), 'form-error')
        else:
            new_category = ContactCategory(name=category_form.name.data)
            db.session.add(new_category)
            db.session.commit()
    categories = ContactCategory.query.all()
    return render_template('contact/index.html',
                            editable_html_obj=editable_html_obj,
                            form=form,
                            category_form=category_form,
                            categories=categories)

@contact.route('/<int:category_id>', methods=['GET', 'POST'])
@login_required
def edit_category_name(category_id):
    """Edit a category"""
    category = ContactCategory.query.get(category_id)
    if category is None:
        abort(404)
    old_name = category.name
    form = EditCategoryNameForm()
    if form.validate_on_submit():
        if ContactCategory.query.filter(ContactCategory.name == form.name.data).first() is not None:
            flash('Category \"{}\" already exists.'.format(form.name.data), 'form-error')
            return render_template('contact/manage_category.html',
                                    category=category,
                                    form=form)
        category.name = form.name.data
        db.session.add(category)
        try:
            db.session.commit()
            flash('Name for category \"{}\" successfully changed to \"{}\".'
                .format(old_name, category.name),
                'form-success')
        except IntegrityError:
            db.session.rollback()
            flash('Database error occurred. Please try again.', 'form-error')
        return render_template('contact/manage_category.html',
                                category=category,
                                form=form)
    form.name.data = category.name
    return render_template('contact/manage_category.html',
                            category=category,
                            form=form)

@contact.route('/<int:category_id>/delete_request')
@login_required
def delete_category_request(category_id):
    """Shows the page for deletion of a contact category."""
    category = ContactCategory.query.get(category_id)
    if category is None:
        abort(404)
    return render_template('contact/manage_category.html',
                            category=category)

@contact.route('/<int:category_id>/delete')
@login_required
def delete_category(category_id):
    """Deletes a contact category."""
    category = ContactCategory.query.get(category_id)
    if category is None:
        abort(404)
    db.session.delete(category)
    try:
        db.session.commit()
        flash('Successfully deleted category \"%s\".' % category.name, 'success')
    except IntegrityError:
        db.session.rollback()
        flash('Database error occurred. Please try again.', 'form-error')
        return render_template('contact/manage_category.html',
                                category=category)
    return redirect(url_for('contact.index'))