| 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', '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), ) |
|---|