parent
5526cf708b
commit
d59d24ae65
15 changed files with 382 additions and 40 deletions
@ -1,3 +1,20 @@ |
|||||||
from django.db import models |
from django.db import models |
||||||
|
from django.contrib.auth.models import User |
||||||
|
|
||||||
# Create your models here. |
from . import old_models |
||||||
|
|
||||||
|
class Member(models.Model): |
||||||
|
user = models.OneToOneField(User, on_delete=models.PROTECT) |
||||||
|
first_name = models.CharField(max_length=32) |
||||||
|
last_name = models.CharField(max_length=32) |
||||||
|
old_member_id = models.IntegerField(null=True, blank=True) |
||||||
|
|
||||||
|
set_details = models.BooleanField(default=False) |
||||||
|
preferred_name = models.CharField(max_length=32, blank=True) |
||||||
|
phone = models.CharField(max_length=32, blank=True) |
||||||
|
current_start_date = models.DateField(blank=True, null=True) |
||||||
|
application_date = models.DateField(blank=True, null=True) |
||||||
|
vetted_date = models.DateField(blank=True, null=True) |
||||||
|
monthly_fees = models.IntegerField(blank=True, null=True) |
||||||
|
emergency_contact_name = models.CharField(max_length=64, blank=True) |
||||||
|
emergency_contact_phone = models.CharField(max_length=32, blank=True) |
||||||
|
@ -1,7 +1,70 @@ |
|||||||
from django.contrib.auth.models import User, Group |
from django.contrib.auth.models import User, Group |
||||||
from rest_framework import serializers |
from rest_framework import serializers |
||||||
|
from rest_framework.exceptions import ValidationError |
||||||
|
from rest_auth.registration.serializers import RegisterSerializer |
||||||
|
|
||||||
|
from . import models, old_models |
||||||
|
|
||||||
|
GRAB_FIELDS = [ |
||||||
|
'preferred_name', |
||||||
|
'phone', |
||||||
|
'current_start_date', |
||||||
|
'application_date', |
||||||
|
'vetted_date', |
||||||
|
'monthly_fees', |
||||||
|
'emergency_contact_name', |
||||||
|
'emergency_contact_phone', |
||||||
|
] |
||||||
|
|
||||||
|
#custom_error = lambda x: ValidationError(dict(non_field_errors=x)) |
||||||
|
|
||||||
class UserSerializer(serializers.ModelSerializer): |
class UserSerializer(serializers.ModelSerializer): |
||||||
class Meta: |
class Meta: |
||||||
model = User |
model = User |
||||||
fields = ['id', 'username', 'email', 'groups'] |
fields = ['id', 'username', 'email', 'member'] |
||||||
|
depth = 1 |
||||||
|
|
||||||
|
|
||||||
|
class MemberSerializer(serializers.ModelSerializer): |
||||||
|
class Meta: |
||||||
|
model = models.Member |
||||||
|
fields = '__all__' |
||||||
|
read_only_fields = ['user', 'application_date', 'current_start_date', 'vetted_date', 'monthly_fees', 'old_member_id'] |
||||||
|
|
||||||
|
class AdminMemberSerializer(serializers.ModelSerializer): |
||||||
|
class Meta: |
||||||
|
model = models.Member |
||||||
|
fields = '__all__' |
||||||
|
read_only_fields = ['id', 'user'] |
||||||
|
|
||||||
|
|
||||||
|
class RegistrationSerializer(RegisterSerializer): |
||||||
|
first_name = serializers.CharField(max_length=32) |
||||||
|
last_name = serializers.CharField(max_length=32) |
||||||
|
existing_member = serializers.ChoiceField(['true', 'false']) |
||||||
|
|
||||||
|
def custom_signup(self, request, user): |
||||||
|
data = request.data |
||||||
|
old_member_id = None |
||||||
|
old_member_fields = dict(preferred_name=data['first_name']) |
||||||
|
|
||||||
|
if data['existing_member'] == 'true': |
||||||
|
old_members = old_models.Members.objects.using('old_portal') |
||||||
|
try: |
||||||
|
old_member = old_members.get(email=data['email']) |
||||||
|
except old_models.Members.DoesNotExist: |
||||||
|
user.delete() |
||||||
|
raise ValidationError(dict(email='Unable to find in old database.')) |
||||||
|
|
||||||
|
old_member_id = old_member.id |
||||||
|
|
||||||
|
for f in GRAB_FIELDS: |
||||||
|
old_member_fields[f] = old_member.__dict__.get(f, None) |
||||||
|
|
||||||
|
models.Member.objects.create( |
||||||
|
user=user, |
||||||
|
first_name=data['first_name'], |
||||||
|
last_name=data['last_name'], |
||||||
|
old_member_id=old_member_id, |
||||||
|
**old_member_fields |
||||||
|
) |
||||||
|
@ -1,8 +1,55 @@ |
|||||||
from django.contrib.auth.models import User, Group |
from django.contrib.auth.models import User, Group |
||||||
from rest_framework import viewsets |
from rest_framework import viewsets, views, permissions |
||||||
|
from rest_framework.response import Response |
||||||
|
from rest_auth.registration.views import RegisterView |
||||||
|
|
||||||
from . import models, serializers |
from . import models, serializers |
||||||
|
|
||||||
|
class AllowMetadata(permissions.BasePermission): |
||||||
|
def has_permission(self, request, view): |
||||||
|
return request.method in ['OPTIONS', 'HEAD'] |
||||||
|
|
||||||
|
|
||||||
class UserViewSet(viewsets.ModelViewSet): |
class UserViewSet(viewsets.ModelViewSet): |
||||||
queryset = User.objects.all().order_by('-date_joined') |
queryset = User.objects.all().order_by('-date_joined') |
||||||
serializer_class = serializers.UserSerializer |
serializer_class = serializers.UserSerializer |
||||||
|
|
||||||
|
|
||||||
|
class MemberViewSet(viewsets.ModelViewSet): |
||||||
|
permission_classes = [AllowMetadata | permissions.IsAuthenticated] |
||||||
|
http_method_names = ['options', 'head', 'get', 'put', 'patch'] |
||||||
|
|
||||||
|
def get_queryset(self): |
||||||
|
objects = models.Member.objects.all() |
||||||
|
if self.request.user.is_staff: |
||||||
|
return objects.order_by('id') |
||||||
|
else: |
||||||
|
return objects.filter(user=self.request.user) |
||||||
|
|
||||||
|
def get_serializer_class(self): |
||||||
|
if self.request.user.is_staff: |
||||||
|
return serializers.AdminMemberSerializer |
||||||
|
else: |
||||||
|
return serializers.MemberSerializer |
||||||
|
|
||||||
|
|
||||||
|
class MyUserView(views.APIView): |
||||||
|
permission_classes = [AllowMetadata | permissions.IsAuthenticated] |
||||||
|
|
||||||
|
def get(self, request): |
||||||
|
serializer = serializers.UserSerializer(request.user) |
||||||
|
return Response(serializer.data) |
||||||
|
|
||||||
|
|
||||||
|
class RegistrationViewSet(RegisterView): |
||||||
|
serializer_class = serializers.RegistrationSerializer |
||||||
|
|
||||||
|
#def create(self, request): |
||||||
|
# data = request.data.copy() |
||||||
|
# data['username'] = '{}.{}'.format( |
||||||
|
# data['first_name'], |
||||||
|
# data['last_name'] |
||||||
|
# ).lower() |
||||||
|
# request._full_data = data |
||||||
|
# return super().create(request) |
||||||
|
|
||||||
|
@ -0,0 +1,3 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
python manage.py inspectdb --database old_portal | sed 's/CharField/TextField/g' > apiserver/api/old_models.py |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,5 +1,11 @@ |
|||||||
|
.header { |
||||||
|
padding-top: 1.5rem; |
||||||
|
margin-bottom: 1.5rem; |
||||||
|
} |
||||||
|
|
||||||
.header .logo { |
.header .logo { |
||||||
max-width: 100%; |
max-width: 100%; |
||||||
|
height: 2rem; |
||||||
display: block; |
display: block; |
||||||
margin: 1.5rem auto; |
margin: auto; |
||||||
} |
} |
||||||
|
Loading…
Reference in new issue