Files

86 lines
3.7 KiB
Python

from rest_framework import serializers
from django.contrib.auth import get_user_model
from .models import RegistrationDomainRule, RegistrationRestrictionSetting, SMTPSetting
from apps.events.models import Skill
User = get_user_model()
class SkillSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Skill
fields = ['id', 'name', 'description', 'color']
class UserSerializer(serializers.ModelSerializer):
skills = SkillSimpleSerializer(many=True, read_only=True)
skill_ids = serializers.PrimaryKeyRelatedField(
queryset=Skill.objects.all(), many=True, write_only=True, required=False, source='skills'
)
class Meta:
model = User
fields = ['id', 'username', 'email', 'display_name', 'is_admin_user', 'is_staff', 'is_superuser', 'is_approved', 'is_email_verified', 'is_active', 'skills', 'skill_ids']
read_only_fields = ['id', 'is_staff', 'is_superuser', 'is_approved', 'is_email_verified']
class AdminUserSerializer(serializers.ModelSerializer):
skills = SkillSimpleSerializer(many=True, read_only=True)
skill_ids = serializers.PrimaryKeyRelatedField(
queryset=Skill.objects.all(), many=True, write_only=True, required=False, source='skills'
)
class Meta:
model = User
fields = ['id', 'username', 'email', 'display_name', 'is_admin_user', 'is_staff', 'is_superuser', 'is_approved', 'is_email_verified', 'is_active', 'skills', 'skill_ids', 'date_joined']
read_only_fields = ['id', 'date_joined']
class RegisterSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, min_length=6)
class Meta:
model = User
fields = ['username', 'email', 'password', 'display_name']
def validate_email(self, value):
email = value.strip().lower()
setting = RegistrationRestrictionSetting.get_solo()
if setting.is_restriction_enabled:
allowed_rules = RegistrationDomainRule.objects.filter(is_active=True)
if allowed_rules.exists():
email_domain = email.split('@')[-1] if '@' in email else ''
matched = False
for rule in allowed_rules:
clean_rule = rule.domain.lstrip('@').lower()
if email_domain == clean_rule or email_domain.endswith('.' + clean_rule):
matched = True
break
if not matched:
domains_list = ", ".join([r.domain for r in allowed_rules])
raise serializers.ValidationError(
f"Registrierungen sind derzeit nur für folgende E-Mail-Domains erlaubt: {domains_list}"
)
return email
def create(self, validated_data):
display_name = validated_data.get('display_name', '') or validated_data['username']
user = User.objects.create_user(
username=validated_data['username'],
email=validated_data['email'],
password=validated_data['password'],
display_name=display_name
)
return user
class RegistrationDomainRuleSerializer(serializers.ModelSerializer):
class Meta:
model = RegistrationDomainRule
fields = ['id', 'domain', 'is_active', 'created_at']
class RegistrationRestrictionSettingSerializer(serializers.ModelSerializer):
class Meta:
model = RegistrationRestrictionSetting
fields = ['is_restriction_enabled', 'require_admin_approval', 'require_email_verification']
class SMTPSettingSerializer(serializers.ModelSerializer):
class Meta:
model = SMTPSetting
fields = ['is_active', 'host', 'port', 'username', 'password', 'use_tls', 'use_ssl', 'from_email']