from rest_framework import serializers from jobposting.models import JobListing, SkillLevels, CompanyLogo, Skill from core.models import MyUser, AnonymousUserData class SkillLevelsField(serializers.Field): def to_representation(self, value): # Konwersja do formatu wyjściowego return {skill_level.skill_id.skill_name: skill_level.skill_level for skill_level in value.all()} def to_internal_value(self, data): # Konwersja z formatu wejściowego skill_levels = [] for skill_name, level in data.items(): try: skill = Skill.objects.get(skill_name=skill_name) except Skill.DoesNotExist: raise serializers.ValidationError(f"Skill with name '{skill_name}' does not exist.") skill_levels.append({'skill_id': skill.id, 'skill_level': level}) return skill_levels class MyUserSerializer(serializers.ModelSerializer): class Meta: model = MyUser fields = ['id', 'email', 'first_name', 'last_name'] class AnonymousUserDataSerializer(serializers.ModelSerializer): class Meta: model = AnonymousUserData fields = ['id', 'email', 'first_name', 'last_name'] class SkillLevelsSerializer(serializers.ModelSerializer): skill_id = serializers.PrimaryKeyRelatedField(read_only=True, source='skill.id') class Meta: model = SkillLevels fields = ['skill_id', 'skill_level'] class JobListingSerializer(serializers.ModelSerializer): created_by = MyUserSerializer(read_only=True) anonymous_user_data = AnonymousUserDataSerializer(read_only=True) skill_levels = SkillLevelsField() class Meta: model = JobListing fields = [ 'id', 'posting_option', 'company_name', 'name', 'content', 'minsalary', 'maxsalary', 'localization', 'created_by', 'created_at', 'status', 'status_paid', 'expiration_date', 'experience_level', 'employmentType', 'workFromHome', 'updated_at', 'skillLevels', 'contact_email', 'first_name', 'last_name', 'anonymous_user_data' ] def create(self, validated_data): skill_levels_data = validated_data.pop('skill_levels', []) job_listing = JobListing.objects.create(**validated_data) for skill_data in skill_levels_data: skill_level = SkillLevels.objects.create(**skill_data) job_listing.skillLevels.add(skill_level) return job_listing class CompanyLogoSerializer(serializers.ModelSerializer): class Meta: model = CompanyLogo fields = ['id', 'company_nane','company_logo'] class SkillSerializer(serializers.ModelSerializer): class Meta: model = Skill fields = ['id', 'skill_name']