from app import app from auth import auth from flask import g, request, redirect, render_template, url_for from flask_peewee.utils import get_object_or_404 from models import Group, Member, Pad from forms import CreateGroup, DeleteForm, ChangeGroup, CreatePad from utils import templated from pagination import Pagination from filters import * def get_group_or_404(*query): group = get_object_or_404(Group.select().join(Member), Member.user == g.user, *query) return group @app.route('/', methods=['GET', 'POST']) @templated('index.html') @auth.login_required def index(): form = CreateGroup(request.form) if form.validate_on_submit(): group = Group() form.populate_obj(group) group.save() Member.create(user=g.user, group=group, admin=True, active=True) form = CreateGroup() groups = [member.group for member in g.user.groups if member.active] return {'groups': groups, 'create_form': form} @app.route('/_all/', defaults={'page': 1}) @app.route('/_all/_page/') @templated('all.html') def all(page): user_groups = Group.select().join(Member).where(Member.user == g.user) public_groups = Group.select().where(~(Group.id << user_groups)).where(Group.browsable == True) count = public_groups.count() return {'groups': public_groups.paginate(page, 10), 'count': count, 'pagination': Pagination(page, 10, count), 'breadcrumbs': [{'text': 'Public groups'}]} @app.route('/_all//', methods=['GET', 'POST']) @templated('group.html') def public_group(group_name): user_groups = Group.select().join(Member).where(Member.user == g.user) group = get_object_or_404(Group.select(), ~(Group.id << user_groups), Group.name == group_name, Group.public == True) if request.method == 'POST': Member.create(user=g.user, group=group) return redirect(url_for('all')) return {'group': group, 'public_view': True, 'breadcrumbs': [ {'text': 'Public groups', 'href': url_for('all')}, {'text': group}]} @app.route('//_delete/', methods=['GET', 'POST']) @templated('group_delete.html') @auth.login_required def group_delete(group_name): group = get_group_or_404(Group.name == group_name, Member.admin == True) form = DeleteForm(request.form) if form.validate_on_submit(): if form.sure.data == 'yes': group.delete_instance(recursive=True) return redirect(url_for('index')) return {'group': group, 'delete_form': form, 'breadcrumbs': [{'href': url_for('group', group_name=group.name), 'text': group}, {'text': 'Delete group'}]} @app.route('//_change/', methods=['GET', 'POST']) @templated('group_change.html') @auth.login_required def group_change(group_name): group = get_group_or_404(Group.name == group_name, Member.admin == True) form = ChangeGroup(request.form, obj=group) if form.validate_on_submit(): del form.name form.populate_obj(group) group.save() return redirect(url_for('group', group_name=group.name)) return {'group': group, 'change_form': form, 'breadcrumbs': [{'href': url_for('group', group_name=group.name), 'text': group}, {'text': 'Edit group'}]} @app.route('//_join///') @auth.login_required def group_join(group_name, member_id, accept): group = get_group_or_404(Group.name == group_name, Member.admin == True) member = get_object_or_404(Member, Member.id == member_id, Member.group == group) if accept == 'yes': member.active = True member.save() elif accept == 'no': member.delete_instance() return redirect(url_for('group', group_name=group_name)) @app.route('//_create_pad/', methods=['GET', 'POST']) @templated('pad_change.html') @auth.login_required def pad_create(group_name): group = get_group_or_404(Group.name == group_name, Member.admin == True) form = CreatePad(request.form, group=group) if form.validate_on_submit(): pad = Pad() form.populate_obj(pad) pad.group = group pad.save() return redirect(url_for('group', group_name = group_name)) return {'group': group, 'change_form': form, 'breadcrumbs': [{'href': url_for('group', group_name=group.name), 'text': group}, {'text': 'Create pad'}]} @app.route('//') @templated('group.html') @auth.login_required def group(group_name): group = get_group_or_404(Group.name == group_name) member = get_object_or_404(Member, Member.user == g.user, Member.group == group) return {'group': group, 'admin': member.admin, 'members': [m for m in group.members.execute()], 'breadcrumbs': [{'text': group}]}