[a86a924] | 1 | # Create your views here. |
---|
[6ff04b1] | 2 | from django.contrib.auth.decorators import user_passes_test, login_required, permission_required |
---|
[9d00b42] | 3 | from django.core.exceptions import PermissionDenied |
---|
[6ff04b1] | 4 | from django.shortcuts import render_to_response, get_object_or_404, redirect |
---|
| 5 | from django.template import RequestContext, Context, Template |
---|
[2c86ed1] | 6 | from django.http import Http404, HttpResponseRedirect, HttpResponse |
---|
[6ff04b1] | 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 |
---|
[2c86ed1] | 19 | import space.dump_locker_access |
---|
| 20 | import space.dump_office_access |
---|
[6ff04b1] | 21 | |
---|
[8b68c67] | 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 | |
---|
[b2d74ac] | 44 | @login_required |
---|
[8b68c67] | 45 | def manage_access(request, pk, ): |
---|
[6ff04b1] | 46 | group = get_object_or_404(groups.models.Group, pk=pk) |
---|
[59ed3da] | 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): |
---|
[6ff04b1] | 52 | raise PermissionDenied |
---|
[59ed3da] | 53 | |
---|
[6ff04b1] | 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 = [] |
---|
[8b68c67] | 59 | changes = [] |
---|
[59ed3da] | 60 | if priv_rw: |
---|
| 61 | extras_indices = range(6) |
---|
| 62 | else: |
---|
| 63 | extras_indices = [] |
---|
| 64 | if request.method == 'POST' and priv_rw: |
---|
[8b68c67] | 65 | edited = True |
---|
| 66 | else: |
---|
| 67 | edited = False |
---|
[6ff04b1] | 68 | for assignment in assignments: |
---|
| 69 | entries = space.models.SpaceAccessListEntry.current.filter(group=group, space=assignment.space) |
---|
| 70 | if assignment.is_locker(): |
---|
[8b68c67] | 71 | pairs = locker_pairs |
---|
[6ff04b1] | 72 | else: |
---|
[8b68c67] | 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) |
---|
[59ed3da] | 82 | allow_edit = priv_rw and ((len(office_pairs) + len(locker_pairs)) > 0) |
---|
[6ff04b1] | 83 | context = { |
---|
| 84 | 'group': group, |
---|
| 85 | 'office': office_access, |
---|
| 86 | 'locker': locker_access, |
---|
| 87 | 'office_pairs': office_pairs, |
---|
| 88 | 'locker_pairs': locker_pairs, |
---|
[8b68c67] | 89 | 'changes': changes, |
---|
[59ed3da] | 90 | 'allow_edit': allow_edit, |
---|
[8b68c67] | 91 | 'extras_indices': extras_indices, |
---|
[67dd640] | 92 | 'pagename':'groups', |
---|
[6ff04b1] | 93 | } |
---|
[8b68c67] | 94 | return render_to_response('space/manage-access.html', context, context_instance=RequestContext(request), ) |
---|
[2c86ed1] | 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 |
---|
[de2f0ac] | 108 | |
---|
| 109 | def summary(request, ): |
---|
| 110 | assignments = space.models.SpaceAssignment.current.order_by( |
---|
| 111 | 'space__number', |
---|
| 112 | 'locker_num', |
---|
| 113 | 'group__name', |
---|
[f6982d4] | 114 | ).select_related('space', 'space__lock_type', 'group') |
---|
[de2f0ac] | 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, |
---|
[67dd640] | 129 | 'pagename':'groups', |
---|
[de2f0ac] | 130 | } |
---|
| 131 | return render_to_response('space/summary.html', context, context_instance=RequestContext(request), ) |
---|
[f6982d4] | 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), ) |
---|