From 90177ab9fc720a5038a53696c59d3a4907db5293 Mon Sep 17 00:00:00 2001 From: henu Date: Thu, 25 May 2017 17:00:31 +0300 Subject: [PATCH 1/3] Fix Member model method last_paid The last_paid method used DoesNotExist exception to handle situation where no proper payment models were found. However, the syntax was wrong and it should have used Payment.DoesNotExist. This was fixed. --- members/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/members/models.py b/members/models.py index 45a7b80..921ab6f 100644 --- a/members/models.py +++ b/members/models.py @@ -103,7 +103,7 @@ class Member(BaseMember): latest = payments.latest('date') date = latest.date return date - except DoesNotExist: + except Payment.DoesNotExist: return None @staticmethod From 54612e31ca531cbad0e0fceeb27c072ce9b8b07b Mon Sep 17 00:00:00 2001 From: henu Date: Thu, 25 May 2017 17:06:44 +0300 Subject: [PATCH 2/3] Add REST API support to members Members can be now retrieved one at a time is user has admin rights. Implemented also permissions and throttle rates to REST API and added required settings.py modifications to settings-sample.py file. --- members/serializers.py | 8 ++++++++ members/urls.py | 6 ++++++ members/views.py | 14 +++++++++++++- sikweb/settings-sample.py | 1 + 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 members/serializers.py diff --git a/members/serializers.py b/members/serializers.py new file mode 100644 index 0000000..95f1e21 --- /dev/null +++ b/members/serializers.py @@ -0,0 +1,8 @@ +from rest_framework import serializers +from members.models import Member + +class MemberSerializer(serializers.ModelSerializer): + paid = serializers.DateTimeField(source='last_paid') + class Meta: + model = Member + fields = ('id', 'first_name', 'last_name', 'email', 'POR', 'AYY', 'jas', 'created', 'paid') diff --git a/members/urls.py b/members/urls.py index de099b3..792a1c7 100644 --- a/members/urls.py +++ b/members/urls.py @@ -17,6 +17,9 @@ from members.views import member_delete_confirm from members.views import member_delete from members.views import payment_list +# rest api +from members.views import MemberDetail + # application from members.views import application_form from members.views import application_list @@ -96,6 +99,9 @@ urlpatterns = [ # favourite icon url(r'^favicon\.ico$', favicon_view), + # rest api url + url(r'^api/members/(?P\d+)$', MemberDetail.as_view()), + # email validation # url(r'^validate/(?P[0-9A-Za-z_\-\']+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', validateEmail, name='user-activation-link'), # url(r'^validate/success/$', validate_success), diff --git a/members/views.py b/members/views.py index 97aead0..f0a0288 100644 --- a/members/views.py +++ b/members/views.py @@ -10,11 +10,17 @@ from django.utils.translation import ugettext as _ '''Email validation''' from django.db.models.signals import post_save from django.dispatch import receiver -from .tokens import email_token_generator +#from .tokens import email_token_generator from django.utils.http import urlsafe_base64_encode from django.utils.encoding import force_bytes from django.core.mail import send_mail +'''REST framework''' +from members.serializers import MemberSerializer +from rest_framework import generics +from rest_framework import permissions +from rest_framework.throttling import UserRateThrottle, AnonRateThrottle + import json import requests import logging @@ -502,3 +508,9 @@ def email_on_accept(sender, instance, created, **kwargs): message = 'Jäsenhakemuksesi on hyväksytty!!!\r\n' send_mail_wrapper(subject, message, instance.email) +# Can be used to retrieve single member information via REST API +class MemberDetail(generics.RetrieveAPIView): + queryset = Member.objects.all() + serializer_class = MemberSerializer + permission_classes = (permissions.IsAdminUser, ) + throttle_classes = (UserRateThrottle, AnonRateThrottle, ) diff --git a/sikweb/settings-sample.py b/sikweb/settings-sample.py index 0323a47..4df4a29 100644 --- a/sikweb/settings-sample.py +++ b/sikweb/settings-sample.py @@ -137,6 +137,7 @@ REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', 'rest_framework.permissions.DjangoModelPermissions', + 'rest_framework.permissions.IsAdminUser', ), 'DEFAULT_THROTTLE_CLASSES': ( 'members.throttles.BurstRateThrottle', From 14ed32931b2cf46147b119b7176848be90f1db46 Mon Sep 17 00:00:00 2001 From: henu Date: Thu, 25 May 2017 19:17:51 +0300 Subject: [PATCH 3/3] Fix sidebar transition and styling --- members/static/css/members.css | 26 +++++++++++++++++++++++++- members/templates/members_base.html | 10 ++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/members/static/css/members.css b/members/static/css/members.css index 5f560f5..29fcf9d 100644 --- a/members/static/css/members.css +++ b/members/static/css/members.css @@ -13,6 +13,10 @@ input { margin-bottom: 0.5rem; } +#header { + display: block; +} + #wrapper { padding-right: 0; padding-top: 0; @@ -24,6 +28,10 @@ input { background: #202020; top: 0; padding: 0; + -webkit-transition: width 0.01s height 0.01s linear; + -moz-transition: width 0.01s height 0.01s linear; + -o-transition: width 0.01s height 0.01s linear; + transition: width 0.01s, height 0.01s, transform 0.01s; } @@ -45,6 +53,10 @@ input { cursor: default; } +#sidebar-collapse { + display: none; +} + @media (max-width: 767px) { table { @@ -62,6 +74,18 @@ input { text-align: center; } + #header { + display: none; + } + + .sidebar-nav { + display: none; + } + + #sidebar-collapse { + display: block; + } + .logout-container { position: initial; margin-bottom: 1rem; @@ -212,4 +236,4 @@ input { width: 100%; max-width: 100%; height: 10rem !important; -} \ No newline at end of file +} diff --git a/members/templates/members_base.html b/members/templates/members_base.html index 8e25f67..d357b66 100644 --- a/members/templates/members_base.html +++ b/members/templates/members_base.html @@ -37,6 +37,16 @@