from datetime import datetime from rest_framework import serializers from django.contrib.auth.models import Group from labs.models import User, UserLabWorkshop from labs.signals import ( user_organization_changed_signal, user_country_changed_signal, ) from labs.user_events import UserEvent, log_user_event class MeSerializer(serializers.ModelSerializer): credits = serializers.SerializerMethodField() def get_credits(self, obj: User) -> int: credit_summary = obj.credit_summary if not credit_summary: return 0 return credit_summary.paid_credits + credit_summary.free_credits class Meta: model = User fields = [ "id", "name", "first_name", "last_name", "email", "credits", "country", "organization", "job_role", "industry", "language_code", "last_lab_code", "last_region_name", "last_tidb_version", "date_joined", "is_staff", ] read_only_fields = fields class UpdateUserProfileSerializer(serializers.ModelSerializer): class Meta: model = User fields = [ "name", "first_name", "last_name", "country", "organization", "job_role", "industry", "language_code", ] extra_kwargs = { "name": {"required": True, "allow_blank": False}, "first_name": {"required": False, "allow_blank": True}, "last_name": {"required": False, "allow_blank": True}, "country": {"required": True, "allow_blank": False}, "organization": {"required": True, "allow_blank": False}, "job_role": {"required": True, "allow_blank": False}, "industry": {"required": True, "allow_blank": False}, "language_code": {"required": True, "allow_blank": False}, } def save(self, **kwargs): pre_organization = self.instance.organization pre_country = self.instance.country user = super().save(**kwargs) if pre_organization != user.organization: user_organization_changed_signal.send(sender=self, user=user) if pre_country != user.country: user_country_changed_signal.send(sender=self, user=user) log_user_event( user=user, event_name=UserEvent.EventName.UPDATE_PROFILE, event_body={ "organization": user.organization, "country": user.country, "job_role": user.job_role, "industry": user.industry, "language_code": user.language_code, "name": user.name, "first_name": user.first_name, "last_name": user.last_name, }, ) return user class LogUserChatSerializer(serializers.Serializer): chat_id = serializers.CharField(required=True) class UserLabWorkshopSerializer(serializers.ModelSerializer): start_begin_date = serializers.SerializerMethodField() start_end_date = serializers.SerializerMethodField() workshop_name = serializers.SerializerMethodField() class Meta: model = UserLabWorkshop fields = [ "id", "workshop_name", "lab_group_name", "lab_codes", "start_begin_date", "start_end_date", "created_at", "updated_at", ] def get_start_begin_date(self, obj: UserLabWorkshop) -> datetime: return obj.valid_from def get_start_end_date(self, obj: UserLabWorkshop) -> datetime: return obj.valid_until def get_workshop_name(self, obj: UserLabWorkshop) -> str: return obj.workshop.event_name class UserGroupSerializer(serializers.ModelSerializer): class Meta: model = Group fields = ["id", "name"]