+2
-1
@@ -1,6 +1,7 @@
|
||||
from django.contrib import admin
|
||||
from members.models import Member, Request
|
||||
from members.models import Member, Request, Payment
|
||||
|
||||
# Register your models here.
|
||||
admin.site.register(Member)
|
||||
admin.site.register(Request)
|
||||
admin.site.register(Payment)
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9 on 2017-05-12 11:54
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('members', '0003_auto_20170329_1928'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='payment',
|
||||
name='email',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='payment',
|
||||
name='first_name',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='payment',
|
||||
name='last_name',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='AYY',
|
||||
field=models.BooleanField(default=False, verbose_name='AYY'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='POR',
|
||||
field=models.CharField(max_length=255, verbose_name='Place of residence'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='email',
|
||||
field=models.EmailField(max_length=254, verbose_name='Email'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='first_name',
|
||||
field=models.CharField(max_length=127, verbose_name='First name'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='jas',
|
||||
field=models.BooleanField(default=False, verbose_name='JAS'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='last_name',
|
||||
field=models.CharField(max_length=127, verbose_name='Last name'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='request',
|
||||
name='AYY',
|
||||
field=models.BooleanField(default=False, verbose_name='AYY'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='request',
|
||||
name='POR',
|
||||
field=models.CharField(max_length=255, verbose_name='Place of residence'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='request',
|
||||
name='email',
|
||||
field=models.EmailField(max_length=254, verbose_name='Email'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='request',
|
||||
name='first_name',
|
||||
field=models.CharField(max_length=127, verbose_name='First name'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='request',
|
||||
name='jas',
|
||||
field=models.BooleanField(default=False, verbose_name='JAS'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='request',
|
||||
name='last_name',
|
||||
field=models.CharField(max_length=127, verbose_name='Last name'),
|
||||
),
|
||||
]
|
||||
+1
-14
@@ -32,21 +32,8 @@ class Payment(models.Model):
|
||||
'''
|
||||
date = models.DateTimeField(default=datetime.fromtimestamp(0))
|
||||
source = models.CharField(max_length=255)
|
||||
first_name = models.CharField(max_length=255)
|
||||
last_name = models.CharField(max_length=255)
|
||||
email = models.EmailField(max_length=255)
|
||||
member = models.ForeignKey('Member', on_delete=models.SET_NULL, blank=True, null=True)
|
||||
|
||||
def get_dict(self):
|
||||
return {
|
||||
'id': self.id,
|
||||
'date': date2str(self.date),
|
||||
'source': self.source,
|
||||
'first_name': self.first_name,
|
||||
'last_name': self.last_name,
|
||||
'email': self.email,
|
||||
'member': self.member.get_dict() if self.member else {}
|
||||
}
|
||||
member = models.ForeignKey('Member', on_delete=models.SET_NULL, blank=True, null=True)
|
||||
|
||||
|
||||
class Member(BaseMember):
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 96 KiB |
@@ -1,11 +0,0 @@
|
||||
var app = angular.module('memberApp', ['ngRoute','ngMaterial','ngMessages']);
|
||||
|
||||
app.config(['$httpProvider', '$locationProvider', function ($httpProvider, $locationProvider) {
|
||||
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
|
||||
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
|
||||
}]);
|
||||
|
||||
app.config(function($interpolateProvider) {
|
||||
$interpolateProvider.startSymbol('{$');
|
||||
$interpolateProvider.endSymbol('$}');
|
||||
});
|
||||
@@ -88,11 +88,6 @@
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="row" id="tommy">
|
||||
<div class="col-sm-4">
|
||||
<a href="/members/tommy">Tommy</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{% extends "members_base.html" %}
|
||||
|
||||
{% load static %}
|
||||
{% load i18n %}
|
||||
{% block content %}
|
||||
<link rel="stylesheet" href="{% static "css/jasenlista.css" %}">
|
||||
<div>
|
||||
<a id="filter-collapser" href="#collapse-filters" data-toggle="collapse" class="btn btn-info">
|
||||
{% trans "Show filters" %}
|
||||
</a>
|
||||
<form action="/members/list" method="POST" id="collapse-filters" class="collapse filter-form">
|
||||
<div class="filter-row">
|
||||
<div class="filter-group">
|
||||
<div class="filter-field">
|
||||
<input class="form-control" type="text" id="search-filter" placeholder="{% trans "Search" %}" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-group">
|
||||
<div class="filter-field">
|
||||
<h5>{% trans "Added after" %}</h5>
|
||||
<input type="datetime-local" id="addedAfterDatePicker">
|
||||
</div>
|
||||
<div class="filter-field">
|
||||
<h5>{% trans "Added before" %}</h5>
|
||||
<input type="datetime-local" class="filter-field" id="addedBeforeDatePicker">
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-group">
|
||||
<div class="filter-field">
|
||||
<h5>{% trans "Paid after" %}</h5>
|
||||
<input type="datetime-local" class="filter-field" id="paidAfterDatePicker">
|
||||
</div>
|
||||
<div class="filter-field">
|
||||
<h5>{% trans "Paid before" %}</h5>
|
||||
<input type="datetime-local" class="filter-field" id="paidBeforeDatePicker">
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-group">
|
||||
<div class="filter-field">
|
||||
<input type="button" value="{% trans "Filter" %}" class="filter-button btn btn-success">
|
||||
<input type="button" value="{% trans "Reset" %}" class="filter-button btn btn-warning">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div class="row content-area">
|
||||
<div class="form-inline col-md-12 last-filter">
|
||||
<div class="content-area-title form-group">
|
||||
<h3 class="inline-title">{% trans "Member register" %}</h3>
|
||||
<input type="button" value="{% trans "Download CSV" %}" id="download-csv" class="btn btn-info" ng-click="loadCSV()"/>
|
||||
</div>
|
||||
</div>
|
||||
<table id="choose-address-table" class="table table-striped">
|
||||
<thead>
|
||||
<tr class="ui-widget-header">
|
||||
<th>{% trans "Date" %}</th>
|
||||
<th>{% trans "Source" %}</th>
|
||||
<th>{% trans "Member information" %}</th>
|
||||
<th class="table-button-column">{% trans "Payment count" %}: {{ payment_count }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for payment in payment_list %}
|
||||
<tr>
|
||||
<td>{{ payment.date }}</td>
|
||||
<td>{{ payment.source }}</td>
|
||||
<td>
|
||||
{% if payment.member %}
|
||||
{{ payment.member.last_name }} {{ payment.member.first_name }}, {{ payment.member.email }}
|
||||
{% else %}
|
||||
{% trans "No member data found" %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ payment.last_name }}</td>
|
||||
<td>{{ payment.email }}</td>
|
||||
<td class="table-button-column">
|
||||
<a href="/members/edit/{{ payment.id }}">
|
||||
<input type="button" value="{% trans "Edit" %}" class="table-button btn btn-info" value="{% trans "Edit" %}" />
|
||||
</a>
|
||||
<a href="/members/delete_payment_confirm/{{ payment.id }}">
|
||||
<input type="button" value="{% trans "Delete" %}" class="table-button btn btn-danger" />
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
@@ -10,6 +10,7 @@ from members.views import submit_member
|
||||
from members.views import update_member
|
||||
from members.views import delete_member_confirm
|
||||
from members.views import delete_member
|
||||
from members.views import list_payments
|
||||
|
||||
#application
|
||||
from members.views import application_index
|
||||
@@ -54,6 +55,9 @@ urlpatterns = [
|
||||
# success page for the application
|
||||
url(r'^application/success$', application_success_index),
|
||||
|
||||
# list all payment events
|
||||
url(r'^payments', list_payments),
|
||||
|
||||
# favourite icon
|
||||
url(r'^favicon\.ico$', favicon_view),
|
||||
]
|
||||
|
||||
+13
-1
@@ -10,7 +10,7 @@ import json
|
||||
import requests
|
||||
import logging
|
||||
|
||||
from members.models import Member, Request
|
||||
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
|
||||
@@ -180,6 +180,18 @@ 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')
|
||||
|
||||
Reference in New Issue
Block a user