# Create your views here. from django.contrib.auth.decorators import user_passes_test, login_required, permission_required from django.core.exceptions import PermissionDenied from django.shortcuts import render_to_response, get_object_or_404, redirect from django.template import RequestContext, Context, Template from django.http import Http404, HttpResponseRedirect, HttpResponse from django.core.urlresolvers import reverse from django.core.mail import EmailMessage, mail_admins from django import forms from django.forms import ValidationError from django.db import connection from django.db.models import Q from django.utils.safestring import mark_safe import django_filters import groups.models import space.models import space.dump_locker_access import space.dump_office_access # Note: Not a view. def process_access_changes(request, group, assignment, entries, changes, extras_indices, ): for entry in entries: key = "grant[%d][%d]" % (assignment.pk, entry.pk) if key in request.POST: pass else: changes.append(('Expire', assignment.space, entry)) entry.expire() for index in extras_indices: key = "new[%d][%d]" % (assignment.pk, index) name = request.POST.get(key+"[name]", "") if name: entry = space.models.SpaceAccessListEntry( group=group, space=assignment.space, ) entry.name = name entry.card_number = request.POST.get(key+"[card]", "") changes.append(('Add', assignment.space, entry)) entry.save() @login_required def manage_access(request, pk, ): group = get_object_or_404(groups.models.Group, pk=pk) priv_view = request.user.has_perm('groups.view_group_private_info', group) priv_admin = request.user.has_perm('groups.admin_group', group) priv_rw = priv_admin if not (priv_view or priv_admin): raise PermissionDenied office_access = group.officers(role='office-access') locker_access = group.officers(role='locker-access') assignments = space.models.SpaceAssignment.current.filter(group=group) office_pairs = [] locker_pairs = [] changes = [] if priv_rw: extras_indices = range(6) else: extras_indices = [] if request.method == 'POST' and priv_rw: edited = True else: edited = False for assignment in assignments: entries = space.models.SpaceAccessListEntry.current.filter(group=group, space=assignment.space) if assignment.is_locker(): pairs = locker_pairs else: pairs = office_pairs if edited: process_access_changes( request, group, assignment, entries.filter(), changes, extras_indices, ) pair = (assignment, entries) pairs.append(pair) allow_edit = priv_rw and ((len(office_pairs) + len(locker_pairs)) > 0) context = { 'group': group, 'office': office_access, 'locker': locker_access, 'office_pairs': office_pairs, 'locker_pairs': locker_pairs, 'changes': changes, 'allow_edit': allow_edit, 'extras_indices': extras_indices, 'pagename':'groups', } return render_to_response('space/manage-access.html', context, context_instance=RequestContext(request), ) @permission_required('groups.view_group_private_info') def dump_locker_access(request, ): response = HttpResponse(mimetype='text/csv') space_users = space.dump_locker_access.gather_users() space.dump_locker_access.print_info(space_users, response) return response @permission_required('groups.view_group_private_info') def dump_office_access(request, ): response = HttpResponse(mimetype='text/csv') space.dump_office_access.print_info(response) return response def summary(request, ): assignments = space.models.SpaceAssignment.current.order_by( 'space__number', 'locker_num', 'group__name', ).select_related('space', 'space__lock_type', 'group') office_assignments = assignments.filter(locker_num='') locker_assignments = assignments.exclude(locker_num='') locker_rooms = [] room = None for assignment in locker_assignments: if room != assignment.space: room = assignment.space locker_rooms.append((room, [])) locker_rooms[-1][1].append(assignment) context = { 'offices': office_assignments, 'lockers': locker_rooms, 'pagename':'groups', } return render_to_response('space/summary.html', context, context_instance=RequestContext(request), ) def lock_types(request, ): lock_types = space.models.LockType.objects.order_by('name') context = { 'lock_types': lock_types, 'pagename': 'groups', } return render_to_response('space/lock_types.html', context, context_instance=RequestContext(request), )