* refactor: folder structure for urls * chore: deleted the urls file * chore: proper naming for urls * chore: reset password url * dev: create refresh token endpoint and endpoint to get settings for user * dev: workspace member me serializer * dev: remove extra fields from project list and retrieve endpoints * dev: update the project list endpoint with member details and deploy boolean * dev: enable user favorite project endpoint and remove is_favorite from project list * dev: analytics refactoring * dev: revert is_favorite settings * dev: create new serializer for project list and add pagination from projects * dev: fix analytics api * dev: module and cycle * dev: update error message, fix module analytics and add null check for labels * dev: member serializer * dev: dynamic base serializer * dev: remove view issues endpoint * dev: url pattern updates * dev: add comments to delete this file * dev: last workspace id * dev: analytics export * dev: export analytics validation * dev: update python runtime * dev: update notification endpoints * dev: cycle and validation fix * dev: issue activity validation when creating updating and deleting issue and comments * dev: update issue activity logging for link and reactions * dev: update module issue activity logging * dev: update module issue activity --------- Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
58 lines
2.3 KiB
Python
58 lines
2.3 KiB
Python
from rest_framework import serializers
|
|
|
|
|
|
class BaseSerializer(serializers.ModelSerializer):
|
|
id = serializers.PrimaryKeyRelatedField(read_only=True)
|
|
|
|
class DynamicBaseSerializer(BaseSerializer):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
# If 'fields' is provided in the arguments, remove it and store it separately.
|
|
# This is done so as not to pass this custom argument up to the superclass.
|
|
fields = kwargs.pop("fields", None)
|
|
|
|
# Call the initialization of the superclass.
|
|
super().__init__(*args, **kwargs)
|
|
|
|
# If 'fields' was provided, filter the fields of the serializer accordingly.
|
|
if fields is not None:
|
|
self.fields = self._filter_fields(fields)
|
|
|
|
def _filter_fields(self, fields):
|
|
"""
|
|
Adjust the serializer's fields based on the provided 'fields' list.
|
|
|
|
:param fields: List or dictionary specifying which fields to include in the serializer.
|
|
:return: The updated fields for the serializer.
|
|
"""
|
|
# Check each field_name in the provided fields.
|
|
for field_name in fields:
|
|
# If the field is a dictionary (indicating nested fields),
|
|
# loop through its keys and values.
|
|
if isinstance(field_name, dict):
|
|
for key, value in field_name.items():
|
|
# If the value of this nested field is a list,
|
|
# perform a recursive filter on it.
|
|
if isinstance(value, list):
|
|
self._filter_fields(self.fields[key], value)
|
|
|
|
# Create a list to store allowed fields.
|
|
allowed = []
|
|
for item in fields:
|
|
# If the item is a string, it directly represents a field's name.
|
|
if isinstance(item, str):
|
|
allowed.append(item)
|
|
# If the item is a dictionary, it represents a nested field.
|
|
# Add the key of this dictionary to the allowed list.
|
|
elif isinstance(item, dict):
|
|
allowed.append(list(item.keys())[0])
|
|
|
|
# Convert the current serializer's fields and the allowed fields to sets.
|
|
existing = set(self.fields)
|
|
allowed = set(allowed)
|
|
|
|
# Remove fields from the serializer that aren't in the 'allowed' list.
|
|
for field_name in (existing - allowed):
|
|
self.fields.pop(field_name)
|
|
|
|
return self.fields
|