This is an automated email from the ASF dual-hosted git repository.

lahirujayathilake pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airavata-portals.git

commit e307c3e25473ea7fc6f1cf58051335f97bbad420
Author: lahiruj <[email protected]>
AuthorDate: Thu Jul 24 16:49:36 2025 -0400

    Correct enum serialization for DRF serializers
    
    The serializer utility was treating Thrift enums as plain integers, causing 
UI crashes that expected strings (e.g., "CREATED" instead of 0).
---
 .../django_airavata/apps/api/thrift_utils.py           | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/airavata-django-portal/django_airavata/apps/api/thrift_utils.py 
b/airavata-django-portal/django_airavata/apps/api/thrift_utils.py
index 6ac9ff381..1657b6e89 100644
--- a/airavata-django-portal/django_airavata/apps/api/thrift_utils.py
+++ b/airavata-django-portal/django_airavata/apps/api/thrift_utils.py
@@ -4,6 +4,7 @@ Used to create Django Rest Framework serializers for Apache 
Thrift Data Types
 import copy
 import datetime
 import logging
+import enum
 
 from rest_framework.serializers import (
     BooleanField,
@@ -67,18 +68,19 @@ class ThriftEnumField(Field):
         self.enumClass = enumClass
 
     def to_representation(self, obj):
+        # For IntEnum, obj is the enum member, its `.name` is the string
         if obj is None:
             return None
-        return self.enumClass._VALUES_TO_NAMES[obj]
+        return obj.name
 
     def to_internal_value(self, data):
+        # Convert string name back into an IntEnum member
         if self.allow_null and data is None:
             return None
-        if data not in self.enumClass._NAMES_TO_VALUES:
-            raise ValidationError(
-                "Not an allowed name of enum {}".format(
-                    self.enumClass.__name__))
-        return self.enumClass._NAMES_TO_VALUES.get(data, None)
+        try:
+            return self.enumClass[data]
+        except KeyError:
+            raise ValidationError(f"'{data}' is not a valid name for enum 
{self.enumClass.__name__}")
 
 
 def create_serializer(thrift_data_type, enable_date_time_conversion=False, 
**kwargs):
@@ -171,6 +173,10 @@ def process_field(field, enable_date_time_conversion, 
required=False, read_only=
         if field_class == CharField:
             kwargs['allow_blank'] = allow_null
         thrift_model_class = mapping[field[1]]
+
+        if thrift_model_class == IntegerField and field[3] is not None and 
isinstance(field[3], type) and issubclass(field[3], enum.IntEnum):
+            return ThriftEnumField(field[3], required=required, 
read_only=read_only, allow_null=allow_null)
+
         if enable_date_time_conversion and thrift_model_class == IntegerField 
and field[2].lower().endswith("time"):
             thrift_model_class = UTCPosixTimestampDateTimeField
         return thrift_model_class(**kwargs)

Reply via email to