1 | # Create your views here. |
---|
2 | from django.contrib.auth.decorators import user_passes_test, login_required, permission_required |
---|
3 | from django.core.exceptions import PermissionDenied |
---|
4 | from django.shortcuts import render_to_response, get_object_or_404, redirect |
---|
5 | from django.template import RequestContext, Context, Template |
---|
6 | from django.http import Http404, HttpResponseRedirect, HttpResponse |
---|
7 | from django.core.urlresolvers import reverse |
---|
8 | from django.core.mail import EmailMessage, mail_admins |
---|
9 | from django import forms |
---|
10 | from django.forms import ValidationError |
---|
11 | from django.db import connection |
---|
12 | from django.db.models import Q |
---|
13 | from django.utils.safestring import mark_safe |
---|
14 | |
---|
15 | import django_filters |
---|
16 | |
---|
17 | import groups.models |
---|
18 | import space.models |
---|
19 | import space.dump_locker_access |
---|
20 | import space.dump_office_access |
---|
21 | |
---|
22 | # Note: Not a view. |
---|
23 | def process_access_changes(request, group, assignment, entries, changes, extras_indices, ): |
---|
24 | for entry in entries: |
---|
25 | key = "grant[%d][%d]" % (assignment.pk, entry.pk) |
---|
26 | if key in request.POST: |
---|
27 | pass |
---|
28 | else: |
---|
29 | changes.append(('Expire', assignment.space, entry)) |
---|
30 | entry.expire() |
---|
31 | for index in extras_indices: |
---|
32 | key = "new[%d][%d]" % (assignment.pk, index) |
---|
33 | name = request.POST.get(key+"[name]", "") |
---|
34 | if name: |
---|
35 | entry = space.models.SpaceAccessListEntry( |
---|
36 | group=group, |
---|
37 | space=assignment.space, |
---|
38 | ) |
---|
39 | entry.name = name |
---|
40 | entry.card_number = request.POST.get(key+"[card]", "") |
---|
41 | changes.append(('Add', assignment.space, entry)) |
---|
42 | entry.save() |
---|
43 | |
---|
44 | @login_required |
---|
45 | def manage_access(request, pk, ): |
---|
46 | group = get_object_or_404(groups.models.Group, pk=pk) |
---|
47 | |
---|
48 | priv_view = request.user.has_perm('groups.view_group_private_info', group) |
---|
49 | priv_admin = request.user.has_perm('groups.admin_group', group) |
---|
50 | priv_rw = priv_admin |
---|
51 | if not (priv_view or priv_admin): |
---|
52 | raise PermissionDenied |
---|
53 | |
---|
54 | office_access = group.officers(role='office-access') |
---|
55 | locker_access = group.officers(role='locker-access') |
---|
56 | assignments = space.models.SpaceAssignment.current.filter(group=group) |
---|
57 | office_pairs = [] |
---|
58 | locker_pairs = [] |
---|
59 | changes = [] |
---|
60 | if priv_rw: |
---|
61 | extras_indices = range(6) |
---|
62 | else: |
---|
63 | extras_indices = [] |
---|
64 | if request.method == 'POST' and priv_rw: |
---|
65 | edited = True |
---|
66 | else: |
---|
67 | edited = False |
---|
68 | for assignment in assignments: |
---|
69 | entries = space.models.SpaceAccessListEntry.current.filter(group=group, space=assignment.space) |
---|
70 | if assignment.is_locker(): |
---|
71 | pairs = locker_pairs |
---|
72 | else: |
---|
73 | pairs = office_pairs |
---|
74 | if edited: |
---|
75 | process_access_changes( |
---|
76 | request, group, |
---|
77 | assignment, entries.filter(), |
---|
78 | changes, extras_indices, |
---|
79 | ) |
---|
80 | pair = (assignment, entries) |
---|
81 | pairs.append(pair) |
---|
82 | allow_edit = priv_rw and ((len(office_pairs) + len(locker_pairs)) > 0) |
---|
83 | context = { |
---|
84 | 'group': group, |
---|
85 | 'office': office_access, |
---|
86 | 'locker': locker_access, |
---|
87 | 'office_pairs': office_pairs, |
---|
88 | 'locker_pairs': locker_pairs, |
---|
89 | 'changes': changes, |
---|
90 | 'allow_edit': allow_edit, |
---|
91 | 'extras_indices': extras_indices, |
---|
92 | 'pagename':'groups', |
---|
93 | } |
---|
94 | return render_to_response('space/manage-access.html', context, context_instance=RequestContext(request), ) |
---|
95 | |
---|
96 | @permission_required('groups.view_group_private_info') |
---|
97 | def dump_locker_access(request, ): |
---|
98 | response = HttpResponse(mimetype='text/csv') |
---|
99 | space_users = space.dump_locker_access.gather_users() |
---|
100 | space.dump_locker_access.print_info(space_users, response) |
---|
101 | return response |
---|
102 | |
---|
103 | @permission_required('groups.view_group_private_info') |
---|
104 | def dump_office_access(request, ): |
---|
105 | response = HttpResponse(mimetype='text/csv') |
---|
106 | space.dump_office_access.print_info(response) |
---|
107 | return response |
---|
108 | |
---|
109 | def summary(request, ): |
---|
110 | assignments = space.models.SpaceAssignment.current.order_by( |
---|
111 | 'space__number', |
---|
112 | 'locker_num', |
---|
113 | 'group__name', |
---|
114 | ).select_related('space', 'space__lock_type', 'group') |
---|
115 | office_assignments = assignments.filter(locker_num='') |
---|
116 | |
---|
117 | locker_assignments = assignments.exclude(locker_num='') |
---|
118 | locker_rooms = [] |
---|
119 | room = None |
---|
120 | for assignment in locker_assignments: |
---|
121 | if room != assignment.space: |
---|
122 | room = assignment.space |
---|
123 | locker_rooms.append((room, [])) |
---|
124 | locker_rooms[-1][1].append(assignment) |
---|
125 | |
---|
126 | context = { |
---|
127 | 'offices': office_assignments, |
---|
128 | 'lockers': locker_rooms, |
---|
129 | 'pagename':'groups', |
---|
130 | } |
---|
131 | return render_to_response('space/summary.html', context, context_instance=RequestContext(request), ) |
---|
132 | |
---|
133 | def lock_types(request, ): |
---|
134 | lock_types = space.models.LockType.objects.order_by('name') |
---|
135 | context = { |
---|
136 | 'lock_types': lock_types, |
---|
137 | 'pagename': 'groups', |
---|
138 | } |
---|
139 | return render_to_response('space/lock_types.html', context, context_instance=RequestContext(request), ) |
---|