# Django core bits
from django.shortcuts import render_to_response, get_object_or_404, render
from django.template.loader import render_to_string
from django.template import RequestContext
from django.contrib.auth.decorators import permission_required
from django.db.models import Q
from django.conf import settings
from django.http import HttpResponseRedirect, Http404, HttpResponse
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from django.core.mail import EmailMessage
from django.contrib import messages
from dateutil.relativedelta import relativedelta

from datetime import datetime, date

from filetransfers.api import serve_file

# Forms
from modules.members.adminforms import MemberContactForm, MemberDocumentForm, MemberAddSubscriptionForm, MemberEditSubscriptionForm, AreaOfInterestForm, MemberGroupForm, MemberTypeForm
from modules.members.adminforms import AdminMemberUserForm, AdminAddMemberPasswordForm, AdminMemberPasswordForm, AdminAddMemberForm, AdminMemberForm, AdminMemberInvoiceForm

# Models
from modules.members.models import Member, AreaOfInterest, MemberType, MemberDirectDebit, Certificate, MemberSubscription, MemberContact
from modules.members.models import UserActivity, MemberRenewalInvoice, MemberGroup, MemberDocument, Receipt, MemberRenewal, ProfessionalChoice
from modules.meeting_booking.models import MeetingBooking
from modules.payments.models import Payment

# Others
import csv
import os
import pdfcrowd

from modules.core.decorators import staff_only
from modules.core.functions import random_string_unique, generate_random_password
from signals import renewal_confirmation
from modules.members.functions import export_members, get_next_membership_number


# Admin Definitions
@permission_required('admin_users.can_access_members')
def admin_members(request):

    letters = map(chr, range(97, 123))
    member = Member()
    final_letters = []

    for letter in letters:
        status = member.get_letter_active(letter)
        if status:
            final_letters.append(letter)

    member_types = MemberType.objects.all().order_by('name')
    areas_of_interest = AreaOfInterest.objects.all().order_by('name')

    all_members = Member.objects.filter(approved=True, member_status='current', user_type='member').order_by('-user__date_joined')
    latest_members = Member.objects.filter(approved=True, member_status='current', user_type='member').order_by('-user__date_joined')[:10]
    suspended_members = Member.objects.filter(approved=True, member_status='suspended', user_type='member').order_by('surname')

    return render(request, 'admin/members/members.html', {
        'letters': letters, 'final_letters': final_letters, 'all_members': all_members, 'latest_members': latest_members, 'suspended_members': suspended_members,
        'member_types': member_types, 'areas_of_interest': areas_of_interest
    })


@permission_required('admin_users.can_access_members')
def update_certificates(request):

    certificates = Certificate.objects.filter(id__gte=380)

    for certificate in certificates:
        client = pdfcrowd.Client("calmdigital", "dc33e7c4525620565185d0a00d90b8f0")
        client.setPageMargins('30', '50', '0', '50')
        output_file = open(os.path.join(settings.MEDIA_ROOT, 'members/certificates/membership_certificate_%s.pdf' % (certificate.id)), 'wb')
        html = render_to_string('members/certificates/view-cert-pdf.html', {'certificate': certificate}, context_instance=RequestContext(request))
        client.convertHtml(html, output_file)
        output_file.close()
        certificate.file = 'members/certificates/membership_certificate_%s.pdf' % (certificate.id)
        certificate.save()

    return HttpResponse('Ok')


@permission_required('admin_users.can_access_members')
def import_members(request):

    return HttpResponse('Ok')

    """import_members_form = ImportMembersForm()

    if request.FILES:

        import_members_form = ImportMembersForm(request.POST, request.FILES)

        if import_members_form.is_valid():

            errors = False

            filename = 'members.csv'

            #try:
            handle_uploaded_file(import_members_form.cleaned_data['file'],filename)
            #except:
            #    errors = True
            #    messages.error(request, 'Could not upload file')

            if not errors:

                    csv_file = open("%s%s" % (settings.MEDIA_ROOT, filename), "rU")
                    reader = csv.reader(csv_file)

                    line_number = 1

                    for row in reader:

                        try:
                            if row[0] != 'Title':

                                title = row[0]
                                surname = row[2]
                                first_name = row[1]

                                member_id = row[3]

                                temp_email = False

                                if is_valid_email(row[5]):
                                    member_email = row[5]
                                else:
                                    member_email = "%s.%s@svtgbimembers.org" % (first_name.lower(),surname.lower())
                                    temp_email = True

                                try:
                                    user = User.objects.get(email=member_email)

                                    messages.error(request,"%s Already Exists - Line %s" % (member_email,line_number))

                                except User.DoesNotExist:

                                    if row[7]:
                                        created = datetime.strptime(row[7],'%Y-%m-%d %H:%M:%S')
                                    else:
                                        created = None

                                    user = User(first_name=first_name,last_name=surname,email=member_email,is_active=False,date_joined=created)
                                    user.username = random_string_unique(20,User,'username')
                                    generated_password = generate_random_password(10)
                                    user.set_password(generated_password)
                                    user.save()

                                    try:
                                        member = Member.objects.get(user__email = member_email)
                                        messages.error(request,"%s already exists - Line %s" % (member_email,line_number))
                                    except Member.DoesNotExist:

                                        try:
                                            member = Member.objects.get(membership_number=member_id)
                                            messages.error(request,"%s's ID already exists for another member - Line %s" % (member_email,line_number))
                                        except:

                                            member_type = row[8]

                                            try:
                                                country = Country.objects.get(iso_code=row[21])
                                            except:
                                                country = None

                                            try:
                                                member_type = MemberType.objects.get(name=row[8])
                                            except:
                                                member_type = None

                                            if row[24] == 'No':
                                                trainee = False
                                            else:
                                                trainee = True

                                            if row[9] == '2016':
                                                expiry_date = date(2016,12,31)
                                            else:
                                                expiry_date = None

                                            if row[27]:
                                                training_commencement = datetime.strptime(row[27],'%Y-%m-%d')
                                            else:
                                                training_commencement = None

                                            if row[31]:
                                                dob = datetime.strptime(row[31],'%Y-%m-%d')
                                            else:
                                                dob = None

                                            member = Member(
                                                user=user,
                                                approved=True,
                                                paid=True,
                                                member_status='current',
                                                user_type='member',
                                                member_type=member_type,
                                                membership_number=member_id,
                                                expiry_date=expiry_date,
                                                username=row[4],
                                                title=row[0],
                                                given_name=first_name,
                                                surname=surname,
                                                date_of_birth=dob,
                                                job_title=row[22],
                                                hospital=row[14],
                                                hospital_postcode=row[15],
                                                address_1=row[16],
                                                address_2=row[17],
                                                address_3=row[32],
                                                town=row[18],
                                                county=row[19],
                                                postcode=row[20],
                                                country=country,
                                                telephone=row[23],
                                                trainee=trainee,
                                                type_of_training=row[25],
                                                other_training=row[26],
                                                training_commencement=training_commencement,
                                                other_professional_certification=row[29],
                                                temp_email=temp_email,
                                                temp_password=generated_password
                                            )
                                            member.save()

                                            if row[13] == 'No':
                                                member.paid = False
                                                member.save()

                        except Exception as e:
                            messages.error(request, 'Error on line %s %s' % (line_number, e))
                            raise e

                        line_number = line_number + 1

                    messages.success(request, 'Members have been uploaded')

                    return HttpResponseRedirect(reverse('admin_members'))

    return render(request, 'admin/members/import_members.html', {'import_members_form': import_members_form})"""


@staff_only
def send_passwords(request):

    members = Member.objects.filter(user_type='member', member_status='current', requires_password_reset=True)
    # members = Member.objects.filter(user__email='daniel@capabilitycloud.co.uk')
    # raise Exception(members)

    for member in members:

        generated_password = generate_random_password(10)
        member.user.set_password(generated_password)
        member.user.active = True
        member.user.save()

        member.raw_password = generated_password
        member.temp_password = True
        member.save()

        reset_password_notification = UserActivity(
            member=member,
            title='Please reset your password',
            text='You are currently using a temporary password, please <a href="%s">Change it to something you will remember</a>' % (reverse('change_password')),
            type='account-notification'
        )
        reset_password_notification.save()

        message = """
<p><img alt="" src="https://www.svtgbi.org.uk/static/images/logo.png" /></p>

<p>Dear Member,</p>

<p>As you may already know, The <strong style="color:#3B56A2;">SVT</strong> has launched its new website.</p>

<p>The primary reason behind this development is to increase the member benefits, automate administrative functions and decrease costs.
We have implemented a new log-in process and have tried to make this as simple as possible. It uses your email address registered with SVT,
as the user name which we hope will be easier to remember than a membership number.</p>

<p>In order to get immediate access to all the features of the new site we would ask you to follow the steps below:</p>

<ol>
    <li>Click the link at the end of this email; this will take you to the new site.</li>
    <li>When directed, use the temporary password and then change it to something you'll find easier to remember for future use.</li>
    <li>You will then be taken to your personal membership registration information page and should see all your current details, please complete any missing information (most fields are compulsory
    to ensure that we have the correct information and that can you access to the latest features of the site). Once complete, submit the information and you're done.</li>
</ol>

<p>Taking the time to confirm and complete all your account details for the new site will ensure you can access the new locker system, <strong style="color:#3B56A2;">My Locker</strong>,
which will contain any communications from the Society, enable you to store items such as certificates, receipts, booking info etc.</p>

<p>You will now be able to navigate to all areas of the site.</p>

<p><strong style="color:#3B56A2;">Your own SVT Locker:</strong><br/>
Upon successful completion of the form by providing all the details, you can begin accessing your Locker which will contain:</p>

<ul>
    <li>Any communications from the Society</li>
    <li>Store your CPD points and certificates</li>
    <li>Access membership details</li>
    <li>View your event booking history and receipts</li>
    <li>Change your password</li>
</ul>

<p>Please complete your re registration within 7 days as this will help us implement any advanced features for you.</p>

<p>We hope you will enjoy the new site and as it develops we&#39;re sure it will become a significant source of information about the Society and Vascular Technology.
If you do see any inaccuracies or broken links you can report these to the SVT using the contact us form available on every page.</p>

<p>Kind regards</p>
<p>The Society for Vascular Technology </p>


<h2 style="color:#3B56A2;">Your Login Details</h2>

<p>Link: <a href="https://%s/login">https://%s/login</a><br/>
Email Address: %s<br/>
Temporary password: %s</p>

""" % (request.META['HTTP_HOST'], request.META['HTTP_HOST'], member.user.email, generated_password)

        msg = EmailMessage('%s Website Member Registration' % settings.WEBSITE_CODE, message, 'membership@svtgbi.org.uk', [member.user.email])
        msg.content_subtype = "html"

        try:
            msg.send()
        except Exception:
            pass

    return HttpResponse('Ok')


@permission_required('admin_users.can_access_members')
def sort_subscriptions(request):

    members = Member.objects.all()

    for member in members:

        member_subscriptions = MemberSubscription.objects.filter(member=member).order_by('start_date')
        if member_subscriptions:
            start_date = member_subscriptions[0].start_date
            start_date_time = datetime(start_date.year, start_date.month, start_date.day, 12, 0, 0)
            member.user.date_joined = start_date
            member.user.save()

            member.registered = start_date_time
            member.save()

            if member.user_type == 'member':
                reversed_subscriptions = member_subscriptions.reverse()
                expiry_date = reversed_subscriptions[0].expiry_date
                member.expiry_date = expiry_date
                member.save()

    return HttpResponse('Ok')


@permission_required('admin_users.can_access_members')
def sort_expired(request):

    december_2013 = date(2013, 12, 31)

    expired_members = Member.objects.filter(user_type='member', expiry_date__lte=december_2013)
    for member in expired_members:
        member.member_status = 'archived'
        member.save()

    return HttpResponse('Ok')


@permission_required('admin_users.can_access_members')
def download_members(request):

    members = Member.objects.filter(approved=True, member_status='current', user_type='member').order_by('surname')
    response = export_members(request, members)

    return response


@permission_required('admin_users.can_access_members')
def all_members(request):

    letters = map(chr, range(97, 123))
    members = Member.objects.filter(user_type='member', approved=True, member_status='current').order_by('user__last_name')
    member_types = MemberType.objects.all().order_by('name')

    return render(request, 'admin/members/all_members.html', {'letters': letters, 'members': members, 'member_types': member_types})


@permission_required('admin_users.can_access_members')
def alpha_members(request, letter):

    letters = map(chr, range(97, 123))
    member = Member()
    final_letters = []

    for prim_letter in letters:
        status = member.get_letter_active(prim_letter)
        if status:
            final_letters.append(prim_letter)

    member_types = MemberType.objects.all().order_by('name')
    areas_of_interest = AreaOfInterest.objects.all().order_by('name')

    members = Member.objects.filter(surname__istartswith=letter, user_type='member', approved=True, member_status='current').order_by('surname')

    return render(request, 'admin/members/member_list_alpha.html', {
        'letters': letters, 'final_letters': final_letters, 'member_types': member_types, 'areas_of_interest': areas_of_interest, 'members': members, 'letter': letter
    })


@permission_required('admin_users.can_access_members')
def admin_member_list_type(request, id):

    letters = map(chr, range(97, 123))
    member = Member()
    final_letters = []

    for letter in letters:
        status = member.get_letter_active(letter)
        if status:
            final_letters.append(letter)

    member_types = MemberType.objects.all().order_by('name')
    areas_of_interest = AreaOfInterest.objects.all().order_by('name')

    member_type = get_object_or_404(MemberType, id=id)
    members = Member.objects.filter(member_type=member_type, user_type='member', approved=True, member_status='current').order_by('user__last_name')

    return render(request, 'admin/members/member_list_type.html', {
        'letters': letters, 'final_letters': final_letters, 'member_types': member_types, 'areas_of_interest': areas_of_interest, 'member_type': member_type, 'members': members
    })


@permission_required('admin_users.can_access_members')
def admin_member_list_type_download(request, id):

    member_type = get_object_or_404(MemberType, id=id)
    members = Member.objects.filter(member_type=member_type, user_type='member', approved=True, member_status='current').order_by('user__last_name')

    response = export_members(request, members)

    return response


@permission_required('admin_users.can_access_members')
def admin_member_list_area(request, id):

    letters = map(chr, range(97, 123))
    member = Member()
    final_letters = []

    for letter in letters:
        status = member.get_letter_active(letter)
        if status:
            final_letters.append(letter)

    member_types = MemberType.objects.all().order_by('name')
    areas_of_interest = AreaOfInterest.objects.all().order_by('name')

    area_of_interest = get_object_or_404(AreaOfInterest, id=id)
    members = Member.objects.filter(special_interest_groups=area_of_interest, user_type='member', approved=True, member_status='current').order_by('user__last_name')

    return render(request, 'admin/members/member_list_sig.html', {
        'letters': letters, 'final_letters': final_letters, 'member_types': member_types, 'areas_of_interest': areas_of_interest, 'area_of_interest': area_of_interest, 'members': members
    })


@permission_required('admin_users.can_access_members')
def admin_member_list_area_download(request, id):

    area = get_object_or_404(AreaOfInterest, id=id)
    members = Member.objects.filter(area_of_interest=area, user_type='member', approved=True, member_status='current').order_by('user__last_name')

    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = "attachment; filename=members.csv"

    writer = csv.writer(response)

    writer.writerow([
        'Membership Number', 'Title', 'Given Name', 'Surname', 'Email Address', 'Type', 'Registered', 'Qualifications', 'Gender', 'Address 1', 'Address 2', 'Town', 'County', 'Country',
        'Postcode', 'Telephone', 'Personal Email', 'Job Title', 'Hospital', 'Hospital Department', 'Hospital Address 1', 'Hospital Address 2', 'Hospital Town', 'Hospital County',
        'Hospital Country', 'Hospital Postcode', 'Hospital Telephone', 'Hospital Email Address', 'Preferred Mailing Address'
    ])

    for member in members:

        areas_of_interest = ''
        for area_of_interest in member.areas_of_interest.all():
            areas_of_interest = '%s%s, ' % (areas_of_interest, area_of_interest.name)

        writer.writerow([unicode(s).encode("utf-8") for s in (
            member.membership_number, member.title, member.given_name, member.surname, member.user.email, member.member_type, member.user.date_joined, member.qualifications,
            member.get_gender_display(), member.address_1, member.address_2, member.town, member.county, member.country, member.postcode, member.telephone, member.personal_email,
            member.job_title, member.hospital, member.hospital_department, member.hospital_address_1, member.hospital_address_2, member.hospital_town, member.hospital_county,
            member.hospital_country, member.hospital_postcode, member.hospital_phone, member.hospital_email, member.get_preferred_mailing_address_display()
        )])

    return response


@permission_required('admin_users.can_access_members')
def load_member(request):

    if request.POST:

        if request.POST.get('membership_number'):
            try:
                member = Member.objects.get(Q(user_type='non-member') | Q(user_type='member', approved=True), membership_number=request.POST['membership_number'])
                return HttpResponseRedirect(reverse('view_member', args=[member.id]))
            except Exception:
                messages.error(request, 'Member with that number was not found.')
                return HttpResponseRedirect(reverse('admin_members'))
    else:
        messages.error(request, 'Could not load member')

    return HttpResponseRedirect(reverse('admin_members'))


@permission_required('admin_users.can_access_members')
def search_name(request):

    letters = map(chr, range(97, 123))
    member = Member()
    final_letters = []

    for letter in letters:
        status = member.get_letter_active(letter)
        if status:
            final_letters.append(letter)

    member_types = MemberType.objects.all().order_by('name')
    areas_of_interest = AreaOfInterest.objects.all().order_by('name')

    if request.POST:
        if request.POST.get('member_name'):

            member_name = request.POST['member_name']
            members = Member.objects.filter(
                Q(given_name__icontains=request.POST['member_name']) | Q(surname__icontains=request.POST['member_name']), Q(user_type='non-member') | Q(user_type='member', approved=True)
            ).order_by('surname')

            return render(request, 'admin/members/search-name.html', {
                'letters': letters, 'final_letters': final_letters, 'member_types': member_types, 'areas_of_interest': areas_of_interest, 'member_name': member_name, 'members': members
            })
        else:
            messages.error(request, 'Could not search for members')
    else:
        messages.error(request, 'Could not search for members')

    return HttpResponseRedirect(reverse('admin_members'))


@permission_required('admin_users.can_access_members')
def renewal(request):

    renewals = MemberRenewal.objects.filter(paid=False).order_by('-created')

    return render_to_response('admin/members/renewal/renewals.html', {'renewals': renewals}, context_instance=RequestContext(request))


@permission_required('admin_users.can_access_members')
def mark_paid_renewal(request, id):

    renewal = get_object_or_404(MemberRenewal, id=id, paid=False)
    member = renewal.member

    member_type = member.member_type
    current_expiry = member.expiry_date

    start_date = current_expiry + relativedelta(days=+1)
    end_date = start_date+relativedelta(months=+12, days=-1)

    member.expiry_date = end_date
    member.save()

    subscription_name = '%s Membership Subscription (%s)' % (member_type.name, start_date.strftime('%B %Y'))

    member_subscription = MemberSubscription(
        member=member,
        member_type=member_type,
        subscription=subscription_name,
        amount=member_type.renewal_fee,
        discount=0,
        total=member_type.renewal_fee,
        invoice_to=member,
        status='current',
        start_date=start_date,
        expiry_date=end_date,
        invoice_created=date.today())
    member_subscription.save()

    receipt_name = '%s Membership Subscription (%s)' % (settings.WEBSITE_NAME, start_date.strftime('%B %Y'))
    receipt = Receipt(member=member, name=receipt_name, start_date=start_date, amount_paid=member_type.renewal_fee, payment_type=renewal.payment_method, member_subscription=member_subscription)
    receipt.save()

    try:
        client = pdfcrowd.Client("calmdigital", "dc33e7c4525620565185d0a00d90b8f0")
        client.setPageMargins('50', '50', '0', '50')
        client.setFooterHtml('<p style="font-size:12px; text-align:center;">The Society for Vascular Technology of Great Britain and Ireland %s</p>' % (date.today().strftime('%d/%m/%Y')))
        output_file = open(os.path.join(settings.MEDIA_ROOT, 'members/receipts/membership_renewal_%s.pdf' % (receipt.id)), 'wb')
        html = render_to_string('members/receipts/view-receipt-pdf.html', {'receipt': receipt})
        client.convertHtml(html, output_file)
        output_file.close()
    except Exception:
        pass

    receipt.file = 'members/receipts/membership_renewal_%s.pdf' % (receipt.id)
    receipt.save()

    # create certificate pdf
    certificate = Certificate(member=member, start_date=member_subscription.start_date, end_date=member_subscription.expiry_date)
    certificate.save()

    try:
        client = pdfcrowd.Client("calmdigital", "dc33e7c4525620565185d0a00d90b8f0")
        client.setPageMargins('30', '50', '0', '50')
        output_file = open(os.path.join(settings.MEDIA_ROOT, 'members/certificates/membership_certificate_%s.pdf' % (certificate.id)), 'wb')
        html = render_to_string('members/certificates/view-cert-pdf.html', {'certificate': certificate}, context_instance=RequestContext(request))
        client.convertHtml(html, output_file)
        output_file.close()
    except Exception:
        pass

    certificate.file = 'members/certificates/membership_certificate_%s.pdf' % (certificate.id)
    certificate.save()

    renewal_confirmation.send(sender=None, member=member, subscription=member_subscription, method='Invoice', receipt=receipt, certificate=certificate, notify_admin=False)

    notification = UserActivity(
        member=member, type='account-notification', title='Membership Renewed',
        text='Your membership has been successfully renewed.<br/>Visit <a href="%s">My Receipts</a> to view your receipt.' % (reverse('my_receipts'))
    )
    notification.save()

    renewal.paid = True
    renewal.save()

    messages.success(request, 'Invoice has been marked as paid, Member has been notified')

    return HttpResponseRedirect(reverse('admin_members_renewal'))


@permission_required('admin_users.can_access_members')
def delete_renewal(request, id):

    renewal = get_object_or_404(MemberRenewal, id=id)

    renewal.delete()
    messages.success(request, 'Renewal Request Deleted')

    return HttpResponseRedirect(reverse('admin_members_renewal'))


@permission_required('admin_users.can_access_members')
def renewal_invoices(request):

    pending_invoices = MemberRenewalInvoice.objects.filter(paid=False).order_by('-created')

    return render_to_response('admin/members/invoices/invoices.html', {'pending_invoices': pending_invoices}, context_instance=RequestContext(request))


@permission_required('admin_users.can_access_members')
def download_renewal_invoices(request):

    pending_invoices = MemberRenewalInvoice.objects.filter(paid=False).order_by('-created')

    print(pending_invoices)


@permission_required('admin_users.can_access_members')
def view_renewal_invoice(request, id):

    invoice = get_object_or_404(MemberRenewalInvoice, id=id)

    return render(request, 'admin/members/invoices/view-invoice.html', {'invoice': invoice})


@permission_required('admin_users.can_access_members')
def mark_paid_invoice(request, id):

    invoice = get_object_or_404(MemberRenewalInvoice, id=id, paid=False)
    member = invoice.member

    member_type = member.member_type
    current_expiry = member.expiry_date

    start_date = current_expiry + relativedelta(days=+1)

    if member_type.subscription_length == '3-months':
        end_date = current_expiry+relativedelta(months=+3, days=-1)
    elif member_type.subscription_length == '6-months':
        end_date = start_date+relativedelta(months=+6, days=-1)
    else:
        end_date = start_date+relativedelta(months=+12, days=-1)

    member.expiry_date = end_date
    member.save()

    subscription_name = '%s Membership Subscription (%s)' % (member_type.name, start_date.strftime('%B %Y'))

    member_subscription = MemberSubscription(
        member=member,
        member_type=member_type,
        subscription=subscription_name,
        amount=member_type.renewal_fee,
        discount=0,
        total=member_type.renewal_fee,
        invoice_to=invoice.organisation_name,
        status='current',
        start_date=start_date,
        expiry_date=end_date,
        invoice_created=date.today())
    member_subscription.save()

    receipt_name = '%s Membership Subscription (%s)' % (settings.WEBSITE_NAME, start_date.strftime('%B %Y'))
    receipt = Receipt(member=member, name=receipt_name, start_date=start_date, amount_paid=member_type.renewal_fee, payment_type='Invoice', member_subscription=member_subscription)
    receipt.save()

    try:
        client = pdfcrowd.Client("calmdigital", "dc33e7c4525620565185d0a00d90b8f0")
        client.setPageMargins('50', '50', '0', '50')
        client.setFooterHtml('<p style="font-size:12px; text-align:center;">The Society for Vascular Technology of Great Britain and Ireland %s</p>' % (date.today().strftime('%d/%m/%Y')))
        output_file = open(os.path.join(settings.MEDIA_ROOT, 'members/receipts/membership_renewal_%s.pdf' % (receipt.id)), 'wb')
        html = render_to_string('members/receipts/view-receipt-pdf.html', {'receipt': receipt})
        client.convertHtml(html, output_file)
        output_file.close()
    except Exception:
        pass

    receipt.file = 'members/receipts/membership_renewal_%s.pdf' % (receipt.id)
    receipt.save()

    # create certificate pdf
    certificate = Certificate(member=member, start_date=member_subscription.start_date, end_date=member_subscription.expiry_date)
    certificate.save()

    try:
        client = pdfcrowd.Client("calmdigital", "dc33e7c4525620565185d0a00d90b8f0")
        client.setPageMargins('50', '50', '0', '50')
        output_file = open(os.path.join(settings.MEDIA_ROOT, 'members/certificates/membership_certificate_%s.pdf' % (certificate.id)), 'wb')
        html = render_to_string('members/certificates/view-cert-pdf.html', {'certificate': certificate}, context_instance=RequestContext(request))
        client.convertHtml(html, output_file)
        output_file.close()
    except Exception:
        pass

    certificate.file = 'members/certificates/membership_certificate_%s.pdf' % (certificate.id)
    certificate.save()

    renewal_confirmation.send(sender=None, member=member, subscription=member_subscription, method='Invoice', receipt=receipt, certificate=certificate, notify_admin=False)

    notification = UserActivity(
        member=member, type='account-notification', title='Membership Renewed',
        text='Your membership has been successfully renewed.<br/>Visit <a href="%s">My Receipts</a> to view your receipt.' % (reverse('my_receipts'))
    )
    notification.save()

    invoice.paid = True
    invoice.save()

    messages.success(request, 'Invoice has been marked as paid, Member has been notified')

    return HttpResponseRedirect(reverse('admin_members_renewal_invoices'))


@permission_required('admin_users.can_access_members')
def delete_renewal_invoice(request, id):

    invoice = get_object_or_404(MemberRenewalInvoice, id=id)
    try:
        invoice.delete()
        messages.success(request, 'Invoice Deleted')
    except Exception:
        messages.error(request, 'Could not delete invoice')

    return HttpResponseRedirect(reverse('admin_members_renewal_invoices'))


@permission_required('admin_users.can_access_members')
def admin_add_member(request):

    member_user_form = AdminMemberUserForm()
    member_password_form = AdminAddMemberPasswordForm()
    member_form = AdminAddMemberForm()
    member_form.fields['professional_certification'].queryset = ProfessionalChoice.objects.all()
    invoice_form = AdminMemberInvoiceForm()

    if request.POST:
        member_user_form = AdminMemberUserForm(request.POST)
        member_password_form = AdminAddMemberPasswordForm(request.POST)
        member_form = AdminAddMemberForm(request.POST)
        member_form.fields['professional_certification'].queryset = ProfessionalChoice.objects.all()
        invoice_form = AdminMemberInvoiceForm(request.POST)

        try:
            member = Member.objects.get(user__email=request.POST['email'])

            if member.member_type == 'delegate':
                member_type = 'A Delegate'
                member_url = reverse('admin_members_view_delegate', args=[member.id])
            else:
                member_url = reverse('view_member', args=[member.id])
                member_type = member.get_member_status_display()

            messages.error(request, 'Email Address already exists, user is %s <a href="%s">View Profile</a>' % (member_type, member_url))

        except Member.DoesNotExist:
            pass

        if member_user_form.is_valid() and member_password_form.is_valid() and member_form.is_valid() and invoice_form.is_valid():

            try:

                user = member_user_form.save(commit=False)
                user.set_password(request.POST['password1'])
                user.username = random_string_unique(20, User, 'username')
                user.save()

                member = member_form.save(commit=False)
                member.user = user
                member.approved = True
                member.complete = True
                member.paid = True
                member.member_status = 'current'
                member.membership_number = get_next_membership_number()
                member.save()

                invoice_form = AdminMemberInvoiceForm(request.POST, instance=member)

                if member.given_name:
                    user.first_name = member.given_name
                if member.surname:
                    user.last_name = member.surname
                user.save()

                messages.success(request, 'Member Created')
                return HttpResponseRedirect(reverse('admin_members'))

            except Exception as e:
                messages.error(request, 'Could not add Member %s' % (e))

        else:

            messages.error(request, 'Could not save the details, please ensure all the fields have been entered correctly.')

    return render(request, 'admin/members/add_member.html', {
        'member_user_form': member_user_form, 'member_password_form': member_password_form, 'member_form': member_form, 'invoice_form': invoice_form
    })


@permission_required('admin_users.can_access_members')
def admin_view_member(request, id):

    member = get_object_or_404(Member, id=id)

    payments = Payment.objects.filter(member=member).exclude(status='pending').order_by('-created')
    member_direct_debits = MemberDirectDebit.objects.filter(member=member)
    meeting_bookings = MeetingBooking.objects.filter(member=member, complete=True).order_by('-time')[:5]
    member_subscriptions = MemberSubscription.objects.filter(member=member).order_by('-expiry_date')[:5]
    member_contacts = MemberContact.objects.filter(member=member).order_by('-contact_date')[:5]
    member_documents = MemberDocument.objects.filter(member=member).order_by('-created')

    return render(request, 'admin/members/view-member.html', {
        'member': member, 'payments': payments, ' member_direct_debits': member_direct_debits, 'meeting_bookings': meeting_bookings,
        'member_subscriptions': member_subscriptions, 'member_contacts': member_contacts, 'member_documents': member_documents
    })


@permission_required('admin_users.can_access_members')
def download_referrer_letter(request, id):

    member = get_object_or_404(Member, id=id)
    if member.referrer_letter:
        response = HttpResponse()
        response["Cache-Control"] = "no-cache"
        response["Accept-Ranges"] = "none"
        response["Content-Disposition"] = "attachment; filename=%s" % member.get_referrer_letter_filename()
        response.write(open(settings.PRIVATE_FILES + '/' + member.referrer_letter.name).read())
        return response
    else:
        raise Http404


@permission_required('admin_users.can_access_members')
def admin_edit_member(request, id):

    member = get_object_or_404(Member, id=id)

    member_user_form = AdminMemberUserForm(instance=member.user)
    member_password_form = AdminMemberPasswordForm()
    member_form = AdminMemberForm(instance=member)
    invoice_form = AdminMemberInvoiceForm(instance=member)

    initial_email = member.user.email

    if request.POST:
        member_user_form = AdminMemberUserForm(request.POST, instance=member.user)
        member_password_form = AdminMemberPasswordForm(request.POST)
        member_form = AdminMemberForm(request.POST, request.FILES, instance=member)
        invoice_form = AdminMemberInvoiceForm(request.POST, instance=member)

        if member_user_form.is_valid() and member_form.is_valid() and invoice_form.is_valid():

            password_error = False
            new_password = False

            if request.POST.get('password1'):

                if not member_password_form.is_valid():
                    password_error = True
                new_password = request.POST['password1']

            if not password_error:

                member_user_form.save()

                if new_password:
                    member.user.set_password(request.POST['password1'])
                    member.user.save()

                member_form.save()

                if member.given_name:
                    member.user.first_name = member.given_name
                if member.surname:
                    member.user.last_name = member.surname

                member.user.save()

                if member.temp_email:
                    if initial_email != member.user.email:
                        member.temp_email = False
                        member.save()

                invoice_form.save()

                messages.success(request, 'Member Updated')
                return HttpResponseRedirect(reverse('view_member', args=[member.id]))

        else:
            messages.error(request, 'Could not save the details, please ensure all the fields have been entered correctly.')

    return render(request, 'admin/members/edit_member.html', {
        'member': member, 'member_user_form': member_user_form, 'member_password_form': member_password_form, 'member_form': member_form, 'invoice_form': invoice_form
    })


@permission_required('admin_users.can_access_members')
def admin_delete_member(request, id):

    member = get_object_or_404(Member, id=id)

    member.user.delete()
    messages.success(request, 'Member has been deleted')

    return HttpResponseRedirect(reverse('admin_members'))


@permission_required('admin_users.can_access_members')
def admin_activate_member(request, id):
    member = get_object_or_404(Member, id=id)

    member.member_status = 'current'
    member.save()

    messages.success(request, 'Member has been Re-Activated')

    return HttpResponseRedirect(reverse('view_member', args=[member.id]))


@permission_required('admin_users.can_access_members')
def admin_archive_member(request, id):

    member = get_object_or_404(Member, id=id)

    member.member_status = 'archived'
    member.save()

    messages.success(request, 'Member Archived')

    return HttpResponseRedirect(reverse('admin_members'))


@permission_required('admin_users.can_access_members')
def admin_suspend_member(request, id):

    member = get_object_or_404(Member, id=id)

    member.member_status = 'suspended'
    member.save()

    messages.success(request, 'Member Marked as Suspended')

    return HttpResponseRedirect(reverse('admin_members_lapsed_members'))


@permission_required('admin_users.can_access_members')
def change_status(request, id, status):

    member = get_object_or_404(Member, id=id)
    today = date.today()

    if status == 'current':
        if member.member_status != 'current':
            member.member_status = 'current'
            member.save()
            messages.success(request, 'Status Updated to <strong>Current</strong>')
        else:
            messages.warning(request, 'Member is Already Current')

    elif status == 'lapsed':
        if member.member_status != 'lapsed':
            member.member_status = 'lapsed'
            member.lapsed_date = today
            member.save()
            messages.success(request, 'Status Updated to <strong>Lapsed</strong>')
        else:
            messages.warning(request, 'Member is Already Lapsed')

    elif status == 'suspended':
        if member.member_status != 'suspended':
            member.member_status = 'suspended'
            member.save()
            messages.success(request, 'Status Updated to <strong>Suspended</strong>')
        else:
            messages.warning(request, 'Member is Already Suspended')
    elif status == 'archived':
        if member.member_status != 'archived':
            member.member_status = 'archived'
            member.save()
            messages.success(request, 'Status Updated to <strong>Archived</strong>')
        else:
            messages.warning(request, 'Member is Already Archived')
    elif status == 'pending':
        if member.member_status != 'pending':
            member.member_status = 'pending'
            member.approved = False
            member.complete = True
            member.save()
            messages.success(request, 'Status Updated to <strong>Pending</strong>')
    else:
        messages.error(request, 'Could not change members status')

    return HttpResponseRedirect(reverse('view_member', args=[member.id]))


@permission_required('admin_users.can_access_members')
def member_subscriptions(request, id):

    member = get_object_or_404(Member, id=id)
    member_subscriptions = MemberSubscription.objects.filter(member=member).order_by('-expiry_date')

    return render(request, 'admin/members/subscriptions/all-subscriptions.html', {'member': member, 'member_subscriptions': member_subscriptions})


@permission_required('admin_users.can_access_members')
def add_member_subscription(request, id):

    member = get_object_or_404(Member, id=id)
    subscription_form = MemberAddSubscriptionForm()

    if request.POST:
        subscription_form = MemberAddSubscriptionForm(request.POST)

        if subscription_form.is_valid():

            subscription = subscription_form.save(commit=False)
            subscription.member = member
            subscription.save()

            if subscription.renew_membership:
                member.expiry_date = subscription.expiry_date
                member.save()

                receipt_name = '%s Membership Subscription (%s)' % (settings.WEBSITE_NAME, subscription.start_date.strftime('%B %Y'))
                receipt = Receipt(
                    member=member, name=receipt_name, start_date=subscription.start_date, amount_paid=subscription.total, payment_type=subscription.method, member_subscription=subscription
                )
                receipt.save()

                try:
                    client = pdfcrowd.Client("calmdigital", "dc33e7c4525620565185d0a00d90b8f0")
                    client.setPageMargins('50', '50', '0', '50')
                    client.setFooterHtml('<p style="font-size:12px; text-align:center;">The Society for Vascular Technology of Great Britain and Ireland %s</p>' % (date.today().strftime('%d/%m/%Y')))
                    output_file = open(os.path.join(settings.MEDIA_ROOT, 'members/receipts/membership_renewal_%s.pdf' % (receipt.id)), 'wb')
                    html = render_to_string('members/receipts/view-receipt-pdf.html', {'receipt': receipt})
                    client.convertHtml(html, output_file)
                    client.setFooterHtml('<p style="font-size:12px; text-align:center;">The Society for Vascular Technology of Great Britain and Ireland %s</p>' % (date.today().strftime('%d/%m/%Y')))
                    output_file.close()
                except Exception:
                    pass

                receipt.file = 'members/receipts/membership_renewal_%s.pdf' % (receipt.id)
                receipt.save()

                # create certificate pdf
                certificate = Certificate(member=member, start_date=subscription.start_date, end_date=subscription.expiry_date)
                certificate.save()

                try:
                    client = pdfcrowd.Client("calmdigital", "dc33e7c4525620565185d0a00d90b8f0")
                    client.setPageMargins('50', '50', '0', '50')
                    output_file = open(os.path.join(settings.MEDIA_ROOT, 'members/certificates/membership_certificate_%s.pdf' % (certificate.id)), 'wb')
                    html = render_to_string('members/certificates/view-cert-pdf.html', {'certificate': certificate}, context_instance=RequestContext(request))
                    client.convertHtml(html, output_file)
                    output_file.close()
                    certificate.file = 'members/certificates/membership_certificate_%s.pdf' % (certificate.id)
                    certificate.save()
                except Exception:
                    pass

                renewal_confirmation.send(
                    sender=None, request=request, member=member, subscription=subscription, method=subscription.method, receipt=receipt, certificate=certificate, notify_admin=False
                )

                notification = UserActivity(
                    member=member, type='account-notification', title='Membership Renewed',
                    text='Your membership has been successfully renewed.<br/>Visit <a href="%s">My Receipts</a> to view your receipt.' % (reverse('my_receipts'))
                )
                notification.save()

                messages.success(request, 'Subscription Added - Member has been renewed and notified')

            else:
                messages.success(request, 'Subscription Added')

            if member.user_type == 'delegate':
                return HttpResponseRedirect(reverse('admin_members_view_delegate', args=[member.id]))
            else:
                return HttpResponseRedirect(reverse('view_member', args=[member.id]))

    return render(request, 'admin/members/subscriptions/add-subscription.html', {'member': member, 'subscription_form': subscription_form})


@permission_required('admin_users.can_access_members')
def download_member_subscriptions(request, id):

    member = get_object_or_404(Member, id=id)
    subscriptions = MemberSubscription.objects.filter(member=member)

    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = "attachment; filename=%s-Subscriptions-.csv" % (member.membership_number)

    writer = csv.writer(response)
    writer.writerow(['Subscription', 'Amount (GBP)', 'Discount (GBP)', 'Total (GBP)', 'Invoice To', 'Status', 'Start Date', 'Expiry Date', 'Invoice Created', 'Payment Method'])

    for subscription in subscriptions:
        writer.writerow([unicode(s).encode("utf-8") for s in (
            subscription.subscription, subscription.amount, subscription.discount, subscription.total, subscription.invoice_to, subscription.get_status_display(),
            subscription.start_date, subscription.expiry_date, subscription.invoice_created, subscription.method
        )])

    return response


@permission_required('admin_users.can_access_members')
def view_member_subscription(request, id, subscription_id):

    member = get_object_or_404(Member, id=id)
    member_subscription = get_object_or_404(MemberSubscription, id=subscription_id, member=member)

    return render(request, 'admin/members/subscriptions/view-subscription.html', {'member': member, 'member_subscription': member_subscription})


@permission_required('admin_users.can_access_members')
def edit_member_subscription(request, id, subscription_id):

    member = get_object_or_404(Member, id=id)
    member_subscription = get_object_or_404(MemberSubscription, id=subscription_id, member=member)

    subscription_form = MemberEditSubscriptionForm(instance=member_subscription)

    if request.POST:

        subscription_form = MemberEditSubscriptionForm(request.POST, instance=member_subscription)

        if subscription_form.is_valid():

            try:
                subscription_form.save()

                messages.success(request, 'Transaction has been saved')

                if member.user_type == 'delegate':
                    return HttpResponseRedirect(reverse('admin_members_view_delegate', args=[member.id]))
                else:
                    return HttpResponseRedirect(reverse('view_member', args=[member.id]))

            except Exception:
                messages.error(request, 'Could not save subscription')

    return render(request, 'admin/members/subscriptions/edit-subscription.html', {'member': member, 'member_subscription': member_subscription, 'subscription_form': subscription_form})


@permission_required('admin_users.can_access_members')
def delete_member_subscription(request, id, subscription_id):

    member = get_object_or_404(Member, id=id)
    member_subscription = get_object_or_404(MemberSubscription, id=subscription_id, member=member)

    try:
        member_subscription.delete()

        messages.success(request, 'Transaction has been deleted')
    except Exception:
        messages.error(request, 'Could not delete subscription')

    if member.user_type == 'delegate':
        return HttpResponseRedirect(reverse('admin_members_view_delegate', args=[member.id]))
    else:
        return HttpResponseRedirect(reverse('view_member', args=[member.id]))


@permission_required('admin_users.can_access_members')
def member_contacts(request, id):

    member = get_object_or_404(Member, id=id)
    member_contacts = MemberContact.objects.filter(member=member).order_by('-contact_date')

    return render(request, 'admin/members/contacts/all-contacts.html', {'member': member, 'member_contacts': member_contacts})


@permission_required('admin_users.can_access_members')
def add_member_contact(request, id):

    member = get_object_or_404(Member, id=id)
    contact_form = MemberContactForm()

    if request.POST:
        contact_form = MemberContactForm(request.POST)

        if contact_form.is_valid():

            contact = contact_form.save(commit=False)
            contact.member = member
            contact.save()

            messages.success(request, 'Contact Added')

            if member.user_type == 'delegate':
                return HttpResponseRedirect(reverse('admin_members_view_delegate', args=[member.id]))
            else:
                return HttpResponseRedirect(reverse('view_member', args=[member.id]))

    return render_to_response('admin/members/contacts/add-contact.html', {'member': member, 'contact_form': contact_form}, context_instance=RequestContext(request))


@permission_required('admin_users.can_access_members')
def download_member_contacts(request, id):

    member = get_object_or_404(Member, id=id)
    contacts = MemberContact.objects.filter(member=member)

    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = "attachment; filename=%s-Contacts-.csv" % (member.membership_number)

    writer = csv.writer(response)
    writer.writerow(['Contact Date', 'Contact Type', 'Category', 'Subject', 'Operator', 'Closed'])

    for contact in contacts:
        writer.writerow([unicode(s).encode("utf-8") for s in (contact.contact_date, contact.contact_type, contact.category, contact.subject, contact.operator, contact.closed)])

    return response


@permission_required('admin_users.can_access_members')
def view_member_contact(request, id, contact_id):

    member = get_object_or_404(Member, id=id)
    member_contact = get_object_or_404(MemberContact, id=contact_id, member=member)

    return render(request, 'admin/members/contacts/view-contact.html', {'member': member, 'member_contact': member_contact})


@permission_required('admin_users.can_access_members')
def edit_member_contact(request, id, contact_id):

    member = get_object_or_404(Member, id=id)
    member_contact = get_object_or_404(MemberContact, id=contact_id, member=member)

    contact_form = MemberContactForm(instance=member_contact)

    if request.POST:

        contact_form = MemberContactForm(request.POST, instance=member_contact)

        if contact_form.is_valid():

            contact_form.save()

            messages.success(request, 'Contact has been saved')

            if member.user_type == 'delegate':
                return HttpResponseRedirect(reverse('admin_members_view_delegate', args=[member.id]))
            else:
                return HttpResponseRedirect(reverse('view_member', args=[member.id]))

    return render(request, 'admin/members/contacts/edit-contact.html', {
        'member': member, 'member_contact': member_contact, 'contact_form': contact_form
    })


@permission_required('admin_users.can_access_members')
def delete_member_contact(request, id, contact_id):

    member = get_object_or_404(Member, id=id)
    member_contact = get_object_or_404(MemberContact, id=contact_id, member=member)

    member_contact.delete()
    messages.success(request, 'Contact has been deleted')

    if member.user_type == 'delegate':
        return HttpResponseRedirect(reverse('admin_members_view_delegate', args=[member.id]))
    else:
        return HttpResponseRedirect(reverse('view_member', args=[member.id]))


@permission_required('admin_users.can_access_members')
def add_document(request, id):

    member = get_object_or_404(Member, id=id)
    document_form = MemberDocumentForm()

    if request.POST:
        document_form = MemberDocumentForm(request.POST, request.FILES)

        if document_form.is_valid():

            # try:
            document = document_form.save(commit=False)
            document.member = member
            document.save()

            notification = UserActivity(
                member=member, title='New Document Added', type='general-notification',
                text='The document <strong>%s</strong> has been added to your documents, you can view this in <a href="%s">My Documents</a>' % (document.title, reverse('account_documents')),
            )
            notification.save()

            messages.success(request, 'Document has been created.')

            return HttpResponseRedirect(reverse('view_member', args=[member.id]))

            # except:
            #    messages.error(request, 'Could not add document.')

    return render(request, 'admin/members/documents/add-document.html', {'member': member, 'document_form': document_form})


@permission_required('admin_users.can_access_members')
def download_document(request, id, document_id):

    member = get_object_or_404(Member, id=id)
    document = get_object_or_404(MemberDocument, id=document_id)

    if document.document:
        return serve_file(request, document.document, save_as=True)
    else:
        messages.error(request, 'Sorry there is no file associated with this document.')

    return HttpResponseRedirect(reverse('view_member', args=[member.id]))


@permission_required('admin_users.can_access_members')
def edit_document(request, id, document_id):

    member = get_object_or_404(Member, id=id)
    document = get_object_or_404(MemberDocument, id=document_id)
    document_form = MemberDocumentForm(instance=document)

    if request.POST:
        document_form = MemberDocumentForm(request.POST, request.FILES, instance=document)

        if document_form.is_valid():

            document.save()
            messages.success(request, 'Document has been updated.')

            return HttpResponseRedirect(reverse('view_member', args=[member.id]))

    return render(request, 'admin/members/documents/edit-document.html', {'member': member, 'document': document, 'document_form': document_form})


@permission_required('admin_users.can_access_members')
def delete_document(request, id, document_id):

    member = get_object_or_404(Member, id=id)
    document = get_object_or_404(MemberDocument, id=document_id)

    document.delete()
    messages.success(request, 'Document has been deleted.')

    return HttpResponseRedirect(reverse('view_member', args=[member.id]))


@permission_required('admin_users.can_access_members')
def member_types(request):

    member_types = MemberType.objects.all().order_by('name')

    return render_to_response('admin/members/types/member-types.html', {'member_types': member_types}, context_instance=RequestContext(request))


@permission_required('admin_users.can_access_members')
def add_member_type(request):

    form = MemberTypeForm()

    if request.POST:
        form = MemberTypeForm(request.POST)

        if form.is_valid():
            form.save()
            messages.success(request, 'Member Type Created')

            return HttpResponseRedirect(reverse('admin_member_types'))

    return render_to_response('admin/members/types/add_member_type.html', {'form': form}, context_instance=RequestContext(request))


@permission_required('admin_users.can_access_members')
def edit_member_type(request, type_id):

    member_type = get_object_or_404(MemberType, id=type_id)

    form = MemberTypeForm(instance=member_type)

    if request.POST:
        form = MemberTypeForm(request.POST, request.FILES, instance=member_type)

        if form.is_valid():
            form.save()
            messages.success(request, 'Member Type Updated')

            return HttpResponseRedirect(reverse('admin_member_types'))

    return render_to_response('admin/members/types/edit_member_type.html', {'member_type': member_type, 'form': form}, context_instance=RequestContext(request))


@permission_required('admin_users.can_access_members')
def delete_member_type(request, type_id):

    member_type = get_object_or_404(MemberType, id=type_id)

    member_type.delete()
    messages.success(request, 'Member Type has been deleted')

    return HttpResponseRedirect(reverse('admin_member_types'))


@permission_required('admin_users.can_access_members')
def admin_member_groups(request):

    member_groups = MemberGroup.objects.all().order_by('order')

    return render_to_response('admin/members/groups/member_groups.html', {'member_groups': member_groups}, context_instance=RequestContext(request))


@permission_required('admin_users.can_access_members')
def admin_member_group_add(request):

    form = MemberGroupForm()

    if request.POST:
        form = MemberGroupForm(request.POST)

        if form.is_valid():
            form.save()
            messages.success(request, 'Member Group Added')

            return HttpResponseRedirect(reverse('admin_member_groups'))

    return render_to_response('admin/members/groups/add_member_group.html', {'form': form}, context_instance=RequestContext(request))


@permission_required('admin_users.can_access_members')
def admin_member_group_edit(request, group_id):

    member_group = get_object_or_404(MemberGroup, id=group_id)

    form = MemberGroupForm(instance=member_group)

    if request.POST:
        form = MemberGroupForm(request.POST, instance=member_group)

        if form.is_valid():
            form.save()
            messages.success(request, 'Member Group Updated')

            return HttpResponseRedirect(reverse('admin_member_groups'))

    return render_to_response('admin/members/groups/edit_member_group.html', {'member_group': member_group, 'form': form}, context_instance=RequestContext(request))


@permission_required('admin_users.can_access_members')
def admin_member_group_delete(request, group_id):

    member_group = get_object_or_404(MemberGroup, d=group_id)

    member_group.delete()
    messages.success(request, 'Member Group has been deleted')

    return HttpResponseRedirect(reverse('admin_member_groups'))


@permission_required('admin_users.can_access_members')
def areas_of_interest(request):

    areas_of_interest = AreaOfInterest.objects.all()

    return render(request, 'admin/members/areas_of_interest/areas_of_interest.html', {
        'areas_of_interest': areas_of_interest
    })


@permission_required('admin_users.can_access_members')
def add_area_of_interest(request):

    form = AreaOfInterestForm()

    if request.POST:
        form = AreaOfInterestForm(request.POST)

        if form.is_valid():
            form.save()
            messages.success(request, 'Area of interest Added')

            return HttpResponseRedirect(reverse('admin_members_areas_of_interest'))

    return render(request, 'admin/members/areas_of_interest/add_area_of_interest.html', {
        'form': form
    })


@permission_required('admin_users.can_access_members')
def edit_area_of_interest(request, area_id):

    area = get_object_or_404(AreaOfInterest, id=area_id)

    form = AreaOfInterestForm(instance=area)

    if request.POST:
        form = AreaOfInterestForm(request.POST, instance=area)

        if form.is_valid():
            form.save()
            messages.success(request, 'Area of Interest Updated')

        return HttpResponseRedirect(reverse('admin_members_areas_of_interest'))

    return render(request, 'admin/members/areas_of_interest/edit_area_of_interest.html', {
        'area_of_interest': area, 'form': form
    })


@permission_required('admin_users.can_access_members')
def delete_area_of_interest(request, area_id):

    area = get_object_or_404(AreaOfInterest, id=area_id)

    area.delete()
    messages.success(request, 'Area of Interest has been deleted')

    return HttpResponseRedirect(reverse('admin_members_areas_of_interest'))
