199 lines
6.9 KiB
Python
199 lines
6.9 KiB
Python
from django.shortcuts import render
|
|
from django.contrib.auth.decorators import permission_required
|
|
from django.views.decorators.http import require_http_methods
|
|
from django.views.decorators.csrf import ensure_csrf_cookie
|
|
from django.http import HttpResponse, HttpResponseRedirect
|
|
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 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"])
|
|
@permission_required('members.change_member', login_url='/login')
|
|
def member_list(request, *args, **kwargs):
|
|
"""Render members list."""
|
|
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"])
|
|
@permission_required('members.change_member', login_url='/login')
|
|
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"])
|
|
@permission_required('members.change_member', login_url='/login')
|
|
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"])
|
|
@permission_required('members.change_member', login_url='/login')
|
|
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"])
|
|
@permission_required('members.change_member', login_url='/login')
|
|
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"])
|
|
@permission_required('members.change_member', login_url='/login')
|
|
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"])
|
|
@permission_required('members.change_member', login_url='/login')
|
|
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"])
|
|
@permission_required('members.change_member', login_url='/login')
|
|
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"])
|
|
@permission_required('members.change_member', login_url='/login')
|
|
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:
|
|
firsts = qs.filter(first_name__istartswith=self.q)
|
|
lasts = qs.filter(last_name__istartswith=self.q)
|
|
qs = firsts.union(lasts)
|
|
|
|
return qs
|