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, HttpResponseBadRequest, HttpResponseRedirect from django.core.mail import send_mail from django.conf import settings import json import requests import logging from members.models import Member, Request, Payment from members.forms import MemberForm # Logger function, you can use the same idea when implementing other loggers to other apps memberlogger = logging.getLogger(__name__) logging.basicConfig(format='[%(levelname)s]%(asctime)s %(message)s', level=settings.LOGGERLEVEL, filename=settings.LOGPATH) ''' Recaptcha is used in member applications ''' def validate_recaptcha(response): values = { 'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY, 'response': response, } url = "https://www.google.com/recaptcha/api/siteverify" headers = {'Content-type': 'application/x-www-form-urlencoded'} resp = requests.post(url, values, headers=headers) result = json.loads(resp.text) memberlogger.info(result) if not result["success"]: return False return True def send_mail_wrapper(subject, message): send_mail( subject, message, 'no-reply@sahkoinsinoorikilta.fi', ['viestintamestari@sahkoinsinoorikilta.fi'], fail_silently=False ) @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def member_list(request, *args, **kwargs): members = Member.objects.all() context = { 'member_list': members, 'member_count': len(members) } return render(request, 'member_list.html', context) @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def add_member(request, *args, **kwargs): form = MemberForm() return render(request, 'add_member.html', {'form': form}) @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def delete_member_confirm(request, *args, **kwargs): i = kwargs.pop('index', None) if i is None: return HttpResponse(status=500, error="{'error': 'No member id specified'}") else: member = Member.objects.get(id=i) form = MemberForm(instance=member) return render(request, 'delete_member_confirm.html', {'member_id': i, 'form': form}) @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def add_many_members(request, *args, **kwargs): return render(request, 'add_many_members.html', {}) @ensure_csrf_cookie @require_http_methods(["POST"]) @permission_required('members.change_member', login_url='/login') def submit_member(request, *args, **kwargs): form = MemberForm(request.POST) if form.is_valid(): form.save() logging.info("Saved new member to member register with the following info: {}".format(form)) return HttpResponseRedirect('/members') else: print(form.errors) return HttpResponse('oh shit') @ensure_csrf_cookie @require_http_methods(["POST"]) @permission_required('members.change_member', login_url='/login') def update_member(request, *args, **kwargs): 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)) return HttpResponseRedirect('/members') else: print(form.errors) return HttpResponse('oh shit') @ensure_csrf_cookie @require_http_methods(["POST"]) @permission_required('members.change_member', login_url='/login') def delete_member(request, *args, **kwargs): try: id = request.POST['id'] except KeyError: return HttpResponse(401) try: member = Member.objects.get(id=id) member.delete() return HttpResponseRedirect('/members') except: resp = HttpResponse('{"error" : "could not delete object"}') resp.status_code = 500 return resp @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def list_applications(request, *args, **kwargs): applications = Request.objects.all() application_count = len(applications) context = { 'applications': applications, 'application_count': application_count } return render(request, 'list_applications.html', context) @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def edit_member(request, *args, **kwargs): i = kwargs.pop('index', None) if i is None: return HttpResponse(status=500, error="{'error': 'No member id specified'}") else: member = Member.objects.get(id=i) form = MemberForm(instance=member) return render(request, 'edit_member.html', {'member_id': i, 'form': form}) @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def edit_application(request, *args, **kwargs): i = kwargs.pop('index', None) if i is None: return HttpResponse(status=500, error="{'error': 'No member id specified'}") else: return render(request, 'edit_application.html', {'member_id' : i}) @ensure_csrf_cookie def application_index(request, *args, **kwargs): return render(request, 'application_index.html', {}) @ensure_csrf_cookie def application_success_index(request, *args, **kwargs): return render(request, 'application_success.html', {}) @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def list_payments(request, *args, **kwargs): payments = Payment.objects.all() context = { 'payment_list': payments, 'payment_count': len(payments) } return render(request, 'payment_list.html', context) @ensure_csrf_cookie @require_http_methods(["POST"]) @permission_required('members.change_member', login_url='/login') def csv_import(request, *args, **kwargs): data = request.body.decode("utf-8") try: payload = json.loads(data) except: return HttpResponse(json.dumps({'error': 'Malformed request'}), 400) resp_data = Member.import_csv(payload['csv']) resp = HttpResponse(json.dumps(resp_data)) if resp_data['status'] == 'failure': resp.status_code = 400 memberlogger.warning('POST request failed with status code {}'.format(resp.status_code)) return resp @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def export_csv(request, *args, **kwargs): import csv response = HttpResponse() response['Content-type'] = 'text/csv' response['Accept'] = 'text/csv' response['Content-Disposition'] = 'filename; filename=members.csv' writer = csv.writer(response, csv.excel) response.write(u'\ufeff'.encode('utf8')) # BOM (optional...Excel needs it to open UTF-8 file properly) for obj in Member.objects.all(): data = obj.get_dict() field_list = map(lambda s: str(data[s]), ['id', 'first_name', 'last_name', 'email', 'POR', 'AYY', 'jas', 'created', 'paid']) writer.writerow(field_list) return response