summaryrefslogtreecommitdiffstats
path: root/views.py
blob: d36e1abfe4a6bc78d104511fd187106b326cf34c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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
from forms import CreateGroup, DeleteForm, ChangeGroup
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/<int: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('/<group_name>/_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('/<group_name>/_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('/<group_name>/_join/<int:member_id>/<accept>/')
@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('/<group_name>/')
@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}]}