Add payment list view

Relates to #44
This commit is contained in:
Jan Tuomi
2017-05-12 15:03:37 +03:00
parent c5443d25b4
commit 3a468b9c39
10 changed files with 197 additions and 32 deletions
+2 -1
View File
@@ -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
View File
@@ -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

-11
View File
@@ -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('$}');
});
View File
-5
View File
@@ -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 %}
+90
View File
@@ -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 %}
+4
View File
@@ -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
View File
@@ -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')