You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

137 lines
4.3 KiB

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
#custom_error = lambda x: ValidationError(dict(non_field_errors=x))
class UserTrainingSerializer(serializers.ModelSerializer):
class Meta:
model = models.Training
exclude = ['user']
depth = 2
class UserSerializer(serializers.ModelSerializer):
training = UserTrainingSerializer(many=True)
class Meta:
model = User
fields = ['id', 'username', 'email', 'member', 'transactions', 'cards', 'training']
depth = 1
# member viewing member list or other member
class OtherMemberSerializer(serializers.ModelSerializer):
q = serializers.CharField(write_only=True, max_length=64)
seq = serializers.IntegerField(write_only=True, )
class Meta:
model = models.Member
fields = ['q', 'seq', 'preferred_name', 'last_name', 'status', 'current_start_date']
# member viewing himself
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']
# adming viewing member
class AdminMemberSerializer(serializers.ModelSerializer):
class Meta:
model = models.Member
fields = '__all__'
read_only_fields = ['id', 'user']
class TransactionSerializer(serializers.ModelSerializer):
class Meta:
model = models.Transaction
fields = '__all__'
class SessionDetailSerializer(serializers.ModelSerializer):
class Meta:
model = models.Training
exclude = ['user']
class SessionSerializer(serializers.ModelSerializer):
student_count = serializers.SerializerMethodField()
class Meta:
model = models.Session
fields = '__all__'
depth = 1
def get_student_count(self, obj):
return len(obj.students.all())
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = models.Course
fields = '__all__'
class CourseDetailSerializer(serializers.ModelSerializer):
sessions = SessionSerializer(many=True)
class Meta:
model = models.Course
fields = '__all__'
depth = 1
class AdminCourseSerializer(serializers.ModelSerializer):
class Meta:
model = models.Course
fields = '__all__'
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
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 email in old database.'))
member = models.Member.objects.get(id=old_member.id)
if member.user:
raise ValidationError(dict(email='Old member already claimed.'))
member.user = user
member.first_name = data['first_name']
member.last_name = data['last_name']
member.preferred_name = data['first_name']
member.save()
transactions = models.Transaction.objects.filter(member_id=member.id)
for t in transactions:
t.user = user
t.save()
cards = models.Card.objects.filter(member_id=member.id)
for c in cards:
c.user = user
c.save()
training = models.Training.objects.filter(member_id=member.id)
for t in training:
t.user = user
t.save()
else:
models.Member.objects.create(
user=user,
first_name=data['first_name'],
last_name=data['last_name'],
preferred_name=data['first_name'],
)