parent
5526cf708b
commit
d59d24ae65
15 changed files with 382 additions and 40 deletions
@ -1,3 +1,20 @@ |
||||
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 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 Meta: |
||||
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 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 |
||||
|
||||
class AllowMetadata(permissions.BasePermission): |
||||
def has_permission(self, request, view): |
||||
return request.method in ['OPTIONS', 'HEAD'] |
||||
|
||||
|
||||
class UserViewSet(viewsets.ModelViewSet): |
||||
queryset = User.objects.all().order_by('-date_joined') |
||||
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 { |
||||
max-width: 100%; |
||||
height: 2rem; |
||||
display: block; |
||||
margin: 1.5rem auto; |
||||
margin: auto; |
||||
} |
||||
|
Loading…
Reference in new issue