from django.shortcuts import render from django.contrib.auth.decorators import permission_required, login_required from django.utils.decorators import method_decorator from django.views.decorators.http import require_http_methods from django.views.decorators.csrf import ensure_csrf_cookie from django.http import HttpResponse, HttpResponseRedirect, JsonResponse, HttpResponseForbidden from django.core.mail import send_mail from django.conf import settings from django.utils.translation import ugettext as _ from django.forms.models import model_to_dict from dal import autocomplete import logging import html from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import authentication, permissions from members.permissions import CheckByEmailPermission from members.models import Member, Request, Payment from members.forms import MemberForm, CSVValidationError from members.tables import MemberTable from members.views.utils import * @ensure_csrf_cookie @require_http_methods(["GET"]) @login_required(login_url='/login') @permission_required('members.read_member', raise_exception=True) def member_list(request, *args, **kwargs): """Render members list.""" search = request.GET.get('q', None) if search: members = Member.find_members_by_name(search) else: members = Member.objects.all() table = MemberTable(members, request=request, exclude=['id'], attrs={'class': 'table table-bordered table-hover'}) table.paginate(page=request.GET.get('page', 1), per_page=25) table_html = convert_table_to_html(table, request) context = { 'table': table_html, 'member_count': len(members), 'notification': request.GET.get('notification', None), } return render(request, 'member_list.html', context) @ensure_csrf_cookie @require_http_methods(["GET"]) @login_required(login_url='/login') @permission_required('members.add_member', raise_exception=True) def member_add(request, *args, **kwargs): """Render add member page.""" form = MemberForm() return render(request, 'member_add.html', {'form': form}) @ensure_csrf_cookie @require_http_methods(["GET"]) @login_required(login_url='/login') @permission_required('members.delete_member', raise_exception=True) def member_delete_confirm(request, *args, **kwargs): """Render member deletion confirmation page.""" i = kwargs.pop('index', None) if i is None: return render(request, 'error.html', {'error': _('No member id specified')}) else: member = Member.objects.get(id=i) form = MemberForm(instance=member) return render(request, 'member_delete_confirm.html', {'member_id': i, 'form': form}) @ensure_csrf_cookie @require_http_methods(["GET"]) @login_required(login_url='/login') @permission_required('members.add_member', raise_exception=True) def member_add_many(request, *args, **kwargs): """Render add multiple members page.""" return render(request, 'member_add_many.html', {}) @ensure_csrf_cookie @require_http_methods(["POST"]) @login_required(login_url='/login') @permission_required('members.add_member', raise_exception=True) def add_many_confirm(request, *args, **kwargs): models = request.session['models'] try: members, payments = models.members, models.payments for member in members: member.save() for payment in payments: payment.save() msg = "Successfully imported {} members and {} payments." notification = _(msg).format(len(members), len(payments)) return HttpResponseRedirect('/members/list?notification={}'.format(html.escape(notification))) except Exception as ex: logging.exception('Failed to save models after "add many."') return error_view(request, _('Failed to import members')) @ensure_csrf_cookie @require_http_methods(["POST"]) @login_required(login_url='/login') @permission_required('members.add_member', raise_exception=True) def member_submit(request, *args, **kwargs): """Add member based on data gained from member form.""" form = MemberForm(request.POST) if form.is_valid(): form.save() logging.info("Saved new member to member register" "with the following info: {}".format(form.cleaned_data)) notification = "{} {} {}.".format(_("Successfully added member"), form.cleaned_data['last_name'], form.cleaned_data['first_name']) return HttpResponseRedirect( '/members/list?notification={}'.format(html.escape(notification))) else: return render(request, 'error.html', {'error': form.errors}) @ensure_csrf_cookie @require_http_methods(["POST"]) @login_required(login_url='/login') @permission_required('members.change_member', raise_exception=True) def member_update(request, *args, **kwargs): """Update member information.""" form = MemberForm(request.POST) if form.is_valid(): id = request.POST['id'] member = Member.objects.get(id=id) form = MemberForm(request.POST, instance=member) form.save() logging.info( "Updated member in member register with the following info: {}" .format(form)) notification = "{} {} {}.".format(_("Successfully updated member"), member.last_name, member.first_name) return HttpResponseRedirect( '/members/list?notification={}'.format(html.escape(notification))) else: return render( request, 'error.html', {'error': _('Could not update member object')}) @ensure_csrf_cookie @require_http_methods(["POST"]) @login_required(login_url='/login') @permission_required('members.delete_member', raise_exception=True) def member_delete(request, *args, **kwargs): """Delete member.""" try: id = request.POST['id'] except KeyError: return render(request, 'error.html', {'error': _('No member id specified')}) try: member = Member.objects.get(id=id) notification = "{} {} {}.".format(_("Successfully deleted member"), member.last_name, member.first_name) member.delete() logging.info( "Delete member in member register with the following id: {}" .format(id)) return HttpResponseRedirect( '/members/list?notification={}'.format(html.escape(notification))) except: return render(request, 'error.html', {'error': _('Could not delete member object')}) @ensure_csrf_cookie @require_http_methods(["GET"]) @login_required(login_url='/login') @permission_required('members.change_member', raise_exception=True) def member_edit(request, *args, **kwargs): """Edit member information.""" i = kwargs.pop('index', None) if i is None: return render( request, 'error.html', {'error': _('No member id specified')}) else: member = Member.objects.get(id=i) form = MemberForm(instance=member) return render( request, 'member_edit.html', {'member_id': i, 'form': form}) class MemberAutoComplete(autocomplete.Select2QuerySetView): def get_queryset(self): qs = Member.objects.all() if self.q: qs = Member.find_members_by_name(self.q) return qs class CheckByEmail(APIView): """Check by email""" authentication_classes = (authentication.TokenAuthentication,) permission_classes = (CheckByEmailPermission,) def get(self, request, format=None): email = request.query_params.get('email') exists = bool(email and Member.objects.filter(email=email).exists()) resp = {'exists': exists} return JsonResponse(resp)