Merge remote-tracking branch 'origin/feature-payment' into feature-payment
This commit is contained in:
+2
-2
@@ -1,6 +1,6 @@
|
||||
from django.contrib import admin
|
||||
from members.models import Member, MemberRequest
|
||||
from members.models import Member, Request
|
||||
|
||||
# Register your models here.
|
||||
admin.site.register(Member)
|
||||
admin.site.register(MemberRequest)
|
||||
admin.site.register(Request)
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9 on 2017-01-25 16:59
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import datetime
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Member',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('first_name', models.CharField(max_length=127)),
|
||||
('last_name', models.CharField(max_length=127)),
|
||||
('email', models.EmailField(max_length=254)),
|
||||
('POR', models.CharField(max_length=255)),
|
||||
('AYY', models.BooleanField(default=False)),
|
||||
('jas', models.BooleanField(default=False)),
|
||||
('created', models.DateTimeField(default=django.utils.timezone.now)),
|
||||
('paid', models.DateTimeField(default=datetime.datetime(1970, 1, 1, 0, 0))),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='MemberRequest',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='members.Member')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,21 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9 on 2017-03-29 15:57
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import datetime
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('members', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='paid',
|
||||
field=models.DateTimeField(default=datetime.datetime(1970, 1, 1, 2, 0)),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,67 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9 on 2017-03-29 16:28
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import datetime
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('members', '0002_auto_20170329_1857'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Payment',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('date', models.DateTimeField(default=datetime.datetime(1970, 1, 1, 2, 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)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Request',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('first_name', models.CharField(max_length=127)),
|
||||
('last_name', models.CharField(max_length=127)),
|
||||
('email', models.EmailField(max_length=254)),
|
||||
('POR', models.CharField(default='ei_tiedossa', max_length=255)),
|
||||
('AYY', models.BooleanField(default=False)),
|
||||
('jas', models.BooleanField(default=False)),
|
||||
('submitted', models.DateTimeField(default=django.utils.timezone.now)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='memberrequest',
|
||||
name='member',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='POR',
|
||||
field=models.CharField(default='ei_tiedossa', max_length=255),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='paid',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now),
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='MemberRequest',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='payment',
|
||||
name='member',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='members.Member'),
|
||||
),
|
||||
]
|
||||
+2
-3
@@ -11,7 +11,7 @@ class BaseMember(models.Model):
|
||||
first_name = models.CharField(max_length=127)
|
||||
last_name = models.CharField(max_length=127)
|
||||
email = models.EmailField()
|
||||
POR = models.CharField(max_length=255) # place of residence
|
||||
POR = models.CharField(default="ei_tiedossa", max_length=255) # place of residence
|
||||
AYY = models.BooleanField(default=False)
|
||||
jas = models.BooleanField(default=False)
|
||||
|
||||
@@ -19,7 +19,7 @@ class BaseMember(models.Model):
|
||||
abstract = True
|
||||
|
||||
|
||||
class MemberRequest(BaseMember):
|
||||
class Request(BaseMember):
|
||||
'''
|
||||
Member request model represents one member request.
|
||||
'''
|
||||
@@ -55,4 +55,3 @@ class Member(BaseMember):
|
||||
'''
|
||||
created = models.DateTimeField(default=timezone.now)
|
||||
paid = models.DateTimeField(default=timezone.now) #this needs to be assigned as Payment.date
|
||||
|
||||
|
||||
+32
-11
@@ -1,11 +1,10 @@
|
||||
from rest_framework import serializers
|
||||
from django.utils import timezone
|
||||
from datetime import datetime
|
||||
from members.models import Member, MemberRequest
|
||||
from members.models import Member, Request
|
||||
from django.conf import settings
|
||||
|
||||
#, default=timezone.now
|
||||
# , default=datetime.fromtimestamp(0)
|
||||
|
||||
class MemberSerializer(serializers.Serializer):
|
||||
id = serializers.IntegerField(read_only=True)
|
||||
first_name = serializers.CharField(required=True, max_length=127)
|
||||
@@ -14,8 +13,8 @@ class MemberSerializer(serializers.Serializer):
|
||||
POR = serializers.CharField(max_length=255)
|
||||
AYY = serializers.BooleanField(default=False)
|
||||
jas = serializers.BooleanField(default=False)
|
||||
created = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
|
||||
paid = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
|
||||
created = serializers.DateTimeField(default=timezone.now)
|
||||
paid = serializers.DateTimeField(default=datetime.fromtimestamp(0))
|
||||
|
||||
def create(self, validated_data):
|
||||
'''
|
||||
@@ -33,15 +32,37 @@ class MemberSerializer(serializers.Serializer):
|
||||
instance.POR = validated_data.get('POR', instance.POR)
|
||||
instance.AYY = validated_data.get('AYY', instance.AYY)
|
||||
instance.jas = validated_data.get('jas', instance.jas)
|
||||
# instance.created = validated_data.get('created', instance.created)
|
||||
instance.created = validated_data.get('created', instance.created)
|
||||
instance.paid = validated_data.get('paid', instance.paid)
|
||||
instance.save()
|
||||
return instance
|
||||
|
||||
class MemberRequestSerializer(serializers.ModelSerializer):
|
||||
class MemberRequestSerializer(serializers.Serializer):
|
||||
id = serializers.IntegerField(read_only=True)
|
||||
member = MemberSerializer()
|
||||
submitted = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
|
||||
first_name = serializers.CharField(required=True, max_length=127)
|
||||
last_name = serializers.CharField(required=True, max_length=127)
|
||||
email = serializers.EmailField(min_length=None, max_length=None, required=True)
|
||||
POR = serializers.CharField(max_length=255)
|
||||
AYY = serializers.BooleanField(default=False)
|
||||
jas = serializers.BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
model = MemberRequest
|
||||
fields = ('id', 'member')
|
||||
def created(self, validated_data):
|
||||
'''
|
||||
Create and return a new MemberRequest instance, given the validated data.
|
||||
'''
|
||||
return MemberRequest.objects.create(**validated_data)
|
||||
|
||||
def update(self, instance, validated_data):
|
||||
'''
|
||||
Update and return an existing Member request instance given the validated data.
|
||||
'''
|
||||
instance.submitted = validated_data.get('submitted', instance.submitted)
|
||||
instance.first_name = validated_data.get('first_name', instance.first_name)
|
||||
instance.last_name = validated_data.get('last_name', instance.last_name)
|
||||
instance.email = validated_data.get('email', instance.email)
|
||||
instance.POR = validated_data.get('POR', instance.POR)
|
||||
instance.AYY = validated_data.get('AYY', instance.AYY)
|
||||
instance.jas = validated_data.get('jas', instance.jas)
|
||||
instance.save()
|
||||
return instance
|
||||
|
||||
@@ -23,12 +23,12 @@ function memberDataEditor(returnPath) {
|
||||
return function($scope, $http, $window, $location) {
|
||||
var id = memberId;
|
||||
console.log("id: " + id);
|
||||
$http.get("/members/rest/api/members/" + id).then(function(response) {
|
||||
$http.get("/members/api/member/" + id).then(function(response) {
|
||||
$scope.member = response.data;
|
||||
});
|
||||
|
||||
$scope.send = function() {
|
||||
$http.put("/members/rest/api/members/" + id + "/", $scope.member).then(function(response){
|
||||
$http.put("/members/api/member/" + id, $scope.member).then(function(response){
|
||||
notySuccess("Jäsentiedot tallennettu");
|
||||
$window.location = returnPath;
|
||||
});
|
||||
@@ -69,26 +69,26 @@ app.controller("getController", function($scope, $document, $http){
|
||||
|
||||
/* Fetch all members from the database and show all members in the table */
|
||||
$scope.updateMembers = function() {
|
||||
$http.get("/members/rest/api/members").then(function(response){
|
||||
$http.get("/members/api/members").then(function(response){
|
||||
$scope.members = response.data;
|
||||
// map trues and falses to more user-friendly format
|
||||
// _.each($scope.members, function(m){
|
||||
// m.jas = m.jas ? "Kyllä" : "Ei";
|
||||
// m.AYY = m.AYY ? "Kyllä" : "Ei";
|
||||
// });
|
||||
_.each($scope.members, function(m){
|
||||
m.jas = m.jas ? "Kyllä" : "Ei";
|
||||
m.AYY = m.AYY ? "Kyllä" : "Ei";
|
||||
});
|
||||
$scope.shown_members = $scope.members;
|
||||
});
|
||||
};
|
||||
|
||||
/* Fetch a single member from the database by id and update its row */
|
||||
$scope.updateMember = function(id) {
|
||||
$http.get("/members/rest/api/members/" + id).then(function(response) {
|
||||
$http.get("/members/api/member/" + id).then(function(response) {
|
||||
for (var i = 0; i < $scope.shown_members.length; i++) {
|
||||
var member = $scope.shown_members[i];
|
||||
if (String(member.id) == String(id)) {
|
||||
member = response.data;
|
||||
// member.jas = member.jas ? "Kyllä" : "Ei";
|
||||
// member.AYY = member.AYY ? "Kyllä" : "Ei";
|
||||
member.jas = member.jas ? "Kyllä" : "Ei";
|
||||
member.AYY = member.AYY ? "Kyllä" : "Ei";
|
||||
|
||||
$scope.shown_members[i] = member;
|
||||
}
|
||||
@@ -99,21 +99,12 @@ app.controller("getController", function($scope, $document, $http){
|
||||
/* Update the payment date of a single member to the current time and send
|
||||
* the member to the database */
|
||||
$scope.updatePayment= function(id){
|
||||
$scope.member = {};
|
||||
//Find member whose payment needs to be updated
|
||||
$scope.member = $scope.members.find(function(element){
|
||||
return element.id == id;
|
||||
$http.put("/members/api/member/"+id, { paid: moment().format("YYYY-MM-DD kk:mm:ss") }).then(function(response) {
|
||||
$scope.updateMember(id);
|
||||
notySuccess("Maksupäivämäärä päivitetty.");
|
||||
});
|
||||
//Update the member data if member was found
|
||||
if($scope.member != undefined){
|
||||
$scope.member.paid = moment().format("YYYY-MM-DD kk:mm:ss");
|
||||
$http.put("/members/rest/api/members/"+id +"/", $scope.member).then(function(response) {
|
||||
$scope.updateMember(id);
|
||||
notySuccess("Maksupäivämäärä päivitetty.");
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* Redirect the browser to the CSV dump download endpoint */
|
||||
$scope.loadCSV = function() {
|
||||
window.location = "/members/api/getCSV";
|
||||
@@ -121,7 +112,7 @@ app.controller("getController", function($scope, $document, $http){
|
||||
|
||||
/* Delete a single member by id */
|
||||
$scope.deleteMember = function(id) {
|
||||
$http.delete("/members/rest/api/members/" + id).then(
|
||||
$http.delete("/members/api/member/" + id).then(
|
||||
function(response) {
|
||||
notySuccess("Poistaminen onnistui")
|
||||
$scope.updateMembers();
|
||||
@@ -169,7 +160,7 @@ app.controller("getController", function($scope, $document, $http){
|
||||
if (name.length == 0) continue;
|
||||
|
||||
if (member.first_name.toLowerCase().includes(name)
|
||||
|| member.last_name.toLowerCase().includes(name)
|
||||
|| member.last_name.toLowerCase().includes(name)
|
||||
|| member.email.toLowerCase().includes(name)) {
|
||||
|
||||
result.push(member);
|
||||
@@ -219,24 +210,26 @@ app.controller("getController", function($scope, $document, $http){
|
||||
});
|
||||
|
||||
/* Controller for adding a member */
|
||||
app.controller("postController", function($scope, $http, $location) {
|
||||
app.controller("postController", function($scope, $http, $location, $window) {
|
||||
$scope.member = {};
|
||||
$scope.send = function() {
|
||||
$http.post("/members/rest/api/members/", $scope.member).then(function(response){
|
||||
$http.post("/members/api/member/", $scope.member).then(function(response){
|
||||
notySuccess("Jäsen lisätty!");
|
||||
$window.location = "/members/list";
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
/* Controller for application page */
|
||||
app.controller("applController", function($scope, $http){
|
||||
$scope.applUpdateAll = function() {
|
||||
$http.get("/members/rest/api/requests").then(function(response){
|
||||
$http.get("/members/api/requests").then(function(response){
|
||||
$scope.applications = response.data;
|
||||
// _.each($scope.applications, function(a){
|
||||
// a.member.jas = a.member.jas ? "Kyllä" : "Ei";
|
||||
// a.member.AYY = a.member.AYY ? "Kyllä" : "Ei";
|
||||
// });
|
||||
_.each($scope.applications, function(a){
|
||||
a.member.jas = a.member.jas ? "Kyllä" : "Ei";
|
||||
a.member.AYY = a.member.AYY ? "Kyllä" : "Ei";
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.js"></script>
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.6/angular.js"></script>
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
|
||||
|
||||
<!-- DatePicker -->
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
|
||||
{% block content %}
|
||||
<h1>Hienoa! Jäsenhakemuksesi on nyt lähetetty.</h1>
|
||||
<a href="http://sahkoinsinoorikilta.fi">Takaisin Sähköinsinöörikillan web-sivuille</a>
|
||||
<a href="https://sahkoinsinoorikilta.fi">Takaisin Sähköinsinöörikillan web-sivuille</a>
|
||||
{% endblock content %}
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
<label>Asuinkunta: </label>
|
||||
<input id="PORField" required type="text" placeholder="Otaniemi" class="form-control" ng-model="member.POR"></input>
|
||||
</div>
|
||||
<button class="btn btn-success" ng-click="applicationForm.$valid && send()" type="submit" id="sendmember">Tallenna</button>
|
||||
<button class="btn btn-warning" ng-click="cancel()" type="submit" id="sendmember">Peruuta</button>
|
||||
<button class="btn btn-success" ng-click="applicationForm.$valid && sendappl()" type="submit" id="sendmember">Tallenna</button>
|
||||
<button class="btn btn-warning" ng-click="cancelappl()" type="submit" id="sendmember">Peruuta</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.6/angular.js"></script>
|
||||
|
||||
<!-- Angular routing -->
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-route.js"></script>
|
||||
|
||||
<!-- Underscore.js -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
|
||||
|
||||
+5
-5
@@ -4,7 +4,7 @@ from django.views.decorators.http import require_http_methods
|
||||
from django.views.decorators.csrf import ensure_csrf_cookie
|
||||
from django.http import HttpResponse, HttpResponseBadRequest
|
||||
from django.core.exceptions import ValidationError
|
||||
from members.models import Member, MemberRequest
|
||||
from members.models import Member, Request
|
||||
import json
|
||||
from django.core.mail import send_mail
|
||||
import requests
|
||||
@@ -24,7 +24,7 @@ memberlogger = logging.getLogger(__name__)
|
||||
logging.basicConfig(format='[%(levelname)s]%(asctime)s %(message)s', level=settings.LOGGERLEVEL, filename=settings.LOGPATH)
|
||||
|
||||
|
||||
# REST API views
|
||||
#API views
|
||||
########################################
|
||||
class MembersList(generics.ListCreateAPIView):
|
||||
queryset = Member.objects.all()
|
||||
@@ -39,13 +39,13 @@ class MemberDetails(generics.RetrieveUpdateDestroyAPIView):
|
||||
throttle_classes = (BurstRateThrottle, SustainedRateThrottle, )
|
||||
|
||||
class MemberRequestList(generics.ListCreateAPIView):
|
||||
queryset = MemberRequest.objects.all()
|
||||
queryset = Request.objects.all()
|
||||
serializer_class = MemberRequestSerializer
|
||||
permission_classes = (HasRights, permissions.IsAuthenticated, )
|
||||
throttle_classes = (BurstRateThrottle, SustainedRateThrottle, )
|
||||
|
||||
class MemberRequestDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||
queryset = MemberRequest.objects.all()
|
||||
queryset = Request.objects.all()
|
||||
serializer_class = MemberRequestSerializer
|
||||
permission_classes = (HasRights, permissions.IsAuthenticated, )
|
||||
throttle_classes = (BurstRateThrottle, SustainedRateThrottle, )
|
||||
@@ -237,7 +237,7 @@ def new_member_request(request, *args, **kwargs):
|
||||
message += 'AYY-membership: ' + str(mem.AYY) + '\r\n'
|
||||
message += 'To mail list: ' + str(mem.jas) + '\r\n'
|
||||
message += 'Created: ' + mem.created.isoformat(' ') + '\r\n'
|
||||
message += 'Please go to the http://sika.sahkoinsinoorikilta.fi/members/ and do something about it!\r\n'
|
||||
message += 'Please go to the https://sika.sahkoinsinoorikilta.fi/members/ and do something about it!\r\n'
|
||||
|
||||
# TODO: send mail when application is ready
|
||||
# send_mail_wrapper(subject, message)
|
||||
|
||||
Reference in New Issue
Block a user