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
