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.
40 lines
1.9 KiB
40 lines
1.9 KiB
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")
|