from django.db import models from rest_framework import serializers class SearchEntityType(models.TextChoices): INSTITUTION = 'institution', 'Institution' PROJECT = 'project', 'Project' COURSE = 'course', 'Course' POST = 'post', 'Post' EVENT = 'event', 'Event' class SearchResultItemSerializer(serializers.Serializer): id = serializers.CharField(help_text="Entity unique identifier") type = serializers.ChoiceField( choices=SearchEntityType.choices, help_text="Type of the entity found" ) title = serializers.CharField(help_text="Title or primary name") description = serializers.CharField(allow_blank=True, required=False, help_text="Summary or excerpt") url_path = serializers.CharField(help_text="Frontend navigation route") image = serializers.CharField(allow_null=True, required=False, help_text="Cover or avatar image URL") badge = serializers.CharField(allow_blank=True, required=False, help_text="Contextual badge / label") metadata = serializers.DictField(required=False, help_text="Additional metadata attributes") relevance_score = serializers.FloatField(required=False, default=1.0, help_text="Relevance ranking score") class SearchTypeCountSerializer(serializers.Serializer): institutions = serializers.IntegerField(default=0) projects = serializers.IntegerField(default=0) courses = serializers.IntegerField(default=0) posts = serializers.IntegerField(default=0) events = serializers.IntegerField(default=0) class UnifiedSearchResponseSerializer(serializers.Serializer): query = serializers.CharField(help_text="Original search query string") total_results = serializers.IntegerField(help_text="Total number of matched records across categories") by_type = SearchTypeCountSerializer(help_text="Breakdown count of matched records by entity type") results = SearchResultItemSerializer(many=True, help_text="List of matched search results ordered by relevance")