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

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

commit 4c1453556bdd04a5159950bbd246475b554bdedc
Author: yasithdev <[email protected]>
AuthorDate: Thu Jul 17 00:07:13 2025 -0500

    support python 3.10, adapt modern PEP standards, fix bugs
---
 airavata-django-portal-sdk/setup.py                |   3 +-
 .../django_airavata/apps/api/serializers.py        |  17 ++++-
 .../django_airavata/apps/api/thrift_utils.py       |   6 +-
 .../django_airavata/apps/api/views.py              |  14 ++--
 airavata-django-portal/pyproject.toml              |  71 +++++++++++++++++++++
 airavata-django-portal/requirements-dev.txt        | Bin 506 -> 0 bytes
 airavata-django-portal/requirements-mysql.txt      |   1 -
 airavata-django-portal/requirements.txt            |  31 ---------
 airavata-django-portal/setup.cfg                   |  25 --------
 airavata-django-portal/setup.py                    |  56 ----------------
 airavata-django-portal/tox.ini                     |  14 ----
 11 files changed, 97 insertions(+), 141 deletions(-)

diff --git a/airavata-django-portal-sdk/setup.py 
b/airavata-django-portal-sdk/setup.py
index 5367dba9a..14790e312 100644
--- a/airavata-django-portal-sdk/setup.py
+++ b/airavata-django-portal-sdk/setup.py
@@ -26,8 +26,7 @@ setup(
         "django",
         "djangorestframework",
         "airavata-python-sdk",
-        # requests 2.28 drops support for Python 3.6
-        "requests < 2.28.0",
+        "requests < 3",
         "zipstream-new",
     ],
     classifiers=[
diff --git a/airavata-django-portal/django_airavata/apps/api/serializers.py 
b/airavata-django-portal/django_airavata/apps/api/serializers.py
index 1f5f97ae3..d0c6f16db 100644
--- a/airavata-django-portal/django_airavata/apps/api/serializers.py
+++ b/airavata-django-portal/django_airavata/apps/api/serializers.py
@@ -673,7 +673,22 @@ class ComputeResourceReservationSerializer(
 
 class GroupComputeResourcePreferenceSerializer(
         thrift_utils.create_serializer_class(GroupComputeResourcePreference)):
-    reservations = ComputeResourceReservationSerializer(many=True)
+    reservations = serializers.SerializerMethodField()
+
+    def get_reservations(self, obj):
+        try:
+            if (
+                obj.specificPreferences and
+                getattr(obj.specificPreferences, 'slurm', None) and
+                getattr(obj.specificPreferences.slurm, 'reservations', None)
+            ):
+                return ComputeResourceReservationSerializer(
+                    obj.specificPreferences.slurm.reservations, many=True
+                ).data
+            else:
+                return []
+        except AttributeError:
+            return []
 
 
 class GroupResourceProfileSerializer(
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..aaea1b3ce 100644
--- a/airavata-django-portal/django_airavata/apps/api/thrift_utils.py
+++ b/airavata-django-portal/django_airavata/apps/api/thrift_utils.py
@@ -69,16 +69,16 @@ class ThriftEnumField(Field):
     def to_representation(self, obj):
         if obj is None:
             return None
-        return self.enumClass._VALUES_TO_NAMES[obj]
+        return obj.name
 
     def to_internal_value(self, data):
         if self.allow_null and data is None:
             return None
-        if data not in self.enumClass._NAMES_TO_VALUES:
+        if data not in self.enumClass.__members__:
             raise ValidationError(
                 "Not an allowed name of enum {}".format(
                     self.enumClass.__name__))
-        return self.enumClass._NAMES_TO_VALUES.get(data, None)
+        return self.enumClass[data]
 
 
 def create_serializer(thrift_data_type, enable_date_time_conversion=False, 
**kwargs):
diff --git a/airavata-django-portal/django_airavata/apps/api/views.py 
b/airavata-django-portal/django_airavata/apps/api/views.py
index b5cc24e5d..869b4d5c1 100644
--- a/airavata-django-portal/django_airavata/apps/api/views.py
+++ b/airavata-django-portal/django_airavata/apps/api/views.py
@@ -303,14 +303,12 @@ class ExperimentSearchViewSet(mixins.ListModelMixin, 
GenericAPIBackedViewSet):
 
     def get_list(self):
         view = self
-
-        filters = {}
-        for filter_item in self.request.query_params.items():
-            if filter_item[0] in ExperimentSearchFields._NAMES_TO_VALUES:
-                # Lookup enum value for this ExperimentSearchFields
-                search_field = ExperimentSearchFields._NAMES_TO_VALUES[
-                    filter_item[0]]
-                filters[search_field] = filter_item[1]
+        
+        filters = {
+            ExperimentSearchFields[name].value: val
+            for name, val in self.request.query_params.items()
+            if name in ExperimentSearchFields.__members__
+        }
 
         class ExperimentSearchResultIterator(APIResultIterator):
             def get_results(self, limit=-1, offset=0):
diff --git a/airavata-django-portal/pyproject.toml 
b/airavata-django-portal/pyproject.toml
new file mode 100644
index 000000000..f9cf061ab
--- /dev/null
+++ b/airavata-django-portal/pyproject.toml
@@ -0,0 +1,71 @@
+[build-system]
+requires = ["setuptools>=61.0"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "airavata-django-portal"
+version = "0.1"
+description = "The Airavata Django Portal is a web interface to the Apache 
Airavata API implemented using the Django web framework."
+readme = "README.md"
+requires-python = ">=3.6"
+license = {text = "Apache License 2.0"}
+authors = [
+  {name = "Apache Software Foundation", email = "[email protected]"}
+]
+urls = {"Homepage" = "https://github.com/apache/airavata-django-portal"}
+
+# Main dependencies
+dependencies = [
+    "Django < 5",
+    "djangorestframework",
+    "requests",
+    "requests-oauthlib",
+    "thrift",
+    "thrift_connector",
+    "wagtail",
+    "wagtailfontawesome",
+    "jupyter",
+    "papermill",
+    "airavata-django-portal-sdk"
+]
+classifiers = [
+    "Development Status :: 4 - Beta",
+    "Environment :: Web Environment",
+    "Framework :: Django",
+    "Intended Audience :: Developers",
+    "License :: OSI Approved :: Apache Software License",
+    "Natural Language :: English",
+    "Programming Language :: Python :: 3.6",
+    "Topic :: Internet :: WWW/HTTP",
+    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application"
+]
+
+[project.optional-dependencies]
+dev = [
+    "flake8",
+    "flake8-isort"
+]
+mysql = [
+    "mysqlclient"
+] 
+
+[tool.flake8]
+exclude = [
+    "venv",
+    "./airavata",
+    "node_modules",
+    "settings_local.py",
+    "*/migrations",
+    ".tox"
+]
+ignore = ["E501", "W504"]
+
+[tool.isort]
+multi_line_output = 3
+skip = ["migrations", ".git"]
+skip_gitignore = true
+known_third_party = ["airavata", "airavata_django_portal_sdk"]
+
+[tool.tox]
+# Tox does not natively read from pyproject.toml, but this is for 
documentation/reference
+envlist = ["py36", "py37", "py38", "py39", "py310"] 
\ No newline at end of file
diff --git a/airavata-django-portal/requirements-dev.txt 
b/airavata-django-portal/requirements-dev.txt
deleted file mode 100644
index 8c71b9044..000000000
Binary files a/airavata-django-portal/requirements-dev.txt and /dev/null differ
diff --git a/airavata-django-portal/requirements-mysql.txt 
b/airavata-django-portal/requirements-mysql.txt
deleted file mode 100644
index fbbfdfeae..000000000
--- a/airavata-django-portal/requirements-mysql.txt
+++ /dev/null
@@ -1 +0,0 @@
-mysqlclient==2.0.3
diff --git a/airavata-django-portal/requirements.txt 
b/airavata-django-portal/requirements.txt
deleted file mode 100644
index fae3e0066..000000000
--- a/airavata-django-portal/requirements.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-# Pin these dependencies
-Django==3.2.18
-requests==2.25.1
-requests-oauthlib==0.7.0
-thrift==0.22.0
-thrift_connector==0.24
-djangorestframework==3.12.4
-django-webpack-loader==0.6.0
-logging-formatter-anticrlf==1.2
-zipstream-new==1.1.8
-
-wagtail==2.13.4
-wagtailfontawesome==1.2.1
-wagtail-draftail-anchors==0.2.0
-wagtailcodeblock==1.17.1.0
-
-jupyter==1.0.0
-papermill==1.0.1
-
-# gRPC libs
-google-api-python-client==1.12.8
-grpcio-tools==1.48.2 ; python_version < "3.7"
-grpcio-tools==1.51.1 ; python_version >= "3.7"
-grpcio==1.48.2 ; python_version < "3.7"
-grpcio==1.51.1 ; python_version >= "3.7"
-
-airavata-django-portal-sdk== 1.8.4
-airavata-python-sdk==2.1.6
-airavata-django-portal-commons==1.0.0
-
--e "."
diff --git a/airavata-django-portal/setup.cfg b/airavata-django-portal/setup.cfg
deleted file mode 100644
index 8ecf4eead..000000000
--- a/airavata-django-portal/setup.cfg
+++ /dev/null
@@ -1,25 +0,0 @@
-[flake8]
-exclude =
-    venv,
-    ./airavata,
-    node_modules,
-    settings_local.py,
-    */migrations,
-    .tox
-ignore = E501, W504
-
-[isort]
-# Set multi_line_output to option 3 - Vertical Hanging Indent
-
-# from third_party import (
-#     lib1,
-#     lib2,
-#     lib3,
-#     lib4,
-# )
-multi_line_output = 3
-# due to bug, must skip .git folder explicitly
-# https://github.com/timothycrosley/isort/issues/1366
-skip = migrations, .git
-skip_gitignore = true
-known_third_party = airavata, airavata_django_portal_sdk
diff --git a/airavata-django-portal/setup.py b/airavata-django-portal/setup.py
deleted file mode 100644
index c2447dee6..000000000
--- a/airavata-django-portal/setup.py
+++ /dev/null
@@ -1,56 +0,0 @@
-import os
-
-from setuptools import find_packages, setup
-
-
-def read(fname):
-    with open(os.path.join(os.path.dirname(__file__), fname)) as f:
-        return f.read()
-
-
-setup(
-    name='airavata-django-portal',
-    version='0.1',
-    url='https://github.com/apache/airavata-django-portal',
-    author='Apache Software Foundation',
-    author_email='[email protected]',
-    description=('The Airavata Django Portal is a web interface to the '
-                 'Apache Airavata API implemented using the Django web '
-                 'framework.'),
-    long_description=read('README.md'),
-    license='Apache License 2.0',
-    packages=find_packages(),
-    install_requires=[
-            'Django',
-            'djangorestframework',
-            'requests',
-            'requests-oauthlib',
-            'thrift',
-            'thrift_connector',
-            'wagtail',
-            'wagtailfontawesome',
-            'jupyter',
-            'papermill',
-            "airavata-django-portal-sdk",
-    ],
-    extras_require={
-        'dev': [
-            'flake8',
-            'flake8-isort'
-        ],
-        'mysql': [
-            'mysqlclient'
-        ]
-    },
-    classifiers=[
-        'Development Status :: 4 - Beta',
-        'Environment :: Web Environment',
-        'Framework :: Django',
-        'Intended Audience :: Developers',
-        'License :: OSI Approved :: Apache Software License',
-        'Natural Language :: English',
-        'Programming Language :: Python :: 3.6',
-        'Topic :: Internet :: WWW/HTTP',
-        'Topic :: Internet :: WWW/HTTP :: WSGI :: Application'
-    ]
-)
diff --git a/airavata-django-portal/tox.ini b/airavata-django-portal/tox.ini
deleted file mode 100644
index 53a045d2a..000000000
--- a/airavata-django-portal/tox.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-# tox (https://tox.readthedocs.io/) is a tool for running tests
-# in multiple virtualenvs. This configuration file will run the
-# test suite on all supported python versions. To use it, "pip install tox"
-# and then run "tox" from this directory.
-
-[tox]
-envlist = py36, py37, py38, py39, py310 #, py311
-
-[testenv]
-deps =
-    py{3,36,37,38,39,310,311}: -rrequirements-dev.txt
-
-commands =
-    ./runtests.py

Reply via email to