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 8008ad401c122d54715f037838e72e7a1e15fc03
Author: yasithdev <[email protected]>
AuthorDate: Fri Jul 18 10:23:53 2025 -0500

    run ruff --fix
---
 .../dynamic_apps/__init__.py                       |   6 +-
 .../dynamic_apps/context_processors.py             |   4 +-
 .../dynamic_apps/urls.py                           |   3 +-
 .../experiment_util/api.py                         |  14 ++-
 .../experiment_util/intermediate_output.py         |  13 ++-
 .../queue_settings_calculators.py                  |   3 +-
 .../tests/test_user_storage.py                     |   4 +-
 .../user_storage/__init__.py                       |   2 +-
 .../airavata_django_portal_sdk/user_storage/api.py |  13 +--
 .../user_storage/backends/CredCommon_pb2.py        |   2 +-
 .../user_storage/backends/CredCommon_pb2_grpc.py   |   1 -
 .../user_storage/backends/MFTApi_pb2.py            |   4 +-
 .../user_storage/backends/MFTApi_pb2_grpc.py       |   6 +-
 .../backends/django_filesystem_provider.py         |  10 +-
 .../airavata_django_portal_sdk/views.py            |   4 +-
 .../django_airavata/apps/admin/apps.py             |   8 +-
 .../admin/management/commands/archive_user_data.py |   4 +-
 .../apps/admin/migrations/0001_initial.py          |   2 +-
 .../django_airavata/apps/api/exceptions.py         |   5 +-
 .../django_airavata/apps/api/helpers.py            |   3 +-
 .../apps/api/migrations/0001_initial.py            |   2 -
 .../0001_squashed_0004_auto_20190625_1938.py       |   2 -
 .../apps/api/migrations/0002_auto_20190513_2037.py |   2 -
 .../apps/api/migrations/0002_auto_20190711_1438.py |   2 -
 .../apps/api/migrations/0003_auto_20190625_1926.py |   2 -
 .../apps/api/migrations/0003_auto_20190716_1549.py |   4 +-
 .../apps/api/migrations/0004_auto_20190625_1938.py |   2 -
 .../apps/api/migrations/0004_auto_20191112_2134.py |   2 -
 .../apps/api/migrations/0005_delete_user_files.py  |   2 -
 ...template_applicationtemplatecontextprocessor.py |   2 +-
 .../django_airavata/apps/api/output_views.py       |  17 ++--
 .../django_airavata/apps/api/serializers.py        |  69 ++++---------
 .../django_airavata/apps/api/signals.py            |   5 +-
 .../django_airavata/apps/api/tests/test_views.py   |  21 ++--
 .../django_airavata/apps/api/thrift_utils.py       |   7 +-
 .../django_airavata/apps/api/urls.py               |   2 +-
 .../django_airavata/apps/api/view_utils.py         |  15 ++-
 .../django_airavata/apps/api/views.py              | 107 +++++++++++----------
 .../django_airavata/apps/auth/backends.py          |  19 ++--
 .../apps/auth/migrations/0001_initial.py           |   5 +-
 .../apps/auth/migrations/0002_emailtemplate.py     |   2 -
 .../migrations/0003_default_email_templates.py     |   7 +-
 .../auth/migrations/0004_password_reset_request.py |   2 -
 .../auth/migrations/0005_auto_20191211_2011.py     |   2 -
 .../auth/migrations/0006_emailverification_next.py |   2 -
 .../auth/migrations/0007_auto_20200917_1610.py     |   4 +-
 .../auth/migrations/0009_auto_20210625_1725.py     |   2 +-
 ...ld_extendeduserprofilefieldlink_extendeduser.py |   2 +-
 .../auth/migrations/0015_auto_20220329_1708.py     |   2 +-
 .../auth/migrations/0019_auto_20221118_1323.py     |   2 +-
 .../django_airavata/apps/auth/models.py            |   9 +-
 .../django_airavata/apps/auth/serializers.py       |  10 +-
 .../django_airavata/apps/auth/signals.py           |   6 +-
 .../apps/auth/tests/test_middleware.py             |   4 +-
 .../django_airavata/apps/auth/utils.py             |   7 +-
 .../django_airavata/apps/auth/views.py             |  61 ++++++------
 .../apps/workspace/migrations/0001_initial.py      |   2 -
 .../workspace/migrations/0002_delete_user_files.py |   2 -
 .../django_airavata/apps/workspace/views.py        |   4 +-
 .../django_airavata/context_processors.py          |   3 +-
 airavata-django-portal/django_airavata/stubs.py    |  13 ++-
 .../django_airavata/uploadhandler.py               |   5 +-
 airavata-django-portal/django_airavata/urls.py     |   2 +-
 airavata-django-portal/django_airavata/utils.py    |  25 ++---
 .../django_airavata/wagtailapps/base/blocks.py     |   2 +-
 .../base/management/commands/set_wagtail_site.py   |   6 +-
 .../wagtailapps/base/migrations/0001_initial.py    |   6 +-
 .../base/migrations/0002_auto_20180410_2236.py     |   6 +-
 .../base/migrations/0003_navextra_nav_logo_link.py |   2 -
 .../base/migrations/0004_auto_20180414_1852.py     |   6 +-
 ...ewayhomepage_rowcybergatewayhomepagerelation.py |   6 +-
 .../base/migrations/0006_auto_20180415_0040.py     |   6 +-
 .../base/migrations/0007_auto_20180415_0045.py     |   6 +-
 .../0008_cybergatewayhomepage_contact.py           |   6 +-
 .../base/migrations/0009_auto_20180415_0141.py     |   6 +-
 .../base/migrations/0010_auto_20180415_0142.py     |   2 -
 .../base/migrations/0011_auto_20180415_0143.py     |   2 -
 .../base/migrations/0012_auto_20180415_0149.py     |   2 -
 .../base/migrations/0013_auto_20180417_2034.py     |   6 +-
 .../base/migrations/0014_homepage_show_footer.py   |   2 -
 ...0015_cybergatewayhomepage_show_announcements.py |   2 -
 .../base/migrations/0016_auto_20180427_1755.py     |   2 -
 .../migrations/0017_gatewayicon_gatewaytitle.py    |   4 +-
 .../base/migrations/0018_auto_20181010_0136.py     |   4 +-
 .../base/migrations/0019_auto_20181025_1522.py     |   6 +-
 .../base/migrations/0020_auto_20190417_1949.py     |   6 +-
 .../base/migrations/0021_auto_20191105_2053.py     |   4 +-
 .../base/migrations/0022_auto_20191106_1542.py     |   6 +-
 .../0023_rowblankpagerelation_container.py         |   4 +-
 .../base/migrations/0024_auto_20200624_1925.py     |   6 +-
 .../base/migrations/0025_auto_20210319_2247.py     |   2 +-
 .../base/migrations/0026_auto_20210923_2212.py     |   4 +-
 .../django_airavata/wagtailapps/base/models.py     |  14 +--
 .../base/templatetags/navigation_tags.py           |   4 +-
 .../wagtailapps/base/wagtail_hooks.py              |   4 +-
 95 files changed, 291 insertions(+), 433 deletions(-)

diff --git 
a/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/__init__.py
 
b/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/__init__.py
index 1ba67e3c8..f83225805 100644
--- 
a/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/__init__.py
+++ 
b/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/__init__.py
@@ -1,7 +1,7 @@
 import logging
 from importlib import import_module
-from importlib_metadata import entry_points
 
+from importlib_metadata import entry_points
 
 # AppConfig instances from custom Django apps
 CUSTOM_DJANGO_APPS = []
@@ -19,7 +19,7 @@ def load(installed_apps, 
entry_point_group="airavata.djangoapp"):
         # Create path to AppConfig class (otherwise the ready() method doesn't 
get
         # called)
         logger.info(f"adding dynamic Django app {entry_point.name}")
-        installed_apps.append("{}.{}".format(entry_point.module, 
entry_point.attr))
+        installed_apps.append(f"{entry_point.module}.{entry_point.attr}")
 
 
 def merge_setting_dict(default, custom_setting):
@@ -31,7 +31,7 @@ def merge_setting_dict(default, custom_setting):
             else:
                 raise Exception(
                     "Custom django app setting conflicts with "
-                    "key {} in {}".format(k, default)
+                    f"key {k} in {default}"
                 )
 
 
diff --git 
a/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/context_processors.py
 
b/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/context_processors.py
index 438016553..9a218ce89 100644
--- 
a/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/context_processors.py
+++ 
b/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/context_processors.py
@@ -1,7 +1,7 @@
 import copy
-from importlib import import_module
 import logging
 import re
+from importlib import import_module
 
 from airavata_django_portal_commons import dynamic_apps
 
@@ -56,7 +56,7 @@ def _get_default_url_home(app_config):
     urls = _get_app_urls(app_config)
     app_name = _get_url_app_name(app_config)
     logger.warning(
-        "Custom Django app {} has no URL namespace " 
"defined".format(app_config.label)
+        f"Custom Django app {app_config.label} has no URL namespace " "defined"
     )
     first_named_url = None
     for urlpattern in urls.urlpatterns:
diff --git 
a/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/urls.py 
b/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/urls.py
index 256a6f88c..f9d58b9a2 100644
--- a/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/urls.py
+++ b/airavata-django-portal/airavata_django_portal_commons/dynamic_apps/urls.py
@@ -1,7 +1,8 @@
-from airavata_django_portal_commons import dynamic_apps
 from django.conf.urls import include
 from django.urls import path
 
+from airavata_django_portal_commons import dynamic_apps
+
 urlpatterns = []
 for custom_django_app in dynamic_apps.CUSTOM_DJANGO_APPS:
     # Custom Django apps may define a url_prefix, otherwise label will be used
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/experiment_util/api.py 
b/airavata-django-portal/airavata_django_portal_sdk/experiment_util/api.py
index 8965adc85..ece5588e1 100644
--- a/airavata-django-portal/airavata_django_portal_sdk/experiment_util/api.py
+++ b/airavata-django-portal/airavata_django_portal_sdk/experiment_util/api.py
@@ -57,7 +57,7 @@ def clone(request, experiment_id):
         # clone experiment
         cloned_experiment_id = request.airavata_client.cloneExperiment(
             request.authz_token, experiment_id,
-            "Clone of {}".format(experiment.experimentName), project_id)
+            f"Clone of {experiment.experimentName}", project_id)
         cloned_experiment = request.airavata_client.getExperiment(
             request.authz_token, cloned_experiment_id)
 
@@ -142,8 +142,8 @@ def _get_writeable_project(request, experiment):
         if _can_write(request, user_project.projectID):
             return user_project.projectID
     raise Exception(
-        "Could not find writeable project for user {} in "
-        "gateway {}".format(request.user.username, settings.GATEWAY_ID))
+        f"Could not find writeable project for user {request.user.username} in 
"
+        f"gateway {settings.GATEWAY_ID}")
 
 
 def _can_write(request, entity_id):
@@ -162,8 +162,7 @@ def _copy_cloned_experiment_input_uris(request, 
cloned_experiment):
             cloned_data_product = _copy_experiment_input_uri(request,
                                                              
experiment_input.value)
             if cloned_data_product is None:
-                logger.warning("Setting cloned input {} to null".format(
-                    experiment_input.name))
+                logger.warning(f"Setting cloned input {experiment_input.name} 
to null")
                 experiment_input.value = None
             else:
                 experiment_input.value = cloned_data_product.productUri
@@ -176,8 +175,7 @@ def _copy_cloned_experiment_input_uris(request, 
cloned_experiment):
                                                                  
data_product_uri)
                 if cloned_data_product is None:
                     logger.warning(
-                        "Omitting a cloned input value for {}".format(
-                            experiment_input.name))
+                        f"Omitting a cloned input value for 
{experiment_input.name}")
                 else:
                     cloned_data_product_uris.append(
                         cloned_data_product.productUri)
@@ -190,5 +188,5 @@ def _copy_experiment_input_uri(request, data_product_uri):
             request, data_product_uri=data_product_uri)
     else:
         logger.warning("Could not find file for source data "
-                       "product {}".format(data_product_uri))
+                       f"product {data_product_uri}")
         return None
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/experiment_util/intermediate_output.py
 
b/airavata-django-portal/airavata_django_portal_sdk/experiment_util/intermediate_output.py
index 5d02ccd2d..dec812f4f 100644
--- 
a/airavata-django-portal/airavata_django_portal_sdk/experiment_util/intermediate_output.py
+++ 
b/airavata-django-portal/airavata_django_portal_sdk/experiment_util/intermediate_output.py
@@ -1,5 +1,4 @@
 import logging
-from typing import List, Union
 
 from airavata.model.data.replica.ttypes import DataProductModel
 from airavata.model.experiment.ttypes import ExperimentModel
@@ -11,7 +10,7 @@ from airavata.model.task.ttypes import TaskModel, TaskTypes
 logger = logging.getLogger(__name__)
 
 
-def get_intermediate_output_process_status(request, experiment: 
ExperimentModel, *output_name: str) -> Union[ProcessStatus, None]:
+def get_intermediate_output_process_status(request, experiment: 
ExperimentModel, *output_name: str) -> ProcessStatus | None:
     """Return ProcessStatus of intermediate output fetch process, or None if 
not available."""
     # check that there is at least one intermediate output fetching process
     output_fetching_processes = _get_output_fetching_processes(experiment)
@@ -29,7 +28,7 @@ def get_intermediate_output_process_status(request, 
experiment: ExperimentModel,
 def can_fetch_intermediate_output(request, experiment: ExperimentModel, 
output_name: str) -> bool:
     """Return True if intermediate output can be fetched for the given named 
output."""
     # look at job status and check if currently running intermediate output 
process
-    jobs: List[JobModel] = []
+    jobs: list[JobModel] = []
     process: ProcessModel
     task: TaskModel
     for process in experiment.processes:
@@ -60,7 +59,7 @@ def fetch_intermediate_output(request, experiment_id: str, 
*output_name: str) ->
         request.authz_token, experiment_id, list(output_name))
 
 
-def get_intermediate_output_data_products(request, experiment: 
ExperimentModel, output_name: str) -> List[DataProductModel]:
+def get_intermediate_output_data_products(request, experiment: 
ExperimentModel, output_name: str) -> list[DataProductModel]:
     """Return the DataProduct instance(s) for a experiment output."""
     output_fetching_processes = _get_output_fetching_processes(experiment)
 
@@ -88,10 +87,10 @@ def get_intermediate_output_data_products(request, 
experiment: ExperimentModel,
     return data_products
 
 
-def _get_output_fetching_processes(experiment: ExperimentModel) -> 
List[ProcessModel]:
+def _get_output_fetching_processes(experiment: ExperimentModel) -> 
list[ProcessModel]:
     "sort the processes (most recent first) and filter to just the output 
fetching ones"
-    processes: List[ProcessModel] = sorted(experiment.processes, key=lambda p: 
p.creationTime, reverse=True) if experiment.processes else []
-    output_fetching_processes: List[ProcessModel] = []
+    processes: list[ProcessModel] = sorted(experiment.processes, key=lambda p: 
p.creationTime, reverse=True) if experiment.processes else []
+    output_fetching_processes: list[ProcessModel] = []
     for process in processes:
         if any(map(lambda t: t.taskType == TaskTypes.OUTPUT_FETCHING, 
process.tasks)):
             output_fetching_processes.append(process)
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/queue_settings_calculators.py
 
b/airavata-django-portal/airavata_django_portal_sdk/queue_settings_calculators.py
index b2c15ec00..ee1c2149f 100644
--- 
a/airavata-django-portal/airavata_django_portal_sdk/queue_settings_calculators.py
+++ 
b/airavata-django-portal/airavata_django_portal_sdk/queue_settings_calculators.py
@@ -1,4 +1,5 @@
-from typing import Callable, NamedTuple
+from collections.abc import Callable
+from typing import NamedTuple
 
 QUEUE_SETTINGS_CALCULATORS = []
 
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/tests/test_user_storage.py 
b/airavata-django-portal/airavata_django_portal_sdk/tests/test_user_storage.py
index 0126c77d0..e28329501 100644
--- 
a/airavata-django-portal/airavata_django_portal_sdk/tests/test_user_storage.py
+++ 
b/airavata-django-portal/airavata_django_portal_sdk/tests/test_user_storage.py
@@ -9,7 +9,7 @@ from airavata.model.data.replica.ttypes import (
     DataProductModel,
     DataProductType,
     DataReplicaLocationModel,
-    ReplicaLocationCategory
+    ReplicaLocationCategory,
 )
 from airavata.model.security.ttypes import AuthzToken
 from django.conf import settings
@@ -107,7 +107,7 @@ class SaveTests(BaseTestCase):
             os.makedirs(os.path.dirname(path), exist_ok=True)
             with open(path, 'w') as f:
                 f.write("Some Unicode text")
-            with open(path, 'r') as f:
+            with open(path) as f:
                 dp = user_storage.save(
                     self.request, "some/path", f,
                     content_type="application/octet-stream")
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/__init__.py 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/__init__.py
index 5b0c9015e..bd44a1e16 100644
--- a/airavata-django-portal/airavata_django_portal_sdk/user_storage/__init__.py
+++ b/airavata-django-portal/airavata_django_portal_sdk/user_storage/__init__.py
@@ -23,7 +23,7 @@ from .api import (
     save_input_file,
     update_data_product_content,
     update_file_content,
-    user_file_exists
+    user_file_exists,
 )
 
 __all__ = [
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/api.py 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/api.py
index dff6a4933..0f8937592 100644
--- a/airavata-django-portal/airavata_django_portal_sdk/user_storage/api.py
+++ b/airavata-django-portal/airavata_django_portal_sdk/user_storage/api.py
@@ -14,16 +14,14 @@ from airavata.model.data.replica.ttypes import (
     DataProductType,
     DataReplicaLocationModel,
     ReplicaLocationCategory,
-    ReplicaPersistentType
+    ReplicaPersistentType,
 )
 from django.conf import settings
 from django.core.exceptions import ObjectDoesNotExist
 from django.urls import reverse
 
 from airavata_django_portal_sdk import remoteapi
-from airavata_django_portal_sdk.user_storage.backends.base import (
-    ProvidesDownloadUrl
-)
+from airavata_django_portal_sdk.user_storage.backends.base import 
ProvidesDownloadUrl
 
 from ..util import convert_iso8601_to_datetime
 
@@ -513,9 +511,7 @@ def delete(request, data_product=None, 
data_product_uri=None):
             _delete_data_product(data_product.ownerName, path, 
storage_resource_id)
         except Exception:
             logger.exception(
-                "Unable to delete file {} for data product uri {}".format(
-                    path, data_product.productUri
-                ),
+                f"Unable to delete file {path} for data product uri 
{data_product.productUri}",
                 extra={'request': request}
             )
             raise
@@ -864,8 +860,7 @@ def _determine_content_type(full_path, content_type=None, 
backend=None):
 def _create_replica_location(full_path, file_name, storage_resource_id):
     data_replica_location = DataReplicaLocationModel()
     data_replica_location.storageResourceId = storage_resource_id
-    data_replica_location.replicaName = "{} gateway data store copy".format(
-        file_name)
+    data_replica_location.replicaName = f"{file_name} gateway data store copy"
     data_replica_location.replicaLocationCategory = (
         ReplicaLocationCategory.GATEWAY_DATA_STORE
     )
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/CredCommon_pb2.py
 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/CredCommon_pb2.py
index e65d05446..479c08599 100644
--- 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/CredCommon_pb2.py
+++ 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/CredCommon_pb2.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: CredCommon.proto
 """Generated protocol buffer code."""
@@ -6,6 +5,7 @@ from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/CredCommon_pb2_grpc.py
 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/CredCommon_pb2_grpc.py
index 2daafffeb..8a4eb2af4 100644
--- 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/CredCommon_pb2_grpc.py
+++ 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/CredCommon_pb2_grpc.py
@@ -1,4 +1,3 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 """Client and server classes corresponding to protobuf-defined services."""
-import grpc
 
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/MFTApi_pb2.py
 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/MFTApi_pb2.py
index e4ea93d2d..f1c13f79c 100644
--- 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/MFTApi_pb2.py
+++ 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/MFTApi_pb2.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: MFTApi.proto
 """Generated protocol buffer code."""
@@ -6,6 +5,7 @@ from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
+
 # @@protoc_insertion_point(imports)
 
 _sym_db = _symbol_database.Default()
@@ -13,8 +13,8 @@ _sym_db = _symbol_database.Default()
 
 from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
-from . import CredCommon_pb2 as CredCommon__pb2
 
+from . import CredCommon_pb2 as CredCommon__pb2
 
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='MFTApi.proto',
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/MFTApi_pb2_grpc.py
 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/MFTApi_pb2_grpc.py
index 6bb694c26..58b769d1a 100644
--- 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/MFTApi_pb2_grpc.py
+++ 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/MFTApi_pb2_grpc.py
@@ -5,7 +5,7 @@ import grpc
 from . import MFTApi_pb2 as MFTApi__pb2
 
 
-class MFTApiServiceStub(object):
+class MFTApiServiceStub:
     """Missing associated documentation comment in .proto file."""
 
     def __init__(self, channel):
@@ -56,7 +56,7 @@ class MFTApiServiceStub(object):
                 )
 
 
-class MFTApiServiceServicer(object):
+class MFTApiServiceServicer:
     """Missing associated documentation comment in .proto file."""
 
     def submitTransfer(self, request, context):
@@ -157,7 +157,7 @@ def add_MFTApiServiceServicer_to_server(servicer, server):
 
 
  # This class is part of an EXPERIMENTAL API.
-class MFTApiService(object):
+class MFTApiService:
     """Missing associated documentation comment in .proto file."""
 
     @staticmethod
diff --git 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/django_filesystem_provider.py
 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/django_filesystem_provider.py
index ef517ce54..cbd586942 100644
--- 
a/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/django_filesystem_provider.py
+++ 
b/airavata-django-portal/airavata_django_portal_sdk/user_storage/backends/django_filesystem_provider.py
@@ -194,7 +194,7 @@ class _Datastore:
             return self.storage.open(path)
         else:
             raise ObjectDoesNotExist(
-                "File path does not exist: {}".format(path))
+                f"File path does not exist: {path}")
 
     def save(self, path, file, name=None):
         """Save file to username/path in data store."""
@@ -212,7 +212,7 @@ class _Datastore:
         if not user_data_storage.exists(path):
             self._makedirs(path)
         else:
-            raise Exception("Directory {} already exists".format(path))
+            raise Exception(f"Directory {path} already exists")
 
     def create_symlink(self, source_path, dest_path):
         user_data_storage = self.storage
@@ -227,7 +227,7 @@ class _Datastore:
             user_data_storage.delete(path)
         else:
             raise ObjectDoesNotExist(
-                "File path does not exist: {}".format(path))
+                f"File path does not exist: {path}")
 
     def delete_dir(self, path):
         """Delete entire directory in this data store."""
@@ -239,7 +239,7 @@ class _Datastore:
             shutil.rmtree(user_path)
         else:
             raise ObjectDoesNotExist(
-                "File path does not exist: {}".format(path))
+                f"File path does not exist: {path}")
 
     def get_experiment_dir(
         self, project_name=None, experiment_name=None, path=None
@@ -291,7 +291,7 @@ class _Datastore:
             mode=user_experiment_data_storage.directory_permissions_mode)
 
     def list_user_dir(self, file_path):
-        logger.debug("file_path={}".format(file_path))
+        logger.debug(f"file_path={file_path}")
         user_data_storage = self.storage
         return user_data_storage.listdir(file_path)
 
diff --git a/airavata-django-portal/airavata_django_portal_sdk/views.py 
b/airavata-django-portal/airavata_django_portal_sdk/views.py
index 39a960223..3ab64308a 100644
--- a/airavata-django-portal/airavata_django_portal_sdk/views.py
+++ b/airavata-django-portal/airavata_django_portal_sdk/views.py
@@ -49,8 +49,8 @@ def download_file(request):
         # 'mime-type' url parameter overrides
         mime_type = request.GET.get('mime-type', mime_type)
     except Exception as e:
-        logger.warning("Failed to load DataProduct for {}"
-                       .format(data_product_uri), exc_info=True)
+        logger.warning(f"Failed to load DataProduct for {data_product_uri}"
+                       , exc_info=True)
         raise Http404("data product does not exist") from e
     try:
         data_file = user_storage.open_file(request, data_product)
diff --git a/airavata-django-portal/django_airavata/apps/admin/apps.py 
b/airavata-django-portal/django_airavata/apps/admin/apps.py
index 9c961983b..99b42b3c8 100644
--- a/airavata-django-portal/django_airavata/apps/admin/apps.py
+++ b/airavata-django-portal/django_airavata/apps/admin/apps.py
@@ -6,19 +6,19 @@ class AdminConfig(AiravataAppConfig):
     name = 'django_airavata.apps.admin'
     label = 'django_airavata_admin'
     verbose_name = 'Settings'
-    
+
     @property
     def app_order(self):
         return 100
-    
+
     @property
     def url_home(self):
         return 'django_airavata_admin:home'
-    
+
     @property
     def fa_icon_class(self):
         return 'fa-cog'
-    
+
     @property
     def app_description(self):
         return """
diff --git 
a/airavata-django-portal/django_airavata/apps/admin/management/commands/archive_user_data.py
 
b/airavata-django-portal/django_airavata/apps/admin/management/commands/archive_user_data.py
index bab8be533..20b4ab5b3 100644
--- 
a/airavata-django-portal/django_airavata/apps/admin/management/commands/archive_user_data.py
+++ 
b/airavata-django-portal/django_airavata/apps/admin/management/commands/archive_user_data.py
@@ -4,8 +4,8 @@ import os
 import shutil
 import tarfile
 import tempfile
+from collections.abc import Iterator
 from pathlib import Path
-from typing import Iterator
 
 from django.conf import settings
 from django.core.management.base import BaseCommand, CommandError
@@ -49,7 +49,7 @@ class Command(BaseCommand):
                 archive_list_filename = f"{archive_basename}.txt"
                 archive_list_filepath = os.path.join(tmpdir, 
archive_list_filename)
                 entry_count = 0
-                with open(archive_list_filepath, "wt") as archive_list_file:
+                with open(archive_list_filepath, "w") as archive_list_file:
                     for entry in entries_to_archive:
                         entry_count = entry_count + 1
                         archive_list_file.write(f"{entry.path}\n")
diff --git 
a/airavata-django-portal/django_airavata/apps/admin/migrations/0001_initial.py 
b/airavata-django-portal/django_airavata/apps/admin/migrations/0001_initial.py
index 6223ce73c..4222db753 100644
--- 
a/airavata-django-portal/django_airavata/apps/admin/migrations/0001_initial.py
+++ 
b/airavata-django-portal/django_airavata/apps/admin/migrations/0001_initial.py
@@ -1,7 +1,7 @@
 # Generated by Django 3.2.18 on 2023-04-17 14:10
 
-from django.db import migrations, models
 import django.db.models.deletion
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git a/airavata-django-portal/django_airavata/apps/api/exceptions.py 
b/airavata-django-portal/django_airavata/apps/api/exceptions.py
index bd8e1284e..e32772a0b 100644
--- a/airavata-django-portal/django_airavata/apps/api/exceptions.py
+++ b/airavata-django-portal/django_airavata/apps/api/exceptions.py
@@ -1,10 +1,7 @@
 import logging
 import sys
 
-from airavata.api.error.ttypes import (
-    AuthorizationException,
-    ExperimentNotFoundException
-)
+from airavata.api.error.ttypes import AuthorizationException, 
ExperimentNotFoundException
 from django.core.exceptions import ObjectDoesNotExist
 from django.http import JsonResponse
 from rest_framework import status
diff --git a/airavata-django-portal/django_airavata/apps/api/helpers.py 
b/airavata-django-portal/django_airavata/apps/api/helpers.py
index c82008859..c67f3fb00 100644
--- a/airavata-django-portal/django_airavata/apps/api/helpers.py
+++ b/airavata-django-portal/django_airavata/apps/api/helpers.py
@@ -60,8 +60,7 @@ class WorkspacePreferencesHelper:
             most_recent_project = self._get_most_recent_project(request)
             if most_recent_project:
                 logger.warn(
-                    "_check: updating most_recent_project_id to {}".format(
-                        most_recent_project.projectID))
+                    f"_check: updating most_recent_project_id to 
{most_recent_project.projectID}")
                 prefs.most_recent_project_id = most_recent_project.projectID
             else:
                 logger.warn("_check: no writeable projects found")
diff --git 
a/airavata-django-portal/django_airavata/apps/api/migrations/0001_initial.py 
b/airavata-django-portal/django_airavata/apps/api/migrations/0001_initial.py
index c59bae5af..8e416399e 100644
--- a/airavata-django-portal/django_airavata/apps/api/migrations/0001_initial.py
+++ b/airavata-django-portal/django_airavata/apps/api/migrations/0001_initial.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.20 on 2019-03-05 19:35
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/api/migrations/0001_squashed_0004_auto_20190625_1938.py
 
b/airavata-django-portal/django_airavata/apps/api/migrations/0001_squashed_0004_auto_20190625_1938.py
index 7251fce2a..9d12a06d8 100644
--- 
a/airavata-django-portal/django_airavata/apps/api/migrations/0001_squashed_0004_auto_20190625_1938.py
+++ 
b/airavata-django-portal/django_airavata/apps/api/migrations/0001_squashed_0004_auto_20190625_1938.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2019-06-25 19:39
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/api/migrations/0002_auto_20190513_2037.py
 
b/airavata-django-portal/django_airavata/apps/api/migrations/0002_auto_20190513_2037.py
index 4bd49880a..39eaa154d 100644
--- 
a/airavata-django-portal/django_airavata/apps/api/migrations/0002_auto_20190513_2037.py
+++ 
b/airavata-django-portal/django_airavata/apps/api/migrations/0002_auto_20190513_2037.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.20 on 2019-05-13 20:37
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/api/migrations/0002_auto_20190711_1438.py
 
b/airavata-django-portal/django_airavata/apps/api/migrations/0002_auto_20190711_1438.py
index 8b938a780..d52056c45 100644
--- 
a/airavata-django-portal/django_airavata/apps/api/migrations/0002_auto_20190711_1438.py
+++ 
b/airavata-django-portal/django_airavata/apps/api/migrations/0002_auto_20190711_1438.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2019-07-11 14:38
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/api/migrations/0003_auto_20190625_1926.py
 
b/airavata-django-portal/django_airavata/apps/api/migrations/0003_auto_20190625_1926.py
index 3b639ce4a..4fffe7d15 100644
--- 
a/airavata-django-portal/django_airavata/apps/api/migrations/0003_auto_20190625_1926.py
+++ 
b/airavata-django-portal/django_airavata/apps/api/migrations/0003_auto_20190625_1926.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2019-06-25 19:26
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/api/migrations/0003_auto_20190716_1549.py
 
b/airavata-django-portal/django_airavata/apps/api/migrations/0003_auto_20190716_1549.py
index 3840aab39..ded59bef4 100644
--- 
a/airavata-django-portal/django_airavata/apps/api/migrations/0003_auto_20190716_1549.py
+++ 
b/airavata-django-portal/django_airavata/apps/api/migrations/0003_auto_20190716_1549.py
@@ -1,9 +1,7 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2019-07-16 15:49
-from __future__ import unicode_literals
 
-from django.db import migrations, models
 import django.db.models.deletion
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/apps/api/migrations/0004_auto_20190625_1938.py
 
b/airavata-django-portal/django_airavata/apps/api/migrations/0004_auto_20190625_1938.py
index 245efca84..bd9718d53 100644
--- 
a/airavata-django-portal/django_airavata/apps/api/migrations/0004_auto_20190625_1938.py
+++ 
b/airavata-django-portal/django_airavata/apps/api/migrations/0004_auto_20190625_1938.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2019-06-25 19:38
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/api/migrations/0004_auto_20191112_2134.py
 
b/airavata-django-portal/django_airavata/apps/api/migrations/0004_auto_20191112_2134.py
index 994dad65a..99eaad481 100644
--- 
a/airavata-django-portal/django_airavata/apps/api/migrations/0004_auto_20191112_2134.py
+++ 
b/airavata-django-portal/django_airavata/apps/api/migrations/0004_auto_20191112_2134.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2019-11-12 21:34
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/api/migrations/0005_delete_user_files.py
 
b/airavata-django-portal/django_airavata/apps/api/migrations/0005_delete_user_files.py
index ed22e1276..4fcdf7e05 100644
--- 
a/airavata-django-portal/django_airavata/apps/api/migrations/0005_delete_user_files.py
+++ 
b/airavata-django-portal/django_airavata/apps/api/migrations/0005_delete_user_files.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2020-07-01 15:59
-from __future__ import unicode_literals
 
 from django.db import migrations
 
diff --git 
a/airavata-django-portal/django_airavata/apps/api/migrations/0006_applicationtemplate_applicationtemplatecontextprocessor.py
 
b/airavata-django-portal/django_airavata/apps/api/migrations/0006_applicationtemplate_applicationtemplatecontextprocessor.py
index 688cc6377..2975e8dd2 100644
--- 
a/airavata-django-portal/django_airavata/apps/api/migrations/0006_applicationtemplate_applicationtemplatecontextprocessor.py
+++ 
b/airavata-django-portal/django_airavata/apps/api/migrations/0006_applicationtemplate_applicationtemplatecontextprocessor.py
@@ -1,8 +1,8 @@
 # Generated by Django 2.2.17 on 2021-05-20 17:13
 
+import django.db.models.deletion
 from django.conf import settings
 from django.db import migrations, models
-import django.db.models.deletion
 
 
 class Migration(migrations.Migration):
diff --git a/airavata-django-portal/django_airavata/apps/api/output_views.py 
b/airavata-django-portal/django_airavata/apps/api/output_views.py
index 3f382a414..90d502ea0 100644
--- a/airavata-django-portal/django_airavata/apps/api/output_views.py
+++ b/airavata-django-portal/django_airavata/apps/api/output_views.py
@@ -8,10 +8,11 @@ from functools import partial
 import nbformat
 import papermill as pm
 from airavata.model.application.io.ttypes import DataType
-from airavata_django_portal_sdk import user_storage
 from django.conf import settings
 from nbconvert import HTMLExporter
 
+from airavata_django_portal_sdk import user_storage
+
 logger = logging.getLogger(__name__)
 
 BASE_DIR = os.path.dirname(os.path.abspath(__file__))
@@ -91,7 +92,7 @@ def get_output_views(request, experiment, 
application_interface=None):
                     output_view_provider_id]
             else:
                 logger.warning("Unable to find output view provider with "
-                               "name '{}'".format(output_view_provider_id))
+                               f"name '{output_view_provider_id}'")
             if output_view_provider is not None:
                 view_config = {
                     'provider-id': output_view_provider_id,
@@ -120,18 +121,17 @@ def _get_output_view_provider(output_view_provider_id):
 
 def _get_output_view_providers(experiment_output, application_interface):
     output_view_providers = []
-    logger.debug("experiment_output={}".format(experiment_output))
+    logger.debug(f"experiment_output={experiment_output}")
     if experiment_output.metaData:
         try:
             output_metadata = json.loads(experiment_output.metaData)
-            logger.debug("output_metadata={}".format(output_metadata))
+            logger.debug(f"output_metadata={output_metadata}")
             if 'output-view-providers' in output_metadata:
                 output_view_providers.extend(
                     output_metadata['output-view-providers'])
         except Exception:
             logger.exception(
-                "Failed to parse metadata for output {}".format(
-                    experiment_output.name))
+                f"Failed to parse metadata for output 
{experiment_output.name}")
     # Add in any output view providers defined on the application interface
     if application_interface is not None:
         app_output_view_providers = _get_application_output_view_providers(
@@ -149,7 +149,7 @@ def 
_get_application_output_view_providers(application_interface, output_name):
                   for o in application_interface.applicationOutputs
                   if o.name == output_name]
     if len(app_output) == 1:
-        logger.debug("{}: {}".format(output_name, app_output))
+        logger.debug(f"{output_name}: {app_output}")
         app_output = app_output[0]
     else:
         return []
@@ -160,8 +160,7 @@ def 
_get_application_output_view_providers(application_interface, output_name):
                 return output_metadata['output-view-providers']
         except Exception:
             logger.exception(
-                "Failed to parse metadata for output {}".format(
-                    app_output.name))
+                f"Failed to parse metadata for output {app_output.name}")
     return []
 
 
diff --git a/airavata-django-portal/django_airavata/apps/api/serializers.py 
b/airavata-django-portal/django_airavata/apps/api/serializers.py
index 7c68a6f63..6aa316138 100644
--- a/airavata-django-portal/django_airavata/apps/api/serializers.py
+++ b/airavata-django-portal/django_airavata/apps/api/serializers.py
@@ -9,68 +9,34 @@ from airavata.model.appcatalog.appdeployment.ttypes import (
     ApplicationDeploymentDescription,
     ApplicationModule,
     CommandObject,
-    SetEnvPaths
-)
-from airavata.model.appcatalog.appinterface.ttypes import (
-    ApplicationInterfaceDescription
-)
-from airavata.model.appcatalog.computeresource.ttypes import (
-    BatchQueue,
-    ComputeResourceDescription
-)
-from airavata.model.appcatalog.gatewayprofile.ttypes import (
-    GatewayResourceProfile,
-    StoragePreference
+    SetEnvPaths,
 )
+from airavata.model.appcatalog.appinterface.ttypes import 
ApplicationInterfaceDescription
+from airavata.model.appcatalog.computeresource.ttypes import BatchQueue, 
ComputeResourceDescription
+from airavata.model.appcatalog.gatewayprofile.ttypes import 
GatewayResourceProfile, StoragePreference
 from airavata.model.appcatalog.groupresourceprofile.ttypes import (
     ComputeResourceReservation,
     GroupComputeResourcePreference,
-    GroupResourceProfile
+    GroupResourceProfile,
 )
 from airavata.model.appcatalog.parser.ttypes import Parser
-from airavata.model.appcatalog.storageresource.ttypes import (
-    StorageResourceDescription
-)
-from airavata.model.application.io.ttypes import (
-    InputDataObjectType,
-    OutputDataObjectType
-)
-from airavata.model.credential.store.ttypes import (
-    CredentialSummary,
-    SummaryType
-)
-from airavata.model.data.replica.ttypes import (
-    DataProductModel,
-    DataReplicaLocationModel
-)
-from airavata.model.experiment.ttypes import (
-    ExperimentModel,
-    ExperimentStatistics,
-    ExperimentSummaryModel
-)
+from airavata.model.appcatalog.storageresource.ttypes import 
StorageResourceDescription
+from airavata.model.application.io.ttypes import InputDataObjectType, 
OutputDataObjectType
+from airavata.model.credential.store.ttypes import CredentialSummary, 
SummaryType
+from airavata.model.data.replica.ttypes import DataProductModel, 
DataReplicaLocationModel
+from airavata.model.experiment.ttypes import ExperimentModel, 
ExperimentStatistics, ExperimentSummaryModel
 from airavata.model.group.ttypes import GroupModel, ResourcePermissionType
 from airavata.model.job.ttypes import JobModel
-from airavata.model.status.ttypes import (
-    ExperimentState,
-    ExperimentStatus,
-    ProcessStatus
-)
+from airavata.model.status.ttypes import ExperimentState, ExperimentStatus, 
ProcessStatus
 from airavata.model.user.ttypes import UserProfile
-from airavata.model.workspace.ttypes import (
-    Notification,
-    NotificationPriority,
-    Project
-)
-from airavata_django_portal_sdk import (
-    experiment_util,
-    queue_settings_calculators,
-    user_storage
-)
+from airavata.model.workspace.ttypes import Notification, 
NotificationPriority, Project
 from django.conf import settings
 from django.contrib.auth import get_user_model
 from django.urls import reverse
 from rest_framework import serializers
 
+from airavata_django_portal_sdk import experiment_util, 
queue_settings_calculators, user_storage
+
 from . import models, thrift_utils, view_utils
 
 log = logging.getLogger(__name__)
@@ -87,9 +53,8 @@ class FullyEncodedHyperlinkedIdentityField(
             encoded_lookup_value = quote(lookup_value, safe="")
         except Exception:
             log.warning(
-                "Failed to encode lookup_value [{}] for lookup_field "
-                "[{}] of object [{}]".format(
-                    lookup_value, self.lookup_field, obj))
+                f"Failed to encode lookup_value [{lookup_value}] for 
lookup_field "
+                f"[{self.lookup_field}] of object [{obj}]")
             raise
         # Bit of a hack. Django's URL reversing does URL encoding but it
         # doesn't encode all characters including some like '/' that are used
@@ -110,7 +75,7 @@ class 
UTCPosixTimestampDateTimeField(serializers.DateTimeField):
 
     def to_representation(self, obj):
         # Create datetime instance from milliseconds that is aware of timezon
-        dt = datetime.datetime.fromtimestamp(obj / 1000, datetime.timezone.utc)
+        dt = datetime.datetime.fromtimestamp(obj / 1000, datetime.UTC)
         return super().to_representation(dt)
 
     def to_internal_value(self, data):
diff --git a/airavata-django-portal/django_airavata/apps/api/signals.py 
b/airavata-django-portal/django_airavata/apps/api/signals.py
index ceab29b86..70ac7c3f4 100644
--- a/airavata-django-portal/django_airavata/apps/api/signals.py
+++ b/airavata-django-portal/django_airavata/apps/api/signals.py
@@ -2,11 +2,12 @@
 
 import logging
 
-from airavata_django_portal_sdk import user_storage
 from django.conf import settings
 from django.contrib.auth.signals import user_logged_in
 from django.dispatch import Signal, receiver
 
+from airavata_django_portal_sdk import user_storage
+
 log = logging.getLogger(__name__)
 
 
@@ -22,7 +23,7 @@ def create_user_storage_dir(sender, request, user, **kwargs):
     path = ""
     if not user_storage.dir_exists(request, path):
         user_storage.create_user_dir(request, path)
-        log.info("Created home directory for user {}".format(user.username))
+        log.info(f"Created home directory for user {user.username}")
 
     if hasattr(settings, 'GATEWAY_DATA_SHARED_DIRECTORIES'):
         for name, entry in settings.GATEWAY_DATA_SHARED_DIRECTORIES.items():
diff --git 
a/airavata-django-portal/django_airavata/apps/api/tests/test_views.py 
b/airavata-django-portal/django_airavata/apps/api/tests/test_views.py
index 201538dc4..91165dfca 100644
--- a/airavata-django-portal/django_airavata/apps/api/tests/test_views.py
+++ b/airavata-django-portal/django_airavata/apps/api/tests/test_views.py
@@ -6,6 +6,7 @@ from airavata.model.user.ttypes import UserProfile
 from django.contrib.auth.models import User
 from django.test import TestCase, override_settings
 from django.urls import reverse
+
 # from rest_framework import status
 from rest_framework.test import APIRequestFactory, force_authenticate
 
@@ -73,11 +74,11 @@ class GroupViewSetTests(TestCase):
             sender=views.GroupViewSet)
         group_create = views.GroupViewSet.as_view({'post': 'create'})
         response = group_create(request)
-        self.assertEquals(201, response.status_code)
-        self.assertEquals("abc123", response.data['id'])
+        self.assertEqual(201, response.status_code)
+        self.assertEqual("abc123", response.data['id'])
         user_added_to_group_handler.assert_called_once()
         args, kwargs = user_added_to_group_handler.call_args
-        self.assertEquals("abc123", kwargs["groups"][0].id)
+        self.assertEqual("abc123", kwargs["groups"][0].id)
         self.assertIs(user_profile, kwargs["user"])
 
     def test_update_group_sends_user_added_to_group_signal(self):
@@ -142,8 +143,8 @@ class GroupViewSetTests(TestCase):
             sender=views.GroupViewSet)
         group_update = views.GroupViewSet.as_view({'put': 'update'})
         response = group_update(request, group_id="abc123")
-        self.assertEquals(200, response.status_code)
-        self.assertEquals("abc123", response.data['id'])
+        self.assertEqual(200, response.status_code)
+        self.assertEqual("abc123", response.data['id'])
 
         # verify addUsersToGroup
         group_manager_mock.addUsersToGroup.assert_called_once()
@@ -160,7 +161,7 @@ class GroupViewSetTests(TestCase):
 
         user_added_to_group_handler.assert_called_once()
         args, kwargs = user_added_to_group_handler.call_args
-        self.assertEquals("abc123", kwargs["groups"][0].id)
+        self.assertEqual("abc123", kwargs["groups"][0].id)
         self.assertIs(user_profile, kwargs["user"])
 
 
@@ -249,7 +250,7 @@ class IAMUserViewSetTests(TestCase):
             sender=views.IAMUserViewSet)
         iam_user_update = views.IAMUserViewSet.as_view({'put': 'update'})
         response = iam_user_update(request, user_id=username)
-        self.assertEquals(200, response.status_code)
+        self.assertEqual(200, response.status_code)
 
         user_profile_mock.doesUserExist.assert_called_once()
         group_manager_mock.getAllGroupsUserBelongs.assert_called_once()
@@ -357,7 +358,7 @@ class IAMUserViewSetTests(TestCase):
             sender=views.IAMUserViewSet)
         iam_user_update = views.IAMUserViewSet.as_view({'put': 'update'})
         response = iam_user_update(request, user_id=username)
-        self.assertEquals(200, response.status_code)
+        self.assertEqual(200, response.status_code)
 
         user_profile_mock.doesUserExist.assert_called_once()
         group_manager_mock.getAllGroupsUserBelongs.assert_called_once()
@@ -457,7 +458,7 @@ class IAMUserViewSetTests(TestCase):
             sender=views.IAMUserViewSet)
         iam_user_update = views.IAMUserViewSet.as_view({'put': 'update'})
         response = iam_user_update(request, user_id=username)
-        self.assertEquals(200, response.status_code)
+        self.assertEqual(200, response.status_code)
 
         user_profile_mock.doesUserExist.assert_called_once()
         group_manager_mock.getAllGroupsUserBelongs.assert_called_once()
@@ -488,6 +489,6 @@ class ExceptionHandlingTest(TestCase):
         # Deliberately not authenticating user for request
         group_create = views.GroupViewSet.as_view({'post': 'create'})
         response = group_create(request)
-        self.assertEquals(403, response.status_code)
+        self.assertEqual(403, response.status_code)
         self.assertIn('is_authenticated', response.data)
         self.assertFalse(response.data['is_authenticated'])
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 467374dc2..2da94023b 100644
--- a/airavata-django-portal/django_airavata/apps/api/thrift_utils.py
+++ b/airavata-django-portal/django_airavata/apps/api/thrift_utils.py
@@ -17,7 +17,7 @@ from rest_framework.serializers import (
     ListSerializer,
     Serializer,
     SerializerMetaclass,
-    ValidationError
+    ValidationError,
 )
 from thrift.Thrift import TType
 
@@ -46,7 +46,7 @@ class UTCPosixTimestampDateTimeField(DateTimeField):
 
     def to_representation(self, obj):
         # Create datetime instance from milliseconds that is aware of timezon
-        dt = datetime.datetime.fromtimestamp(obj / 1000, datetime.timezone.utc)
+        dt = datetime.datetime.fromtimestamp(obj / 1000, datetime.UTC)
         return super().to_representation(dt)
 
     def to_internal_value(self, data):
@@ -76,8 +76,7 @@ class ThriftEnumField(Field):
             return None
         if data not in self.enumClass.__members__:
             raise ValidationError(
-                "Not an allowed name of enum {}".format(
-                    self.enumClass.__name__))
+                f"Not an allowed name of enum {self.enumClass.__name__}")
         return self.enumClass[data]
 
 
diff --git a/airavata-django-portal/django_airavata/apps/api/urls.py 
b/airavata-django-portal/django_airavata/apps/api/urls.py
index 474ebca1c..f27a851c9 100644
--- a/airavata-django-portal/django_airavata/apps/api/urls.py
+++ b/airavata-django-portal/django_airavata/apps/api/urls.py
@@ -116,4 +116,4 @@ urlpatterns = router.urls + 
format_suffix_patterns(urlpatterns)
 
 if logger.isEnabledFor(logging.DEBUG):
     for router_url in router.urls:
-        logger.debug("router url: {}".format(router_url))
+        logger.debug(f"router url: {router_url}")
diff --git a/airavata-django-portal/django_airavata/apps/api/view_utils.py 
b/airavata-django-portal/django_airavata/apps/api/view_utils.py
index 35f6ede37..da164888a 100644
--- a/airavata-django-portal/django_airavata/apps/api/view_utils.py
+++ b/airavata-django-portal/django_airavata/apps/api/view_utils.py
@@ -3,9 +3,9 @@ import os
 from collections.__init__ import OrderedDict
 from datetime import datetime
 from pathlib import Path
+from typing import TYPE_CHECKING
 
 import pytz
-from airavata_django_portal_sdk import user_storage
 from django.conf import settings
 from django.http import Http404
 from django.http.request import QueryDict
@@ -14,7 +14,8 @@ from rest_framework.response import Response
 from rest_framework.reverse import reverse
 from rest_framework.utils.urls import remove_query_param, replace_query_param
 from rest_framework.viewsets import GenericViewSet
-from typing import TYPE_CHECKING
+
+from airavata_django_portal_sdk import user_storage
 
 if TYPE_CHECKING:
     from django_airavata.stubs import AiravataHttpRequest
@@ -105,7 +106,7 @@ class APIBackedViewSet(mixins.CreateModelMixin,
     pass
 
 
-class APIResultIterator(object):
+class APIResultIterator:
     """
     Iterable container over API results which allow limit/offset style slicing.
     """
@@ -121,8 +122,7 @@ class APIResultIterator(object):
 
     def __iter__(self):
         results = self.get_results(self.limit, self.offset)
-        for result in results:
-            yield result
+        yield from results
 
     def __getitem__(self, key):
         if isinstance(key, slice):
@@ -143,7 +143,7 @@ class APIResultPagination(pagination.LimitOffsetPagination):
 
     def paginate_queryset(self, queryset, request: 'AiravataHttpRequest', 
view=None):
         assert isinstance(
-            queryset, APIResultIterator), "queryset is not an 
APIResultIterator: {}".format(queryset)
+            queryset, APIResultIterator), f"queryset is not an 
APIResultIterator: {queryset}"
         self.query_params = queryset.query_params.copy()
         self.limit = self.get_limit(request)
         if self.limit is None or not isinstance(self.limit, int):
@@ -213,8 +213,7 @@ def convert_utc_iso8601_to_date(iso8601_utc_string):
     timestamp = datetime.strptime(
         iso8601_utc_string, "%Y-%m-%dT%H:%M:%S.%fZ")
     timestamp = timestamp.replace(tzinfo=pytz.UTC)
-    logger.debug("convert_utc_iso8601_to_date({})={}".format(
-        iso8601_utc_string, timestamp))
+    
logger.debug(f"convert_utc_iso8601_to_date({iso8601_utc_string})={timestamp}")
     return timestamp
 
 
diff --git a/airavata-django-portal/django_airavata/apps/api/views.py 
b/airavata-django-portal/django_airavata/apps/api/views.py
index 869b4d5c1..75ebfd431 100644
--- a/airavata-django-portal/django_airavata/apps/api/views.py
+++ b/airavata-django-portal/django_airavata/apps/api/views.py
@@ -4,13 +4,14 @@ import logging
 import os
 import warnings
 from datetime import datetime, timedelta
+from typing import TYPE_CHECKING
 
 from airavata.model.appcatalog.computeresource.ttypes import (
     CloudJobSubmission,
     GlobusJobSubmission,
     LOCALSubmission,
     SSHJobSubmission,
-    UnicoreJobSubmission
+    UnicoreJobSubmission,
 )
 from airavata.model.application.io.ttypes import DataType
 from airavata.model.credential.store.ttypes import SummaryType
@@ -18,19 +19,11 @@ from airavata.model.data.movement.ttypes import (
     GridFTPDataMovement,
     LOCALDataMovement,
     SCPDataMovement,
-    UnicoreDataMovement
-)
-from airavata.model.experiment.ttypes import (
-    ExperimentModel,
-    ExperimentSearchFields
+    UnicoreDataMovement,
 )
+from airavata.model.experiment.ttypes import ExperimentModel, 
ExperimentSearchFields
 from airavata.model.group.ttypes import ResourcePermissionType
 from airavata.model.user.ttypes import Status
-from airavata_django_portal_sdk import (
-    experiment_util,
-    queue_settings_calculators,
-    user_storage
-)
 from django.conf import settings
 from django.contrib.auth import get_user_model
 from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
@@ -46,6 +39,7 @@ from rest_framework.renderers import JSONRenderer
 from rest_framework.response import Response
 from rest_framework.views import APIView
 
+from airavata_django_portal_sdk import experiment_util, 
queue_settings_calculators, user_storage
 from django_airavata.apps.admin.models import UserDataArchiveEntry
 from django_airavata.apps.api.view_utils import (
     APIBackedViewSet,
@@ -54,22 +48,15 @@ from django_airavata.apps.api.view_utils import (
     DataProductSharedDirPermission,
     GenericAPIBackedViewSet,
     IsInAdminsGroupPermission,
-    UserStorageSharedDirPermission
+    UserStorageSharedDirPermission,
 )
 from django_airavata.apps.auth import iam_admin_client
 from django_airavata.apps.auth.models import EmailVerification
 
-from . import (
-    exceptions,
-    helpers,
-    models,
-    output_views,
-    serializers,
-    signals,
-    thrift_utils,
-    tus,
-    view_utils
-)
+from . import exceptions, helpers, models, output_views, serializers, signals, 
thrift_utils, tus, view_utils
+
+if TYPE_CHECKING:
+    from django_airavata.stubs import AiravataHttpRequest
 
 READ_PERMISSION_TYPE = '{}:READ'
 
@@ -81,6 +68,7 @@ class GroupViewSet(APIBackedViewSet):
     lookup_field = 'group_id'
     pagination_class = APIResultPagination
     pagination_viewname = 'django_airavata_api:group-list'
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         view = self
@@ -146,6 +134,7 @@ class ProjectViewSet(APIBackedViewSet):
     lookup_field = 'project_id'
     pagination_class = APIResultPagination
     pagination_viewname = 'django_airavata_api:project-list'
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         view = self
@@ -204,6 +193,7 @@ class ExperimentViewSet(mixins.CreateModelMixin,
                         GenericAPIBackedViewSet):
     serializer_class = serializers.ExperimentSerializer
     lookup_field = 'experiment_id'
+    request: 'AiravataHttpRequest'
 
     def get_instance(self, lookup_value):
         return self.request.airavata_client.getExperiment(
@@ -275,7 +265,7 @@ class ExperimentViewSet(mixins.CreateModelMixin,
             raise e
 
     @action(methods=['post'], detail=True)
-    def fetch_intermediate_outputs(self, request, experiment_id=None):
+    def fetch_intermediate_outputs(self, request, experiment_id):
         if "outputNames" not in request.data:
             return Response(status=status.HTTP_400_BAD_REQUEST)
         try:
@@ -300,10 +290,11 @@ class ExperimentSearchViewSet(mixins.ListModelMixin, 
GenericAPIBackedViewSet):
     serializer_class = serializers.ExperimentSummarySerializer
     pagination_class = APIResultPagination
     pagination_viewname = 'django_airavata_api:experiment-search-list'
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         view = self
-        
+
         filters = {
             ExperimentSearchFields[name].value: val
             for name, val in self.request.query_params.items()
@@ -327,6 +318,7 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
                             GenericAPIBackedViewSet):
     serializer_class = serializers.FullExperimentSerializer
     lookup_field = 'experiment_id'
+    request: 'AiravataHttpRequest'
 
     def get_instance(self, lookup_value):
         """Get FullExperiment instance with resolved references."""
@@ -396,8 +388,7 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
                 self.authz_token, compute_resource_id) \
                 if compute_resource_id else None
         except Exception:
-            log.exception("Failed to load compute resource for {}".format(
-                compute_resource_id), extra={'request': self.request})
+            log.exception(f"Failed to load compute resource for 
{compute_resource_id}", extra={'request': self.request})
             compute_resource = None
         if self.request.airavata_client.userHasAccess(
                 self.authz_token,
@@ -425,6 +416,7 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
 class ApplicationModuleViewSet(APIBackedViewSet):
     serializer_class = serializers.ApplicationModuleSerializer
     lookup_field = 'app_module_id'
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         return self.request.airavata_client.getAccessibleAppModules(
@@ -465,15 +457,15 @@ class ApplicationModuleViewSet(APIBackedViewSet):
             return Response(serializer.data)
         elif len(app_interfaces) > 1:
             log.error(
-                "More than one application interface found for module {}: {}"
-                .format(app_module_id, app_interfaces), extra={'request': 
request})
+                f"More than one application interface found for module 
{app_module_id}: {app_interfaces}"
+                , extra={'request': request})
             raise Exception(
-                'More than one application interface found for module {}'
-                .format(app_module_id)
+                f'More than one application interface found for module 
{app_module_id}'
+
             )
         else:
-            raise Http404("No application interface found for module id {}"
-                          .format(app_module_id))
+            raise Http404(f"No application interface found for module id 
{app_module_id}"
+                          )
 
     @action(detail=True)
     def application_deployments(self, request, app_module_id):
@@ -533,6 +525,7 @@ class ApplicationModuleViewSet(APIBackedViewSet):
 class ApplicationInterfaceViewSet(APIBackedViewSet):
     serializer_class = serializers.ApplicationInterfaceDescriptionSerializer
     lookup_field = 'app_interface_id'
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         return self.request.airavata_client.getAllApplicationInterfaces(
@@ -555,7 +548,7 @@ class ApplicationInterfaceViewSet(APIBackedViewSet):
     def perform_create(self, serializer):
         application_interface = serializer.save()
         self._update_input_metadata(application_interface)
-        log.debug("application_interface: {}".format(application_interface))
+        log.debug(f"application_interface: {application_interface}")
         app_interface_id = 
self.request.airavata_client.registerApplicationInterface(
             self.authz_token, self.gateway_id, application_interface)
         application_interface.applicationInterfaceId = app_interface_id
@@ -597,6 +590,7 @@ class ApplicationInterfaceViewSet(APIBackedViewSet):
 class ApplicationDeploymentViewSet(APIBackedViewSet):
     serializer_class = serializers.ApplicationDeploymentDescriptionSerializer
     lookup_field = 'app_deployment_id'
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         app_module_id = self.request.query_params.get('appModuleId', None)
@@ -660,6 +654,7 @@ class ComputeResourceViewSet(mixins.RetrieveModelMixin,
                              GenericAPIBackedViewSet):
     serializer_class = serializers.ComputeResourceDescriptionSerializer
     lookup_field = 'compute_resource_id'
+    request: 'AiravataHttpRequest'
 
     def get_instance(self, lookup_value, format=None):
         return self.request.airavata_client.getComputeResource(
@@ -693,7 +688,7 @@ class ComputeResourceViewSet(mixins.RetrieveModelMixin,
             request.authz_token, compute_resource_id)
         serializer = self.serializer_class(instance=details,
                                            context={'request': request})
-        data = serializer.data
+        data = dict(serializer.data)
         return Response([queue["queueName"] for queue in data["batchQueues"]])
 
 
@@ -896,8 +891,8 @@ def delete_file(request):
         data_product = request.airavata_client.getDataProduct(
             request.authz_token, data_product_uri)
     except Exception as e:
-        log.warning("Failed to load DataProduct for {}"
-                    .format(data_product_uri), exc_info=True)
+        log.warning(f"Failed to load DataProduct for {data_product_uri}"
+                    , exc_info=True)
         raise Http404("data product does not exist") from e
     try:
         if (data_product.gatewayId != settings.GATEWAY_ID or
@@ -913,6 +908,7 @@ class UserProfileViewSet(mixins.RetrieveModelMixin,
                          mixins.ListModelMixin,
                          GenericAPIBackedViewSet):
     serializer_class = serializers.UserProfileSerializer
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         user_profile_client = self.request.profile_service['user_profile']
@@ -928,6 +924,7 @@ class UserProfileViewSet(mixins.RetrieveModelMixin,
 class GroupResourceProfileViewSet(APIBackedViewSet):
     serializer_class = serializers.GroupResourceProfileSerializer
     lookup_field = 'group_resource_profile_id'
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         return self.request.airavata_client.getGroupResourceList(
@@ -979,6 +976,7 @@ class SharedEntityViewSet(mixins.RetrieveModelMixin,
                           GenericAPIBackedViewSet):
     serializer_class = serializers.SharedEntitySerializer
     lookup_field = 'entity_id'
+    request: 'AiravataHttpRequest'
 
     def get_instance(self, lookup_value):
         users = {}
@@ -1194,6 +1192,7 @@ class SharedEntityViewSet(mixins.RetrieveModelMixin,
 
 class CredentialSummaryViewSet(APIBackedViewSet):
     serializer_class = serializers.CredentialSummarySerializer
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         ssh_creds = self.request.airavata_client.getAllCredentialSummaries(
@@ -1307,6 +1306,7 @@ class StorageResourceViewSet(mixins.RetrieveModelMixin,
                              GenericAPIBackedViewSet):
     serializer_class = serializers.StorageResourceSerializer
     lookup_field = 'storage_resource_id'
+    request: 'AiravataHttpRequest'
 
     def get_instance(self, lookup_value, format=None):
         return self.request.airavata_client.getStorageResource(
@@ -1323,6 +1323,7 @@ class StorageResourceViewSet(mixins.RetrieveModelMixin,
 class StoragePreferenceViewSet(APIBackedViewSet):
     serializer_class = serializers.StoragePreferenceSerializer
     lookup_field = 'storage_resource_id'
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         return self.request.airavata_client.getAllGatewayStoragePreferences(
@@ -1360,6 +1361,7 @@ class ParserViewSet(mixins.CreateModelMixin,
                     GenericAPIBackedViewSet):
     serializer_class = serializers.ParserSerializer
     lookup_field = 'parser_id'
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         return self.request.airavata_client.listAllParsers(
@@ -1382,13 +1384,13 @@ class UserStoragePathView(APIView):
     serializer_class = serializers.UserStoragePathSerializer
     permission_classes = (IsAuthenticated, UserStorageSharedDirPermission)
 
-    def get(self, request, path="/", format=None):
+    def get(self, request: 'AiravataHttpRequest', path="/", format=None):
         # AIRAVATA-3460 Allow passing path as a query parameter instead
         path = request.query_params.get('path', path)
         experiment_id = request.query_params.get('experiment-id')
         return self._create_response(request, path, 
experiment_id=experiment_id)
 
-    def post(self, request, path="/", format=None):
+    def post(self, request: 'AiravataHttpRequest', path="/", format=None):
         path = request.data.get('path', path)
         experiment_id = request.data.get('experiment-id')
         if not user_storage.dir_exists(request, path, 
experiment_id=experiment_id):
@@ -1418,7 +1420,7 @@ class UserStoragePathView(APIView):
         return self._create_response(request, path, uploaded=data_product, 
experiment_id=experiment_id)
 
     # Accept wither to replace file or to replace file content text.
-    def put(self, request, path="/", format=None):
+    def put(self, request: 'AiravataHttpRequest', path="/", format=None):
         path = request.POST.get('path', path)
         # Replace the file if the request has a file upload.
         if 'file' in request.FILES:
@@ -1436,7 +1438,7 @@ class UserStoragePathView(APIView):
 
         return self._create_response(request=request, path=path)
 
-    def delete(self, request, path="/", format=None):
+    def delete(self, request: 'AiravataHttpRequest', path="/", format=None):
         path = request.data.get('path', path)
         experiment_id = request.data.get('experiment-id')
         if user_storage.dir_exists(request, path, experiment_id=experiment_id):
@@ -1446,7 +1448,7 @@ class UserStoragePathView(APIView):
 
         return Response(status=204)
 
-    def _create_response(self, request, path, uploaded=None, 
experiment_id=None):
+    def _create_response(self, request: 'AiravataHttpRequest', path, 
uploaded=None, experiment_id=None):
         if user_storage.dir_exists(request, path, experiment_id=experiment_id):
             directories, files = user_storage.listdir(request, path, 
experiment_id=experiment_id)
             data = {
@@ -1475,7 +1477,7 @@ class UserStoragePathView(APIView):
                 data, context={'request': request})
             return Response(serializer.data)
 
-    def _split_path(self, path):
+    def _split_path(self, path: str):
         head, tail = os.path.split(path)
         if head != path:
             return self._split_path(head) + [tail]
@@ -1489,10 +1491,10 @@ class ExperimentStoragePathView(APIView):
 
     serializer_class = serializers.ExperimentStoragePathSerializer
 
-    def get(self, request, experiment_id=None, path="", format=None):
+    def get(self, request: 'AiravataHttpRequest', experiment_id=None, path="", 
format=None):
         return self._create_response(request, experiment_id, path)
 
-    def _create_response(self, request, experiment_id, path):
+    def _create_response(self, request: 'AiravataHttpRequest', experiment_id, 
path):
         if user_storage.experiment_dir_exists(request, experiment_id, path):
             directories, files = user_storage.list_experiment_dir(request, 
experiment_id, path)
 
@@ -1511,7 +1513,7 @@ class ExperimentStoragePathView(APIView):
         else:
             raise Http404(f"Path '{path}' does not exist for {experiment_id}")
 
-    def _split_path(self, path):
+    def _split_path(self, path: str):
         head, tail = os.path.split(path)
         if head != "":
             return self._split_path(head) + [tail]
@@ -1523,8 +1525,9 @@ class ExperimentStoragePathView(APIView):
 
 class WorkspacePreferencesView(APIView):
     serializer_class = serializers.WorkspacePreferencesSerializer
+    request: 'AiravataHttpRequest'
 
-    def get(self, request, format=None):
+    def get(self, request: 'AiravataHttpRequest', format=None):
         helper = helpers.WorkspacePreferencesHelper()
         workspace_preferences = helper.get(request)
         serializer = self.serializer_class(
@@ -1535,6 +1538,7 @@ class WorkspacePreferencesView(APIView):
 class ManageNotificationViewSet(APIBackedViewSet):
     serializer_class = serializers.NotificationSerializer
     lookup_field = 'notification_id'
+    request: 'AiravataHttpRequest'
 
     def get_instance(self, lookup_value):
         return self.request.airavata_client.getNotification(
@@ -1591,6 +1595,7 @@ class IAMUserViewSet(mixins.RetrieveModelMixin,
     pagination_class = APIResultPagination
     permission_classes = (IsAuthenticated, IsInAdminsGroupPermission,)
     lookup_field = 'user_id'
+    request: 'AiravataHttpRequest'
 
     def get_list(self):
         search = self.request.GET.get('search', None)
@@ -1693,7 +1698,7 @@ class ExperimentStatisticsView(APIView):
     # TODO: restrict to only Admins or Read Only Admins group members
     serializer_class = serializers.ExperimentStatisticsSerializer
 
-    def get(self, request, format=None):
+    def get(self, request: 'AiravataHttpRequest', format=None):
         if 'fromTime' in request.GET:
             from_time = view_utils.convert_utc_iso8601_to_date(
                 request.GET['fromTime']).timestamp() * 1000
@@ -1750,8 +1755,8 @@ class UnverifiedEmailUserViewSet(mixins.ListModelMixin,
         users = self._get_unverified_email_user_profiles(
             limit=1, username=lookup_value)
         if len(users) == 0:
-            raise Http404("No unverified email record found for user {}"
-                          .format(lookup_value))
+            raise Http404(f"No unverified email record found for user 
{lookup_value}"
+                          )
         else:
             return users[0]
 
@@ -1840,7 +1845,7 @@ class APIServerStatusCheckView(APIView):
                 "apiServerUp": True
             }
         except Exception as e:
-            log.debug("API server status check failed: {}".format(str(e)))
+            log.debug(f"API server status check failed: {str(e)}")
             data = {
                 "apiServerUp": False
             }
diff --git a/airavata-django-portal/django_airavata/apps/auth/backends.py 
b/airavata-django-portal/django_airavata/apps/auth/backends.py
index bd8292a05..c624d578a 100644
--- a/airavata-django-portal/django_airavata/apps/auth/backends.py
+++ b/airavata-django-portal/django_airavata/apps/auth/backends.py
@@ -2,8 +2,10 @@
 import logging
 import os
 import time
+from typing import TYPE_CHECKING
 
 import requests
+import requests.auth
 from django.conf import settings
 from django.contrib.auth.models import User
 from django.views.decorators.debug import sensitive_variables
@@ -16,8 +18,11 @@ from . import models, utils
 
 logger = logging.getLogger(__name__)
 
+if TYPE_CHECKING:
+    from django_airavata.stubs import AiravataHttpRequest
 
-class KeycloakBackend(object):
+
+class KeycloakBackend:
     """Django authentication backend for Keycloak."""
 
     # mask all local variables from error emails since they contain the user's
@@ -26,7 +31,7 @@ class KeycloakBackend(object):
     # listed variable masking to library function calls
     @sensitive_variables()
     def authenticate(self,
-                     request=None,
+                     request: AiravataHttpRequest,
                      username=None,
                      password=None,
                      refresh_token=None,
@@ -43,7 +48,7 @@ class KeycloakBackend(object):
                 user = self._process_userinfo(request, userinfo)
                 access_token = token['access_token']
             elif 'HTTP_AUTHORIZATION' in request.META:
-                bearer, token = request.META.get('HTTP_AUTHORIZATION').split()
+                bearer, token = request.META.get('HTTP_AUTHORIZATION', 
'').split()
                 if bearer != "Bearer":
                     raise Exception("Unexpected Authorization header")
                 # implicitly validate token by using it to get userinfo
@@ -132,7 +137,7 @@ class KeycloakBackend(object):
         verify_ssl = settings.KEYCLOAK_VERIFY_SSL
         state = request.session['OAUTH2_STATE']
         redirect_uri = request.session['OAUTH2_REDIRECT_URI']
-        logger.debug("state={}".format(state))
+        logger.debug(f"state={state}")
         oauth2_session = OAuth2Session(client_id,
                                        scope='openid profile email',
                                        redirect_uri=redirect_uri,
@@ -153,7 +158,7 @@ class KeycloakBackend(object):
         return token, userinfo
 
     def _get_token_and_userinfo_from_refresh_token(self,
-                                                   request,
+                                                   request: 
'AiravataHttpRequest',
                                                    refresh_token=None):
         client_id = settings.KEYCLOAK_CLIENT_ID
         client_secret = settings.KEYCLOAK_CLIENT_SECRET
@@ -203,7 +208,7 @@ class KeycloakBackend(object):
 
     def _process_token(self, request, token):
         # TODO validate the JWS signature
-        logger.debug("token: {}".format(token))
+        logger.debug(f"token: {token}")
         now = time.time()
         # Put access_token into session to be used for authenticating with API
         # server
@@ -214,7 +219,7 @@ class KeycloakBackend(object):
         sess['REFRESH_TOKEN_EXPIRES_AT'] = now + token['refresh_expires_in']
 
     def _process_userinfo(self, request, userinfo):
-        logger.debug("userinfo: {}".format(userinfo))
+        logger.debug(f"userinfo: {userinfo}")
         sub = userinfo['sub']
         username = userinfo['preferred_username']
         email = userinfo.get('email', '')
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0001_initial.py 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0001_initial.py
index 8745b6f94..f35715b46 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0001_initial.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0001_initial.py
@@ -1,10 +1,9 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.16 on 2018-10-25 15:32
-from __future__ import unicode_literals
 
-from django.db import migrations, models
 import uuid
 
+from django.db import migrations, models
+
 
 class Migration(migrations.Migration):
 
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0002_emailtemplate.py
 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0002_emailtemplate.py
index b9006b364..2463ab3b7 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0002_emailtemplate.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0002_emailtemplate.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.16 on 2018-10-29 18:23
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0003_default_email_templates.py
 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0003_default_email_templates.py
index c21caccae..3dd08109b 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0003_default_email_templates.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0003_default_email_templates.py
@@ -1,13 +1,8 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.16 on 2018-10-29 18:33
-from __future__ import unicode_literals
 
 from django.db import migrations
 
-from django_airavata.apps.auth.models import (
-    NEW_USER_EMAIL_TEMPLATE,
-    VERIFY_EMAIL_TEMPLATE
-)
+from django_airavata.apps.auth.models import NEW_USER_EMAIL_TEMPLATE, 
VERIFY_EMAIL_TEMPLATE
 
 
 def default_templates(apps, schema_editor):
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0004_password_reset_request.py
 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0004_password_reset_request.py
index e8fed01ea..8234dab7a 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0004_password_reset_request.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0004_password_reset_request.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.20 on 2019-05-07 15:49
-from __future__ import unicode_literals
 
 import uuid
 
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0005_auto_20191211_2011.py
 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0005_auto_20191211_2011.py
index eeb4b990b..f7d30e3c9 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0005_auto_20191211_2011.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0005_auto_20191211_2011.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2019-12-11 20:11
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0006_emailverification_next.py
 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0006_emailverification_next.py
index b68cd5c06..832d1a296 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0006_emailverification_next.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0006_emailverification_next.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.28 on 2020-02-26 21:13
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0007_auto_20200917_1610.py
 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0007_auto_20200917_1610.py
index 4938ebf1c..b53166f5a 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0007_auto_20200917_1610.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0007_auto_20200917_1610.py
@@ -1,10 +1,8 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.29 on 2020-09-17 16:10
-from __future__ import unicode_literals
 
+import django.db.models.deletion
 from django.conf import settings
 from django.db import migrations, models
-import django.db.models.deletion
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0009_auto_20210625_1725.py
 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0009_auto_20210625_1725.py
index 1d381999c..40db40041 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0009_auto_20210625_1725.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0009_auto_20210625_1725.py
@@ -1,8 +1,8 @@
 # Generated by Django 2.2.23 on 2021-06-25 17:25
 
-from django.db import migrations, models
 import django.db.models.deletion
 import django.utils.timezone
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0014_extendeduserprofileagreementfield_extendeduserprofilefield_extendeduserprofilefieldlink_extendeduser.py
 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0014_extendeduserprofileagreementfield_extendeduserprofilefield_extendeduserprofilefieldlink_extendeduser.py
index 2b5601cb2..4874a09b2 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0014_extendeduserprofileagreementfield_extendeduserprofilefield_extendeduserprofilefieldlink_extendeduser.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0014_extendeduserprofileagreementfield_extendeduserprofilefield_extendeduserprofilefieldlink_extendeduser.py
@@ -1,7 +1,7 @@
 # Generated by Django 3.2.11 on 2022-03-11 14:25
 
-from django.db import migrations, models
 import django.db.models.deletion
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0015_auto_20220329_1708.py
 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0015_auto_20220329_1708.py
index 49da5c183..d9d194006 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0015_auto_20220329_1708.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0015_auto_20220329_1708.py
@@ -1,7 +1,7 @@
 # Generated by Django 3.2.11 on 2022-03-29 17:08
 
-from django.db import migrations, models
 import django.db.models.deletion
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0019_auto_20221118_1323.py
 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0019_auto_20221118_1323.py
index e98657a03..bd71423cf 100644
--- 
a/airavata-django-portal/django_airavata/apps/auth/migrations/0019_auto_20221118_1323.py
+++ 
b/airavata-django-portal/django_airavata/apps/auth/migrations/0019_auto_20221118_1323.py
@@ -1,7 +1,7 @@
 # Generated by Django 3.2.15 on 2022-11-18 13:23
 
-from django.db import migrations, models
 import django.db.models.deletion
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git a/airavata-django-portal/django_airavata/apps/auth/models.py 
b/airavata-django-portal/django_airavata/apps/auth/models.py
index 6cc658ea9..dcdd6f3bf 100644
--- a/airavata-django-portal/django_airavata/apps/auth/models.py
+++ b/airavata-django-portal/django_airavata/apps/auth/models.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
 import uuid
 
 from django.conf import settings
@@ -17,7 +19,7 @@ USER_PROFILE_COMPLETED_TEMPLATE = 6
 class EmailVerification(models.Model):
     username = models.CharField(max_length=64)
     verification_code = models.CharField(
-        max_length=36, unique=True, default=uuid.uuid4)
+        max_length=36, unique=True, default=str(uuid.uuid4()))
     created_date = models.DateTimeField(auto_now_add=True)
     verified = models.BooleanField(default=False)
     next = models.CharField(max_length=255, null=True)
@@ -49,7 +51,7 @@ class EmailTemplate(models.Model):
 class PasswordResetRequest(models.Model):
     username = models.CharField(max_length=64)
     reset_code = models.CharField(
-        max_length=36, unique=True, default=uuid.uuid4)
+        max_length=36, unique=True, default=str(uuid.uuid4()))
     created_date = models.DateTimeField(auto_now_add=True)
 
 
@@ -161,7 +163,7 @@ class PendingEmailChange(models.Model):
     user = models.ForeignKey(settings.AUTH_USER_MODEL, 
on_delete=models.CASCADE)
     email_address = models.EmailField()
     verification_code = models.CharField(
-        max_length=36, unique=True, default=uuid.uuid4)
+        max_length=36, unique=True, default=str(uuid.uuid4()))
     created_date = models.DateTimeField(auto_now_add=True)
     verified = models.BooleanField(default=False)
 
@@ -267,6 +269,7 @@ class ExtendedUserProfileValue(models.Model):
     created_date = models.DateTimeField(auto_now_add=True)
     updated_date = models.DateTimeField(auto_now=True)
 
+
     @property
     def value_type(self):
         if hasattr(self, 'text'):
diff --git a/airavata-django-portal/django_airavata/apps/auth/serializers.py 
b/airavata-django-portal/django_airavata/apps/auth/serializers.py
index 4b35c111f..e17452654 100644
--- a/airavata-django-portal/django_airavata/apps/auth/serializers.py
+++ b/airavata-django-portal/django_airavata/apps/auth/serializers.py
@@ -92,7 +92,7 @@ class UserSerializer(serializers.ModelSerializer):
             
request.build_absolute_uri(reverse('django_airavata_auth:user_profile')) +
             '?' + urlencode({"code": pending_email_change.verification_code}))
         logger.debug(
-            "verification_uri={}".format(verification_uri))
+            f"verification_uri={verification_uri}")
 
         context = Context({
             "username": pending_email_change.user.username,
@@ -160,13 +160,15 @@ class 
ExtendedUserProfileFieldSerializer(serializers.ModelSerializer):
             # add choices
             for choice in choices:
                 choice.pop('id', None)
-                instance.choices.create(**choice)
+                
models.ExtendedUserProfileSingleChoiceFieldChoice.objects.create(
+                    single_choice_field=instance, **choice)
         elif field_type == 'multi_choice':
             instance = 
models.ExtendedUserProfileMultiChoiceField.objects.create(**validated_data, 
other=other)
             # add choices
             for choice in choices:
                 choice.pop('id', None)
-                instance.choices.create(**choice)
+                
models.ExtendedUserProfileMultiChoiceFieldChoice.objects.create(
+                    multi_choice_field=instance, **choice)
         elif field_type == 'user_agreement':
             instance = 
models.ExtendedUserProfileAgreementField.objects.create(**validated_data, 
checkbox_label=checkbox_label)
         else:
@@ -174,7 +176,7 @@ class 
ExtendedUserProfileFieldSerializer(serializers.ModelSerializer):
         # create links
         for link in links:
             link.pop('id', None)
-            instance.links.create(**link)
+            models.ExtendedUserProfileFieldLink.objects.create(field=instance, 
**link)
         return instance
 
     def update(self, instance, validated_data):
diff --git a/airavata-django-portal/django_airavata/apps/auth/signals.py 
b/airavata-django-portal/django_airavata/apps/auth/signals.py
index 466e20bff..fd10cb8a4 100644
--- a/airavata-django-portal/django_airavata/apps/auth/signals.py
+++ b/airavata-django-portal/django_airavata/apps/auth/signals.py
@@ -3,8 +3,8 @@ import logging
 from django.conf import settings
 from django.contrib.auth.signals import user_logged_in
 from django.dispatch import receiver
-from django.shortcuts import reverse
 from django.template import Context
+from django.urls import reverse
 
 from django_airavata.apps.api.signals import user_added_to_group
 from django_airavata.utils import user_profile_client_pool
@@ -44,11 +44,11 @@ def initialize_user_profile(sender, request, user, 
**kwargs):
                                                       settings.GATEWAY_ID):
             if user.user_profile.is_complete:
                 
user_profile_client_pool.initializeUserProfile(request.authz_token)
-                log.info("initialized user profile for 
{}".format(user.username))
+                log.info(f"initialized user profile for {user.username}")
                 # Since user profile created, inform admins of new user
                 utils.send_new_user_email(
                     request, user.username, user.email, user.first_name, 
user.last_name)
-                log.info("sent new user email for user 
{}".format(user.username))
+                log.info(f"sent new user email for user {user.username}")
             else:
                 log.info(f"user profile not complete for {user.username}, "
                          "skipping initializing Airavata user profile")
diff --git 
a/airavata-django-portal/django_airavata/apps/auth/tests/test_middleware.py 
b/airavata-django-portal/django_airavata/apps/auth/tests/test_middleware.py
index 81091afbf..b7ec96ff6 100644
--- a/airavata-django-portal/django_airavata/apps/auth/tests/test_middleware.py
+++ b/airavata-django-portal/django_airavata/apps/auth/tests/test_middleware.py
@@ -8,9 +8,7 @@ from django.test import RequestFactory, TestCase
 from django.urls import reverse
 
 from django_airavata.apps.auth import models
-from django_airavata.apps.auth.middleware import (
-    user_profile_completeness_check
-)
+from django_airavata.apps.auth.middleware import 
user_profile_completeness_check
 
 
 class UserProfileCompletenessCheckTestCase(TestCase):
diff --git a/airavata-django-portal/django_airavata/apps/auth/utils.py 
b/airavata-django-portal/django_airavata/apps/auth/utils.py
index cfa53c042..313fb4f4c 100644
--- a/airavata-django-portal/django_airavata/apps/auth/utils.py
+++ b/airavata-django-portal/django_airavata/apps/auth/utils.py
@@ -48,6 +48,8 @@ def get_service_account_authz_token():
         verify=verify)
 
     access_token = token.get('access_token')
+    if access_token is None:
+        raise ValueError("No access token found")
     return AuthzToken(
         accessToken=access_token,
         # This is a service account, so leaving out userName for now
@@ -61,6 +63,8 @@ def _create_authz_token(request, user=None, 
access_token=None):
         user = request.user
     username = user.username
     gateway_id = settings.GATEWAY_ID
+    if access_token is None:
+        raise ValueError("No access token found")
     return AuthzToken(accessToken=access_token,
                       claimsMap={'gatewayID': gateway_id,
                                  'userName': username})
@@ -211,8 +215,7 @@ def send_email_to_user(template_id, context):
     msg = EmailMessage(
         subject=subject,
         body=body,
-        from_email="\"{}\" <{}>".format(settings.PORTAL_TITLE,
-                                        settings.SERVER_EMAIL),
+        from_email=f"\"{settings.PORTAL_TITLE}\" <{settings.SERVER_EMAIL}>",
         to=["\"{} {}\" <{}>".format(context['first_name'],
                                     context['last_name'],
                                     context['email'])],
diff --git a/airavata-django-portal/django_airavata/apps/auth/views.py 
b/airavata-django-portal/django_airavata/apps/auth/views.py
index a05b2480e..1742cc091 100644
--- a/airavata-django-portal/django_airavata/apps/auth/views.py
+++ b/airavata-django-portal/django_airavata/apps/auth/views.py
@@ -1,7 +1,7 @@
 import io
 import logging
 import time
-from datetime import datetime, timedelta, timezone
+from datetime import UTC, datetime, timedelta
 from urllib.parse import quote, urlencode, urlparse
 
 import requests
@@ -12,13 +12,8 @@ from django.contrib.auth.decorators import login_required
 from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
 from django.db.transaction import atomic
 from django.forms import ValidationError
-from django.http import (
-    FileResponse,
-    HttpResponseBadRequest,
-    HttpResponseForbidden,
-    JsonResponse
-)
-from django.shortcuts import redirect, render, resolve_url
+from django.http import FileResponse, HttpResponseBadRequest, 
HttpResponseForbidden, JsonResponse
+from django.shortcuts import redirect, render
 from django.template import Context
 from django.template.loader import render_to_string
 from django.urls import reverse
@@ -28,11 +23,9 @@ from rest_framework import mixins, permissions, viewsets
 from rest_framework.decorators import action
 from rest_framework.response import Response
 
-from django_airavata.apps.api.view_utils import (
-    IsInAdminsGroupPermission,
-    ReadOnly
-)
+from django_airavata.apps.api.view_utils import IsInAdminsGroupPermission, 
ReadOnly
 from django_airavata.apps.auth import serializers
+from django_airavata.stubs import AiravataHttpRequest
 
 from . import forms, iam_admin_client, models, utils
 
@@ -111,7 +104,7 @@ def handle_login(request):
     if login_type and login_type == 'password':
         template = "django_airavata_auth/login_username_password.html"
     user = authenticate(username=username, password=password, request=request)
-    logger.debug("authenticated user: {}".format(user))
+    logger.debug(f"authenticated user: {user}")
     try:
         if user is not None:
             # Middleware will add authz_token attr to request, but since user
@@ -130,9 +123,9 @@ def handle_login(request):
         else:
             messages.error(request, "Login failed. Please try again.")
     except Exception as err:
-        logger.exception("Login failed for user {}".format(username), 
extra={'request': request})
+        logger.exception(f"Login failed for user {username}", 
extra={'request': request})
         messages.error(request,
-                       "Login failed: {}. Please try again.".format(str(err)))
+                       f"Login failed: {str(err)}. Please try again.")
     if login_desktop:
         return _create_login_desktop_failed_response(request)
     return render(request, template, {
@@ -166,11 +159,11 @@ def callback(request):
             raise Exception("Failed to authenticate user")
     except Exception as err:
         logger.exception("An error occurred while processing OAuth2 "
-                         "callback: {}".format(request.build_absolute_uri()),
+                         f"callback: {request.build_absolute_uri()}",
                          extra={'request': request})
         messages.error(
             request,
-            "Failed to process OAuth2 callback: {}".format(str(err)))
+            f"Failed to process OAuth2 callback: {str(err)}")
         if login_desktop:
             return _create_login_desktop_failed_response(
                 request, idp_alias=idp_alias)
@@ -224,8 +217,8 @@ def create_account(request):
                         reverse('django_airavata_auth:create_account'))
             except Exception as e:
                 logger.exception(
-                    "Failed to create account for user", exc_info=e, 
extra={'request', request})
-                form.add_error(None, ValidationError(e.message))
+                    "Failed to create account for user", exc_info=e, 
extra={'request': request})
+                form.add_error(None, ValidationError(str(e)))
     else:
         form = forms.CreateAccountForm(initial=request.GET)
     return render(request, 'django_airavata_auth/create_account.html', {
@@ -243,19 +236,19 @@ def verify_email(request, code):
         email_verification.save()
         # Check if user is enabled, if so redirect to login page
         username = email_verification.username
-        logger.debug("Email address verified for {}".format(username))
+        logger.debug(f"Email address verified for {username}")
         login_url = reverse('django_airavata_auth:login')
         if email_verification.next:
             login_url += "?" + urlencode({'next': email_verification.next})
         if iam_admin_client.is_user_enabled(username):
-            logger.debug("User {} is already enabled".format(username))
+            logger.debug(f"User {username} is already enabled")
             messages.success(
                 request,
                 "Your account has already been successfully created. "
                 "Please log in now.")
             return redirect(login_url)
         else:
-            logger.debug("Enabling user {}".format(username))
+            logger.debug(f"Enabling user {username}")
             # enable user and inform admins
             iam_admin_client.enable_user(username)
             user_profile = iam_admin_client.get_user(username)
@@ -276,7 +269,7 @@ def verify_email(request, code):
         # if doesn't exist, give user a form where they can enter their
         # username to resend verification code
         logger.exception("EmailVerification object doesn't exist for "
-                         "code {}".format(code), extra={'request': request})
+                         f"code {code}", extra={'request': request})
         messages.error(
             request,
             "Email verification failed. Please enter your username and we "
@@ -343,7 +336,7 @@ def _create_and_send_email_verification_link(
             'django_airavata_auth:verify_email', kwargs={
                 'code': email_verification.verification_code}))
     logger.debug(
-        "verification_uri={}".format(verification_uri))
+        f"verification_uri={verification_uri}")
 
     context = Context({
         "username": username,
@@ -408,7 +401,7 @@ def _create_and_send_password_reset_request_link(request, 
username):
             'django_airavata_auth:reset_password', kwargs={
                 'code': password_reset_request.reset_code}))
     logger.debug(
-        "password reset verification_uri={}".format(verification_uri))
+        f"password reset verification_uri={verification_uri}")
 
     user = iam_admin_client.get_user(username)
     context = Context({
@@ -433,7 +426,7 @@ def reset_password(request, code):
             "Reset password link is invalid. Please try again.")
         return redirect(reverse('django_airavata_auth:forgot_password'))
 
-    now = datetime.now(timezone.utc)
+    now = datetime.now(UTC)
     if now - password_reset_request.created_date > timedelta(days=1):
         password_reset_request.delete()
         messages.error(
@@ -584,6 +577,7 @@ class UserViewSet(viewsets.ModelViewSet):
     serializer_class = serializers.UserSerializer
     queryset = get_user_model().objects.all()
     permission_classes = [IsUserOrReadOnlyForAdmins]
+    request: AiravataHttpRequest
 
     def get_queryset(self):
         user = self.request.user
@@ -593,20 +587,22 @@ class UserViewSet(viewsets.ModelViewSet):
             return get_user_model().objects.filter(pk=user.pk)
 
     @action(detail=False)
-    def current(self, request):
+    def current(self, request: AiravataHttpRequest):
         return redirect(reverse('django_airavata_auth:user-detail', 
kwargs={'pk': request.user.id}))
 
     @action(methods=['post'], detail=True)
-    def resend_email_verification(self, request, pk=None):
+    def resend_email_verification(self, request: AiravataHttpRequest, pk=None):
         pending_email_change = 
models.PendingEmailChange.objects.get(user=request.user, verified=False)
         if pending_email_change is not None:
-            serializer = serializers.UserSerializer()
-            serializer._send_email_verification_link(request, 
pending_email_change)
+            # Create serializer and cast to correct type
+            serializer = serializers.UserSerializer(context={'request': 
request})
+            # Use type: ignore to bypass the type checker for this specific 
line
+            serializer._send_email_verification_link(request, 
pending_email_change)  # type: ignore
         return JsonResponse({})
 
     @action(methods=['post'], detail=True)
     @atomic
-    def verify_email_change(self, request, pk=None):
+    def verify_email_change(self, request: AiravataHttpRequest, pk=None):
         user = self.get_object()
         code = request.data['code']
 
@@ -765,6 +761,7 @@ class 
ExtendedUserProfileValueViewset(mixins.CreateModelMixin,
                                       viewsets.GenericViewSet):
     serializer_class = serializers.ExtendedUserProfileValueSerializer
     permission_classes = [IsExtendedUserProfileOwnerOrReadOnlyForAdmins]
+    request: AiravataHttpRequest
 
     def get_queryset(self):
         user = self.request.user
@@ -778,7 +775,7 @@ class 
ExtendedUserProfileValueViewset(mixins.CreateModelMixin,
 
     @action(methods=['POST'], detail=False, url_path="save-all")
     @atomic
-    def save_all(self, request, format=None):
+    def save_all(self, request: AiravataHttpRequest, format=None):
         user = request.user
         user_profile: models.UserProfile = user.user_profile
         old_valid = user_profile.is_ext_user_profile_valid
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/migrations/0001_initial.py
 
b/airavata-django-portal/django_airavata/apps/workspace/migrations/0001_initial.py
index 930fa7c87..2d86741e7 100644
--- 
a/airavata-django-portal/django_airavata/apps/workspace/migrations/0001_initial.py
+++ 
b/airavata-django-portal/django_airavata/apps/workspace/migrations/0001_initial.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.16 on 2019-04-12 16:55
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/apps/workspace/migrations/0002_delete_user_files.py
 
b/airavata-django-portal/django_airavata/apps/workspace/migrations/0002_delete_user_files.py
index 9ed44e75a..b0096f17f 100644
--- 
a/airavata-django-portal/django_airavata/apps/workspace/migrations/0002_delete_user_files.py
+++ 
b/airavata-django-portal/django_airavata/apps/workspace/migrations/0002_delete_user_files.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.20 on 2019-05-10 16:35
-from __future__ import unicode_literals
 
 from django.db import migrations
 
diff --git a/airavata-django-portal/django_airavata/apps/workspace/views.py 
b/airavata-django-portal/django_airavata/apps/workspace/views.py
index 0c85df717..5266b202f 100644
--- a/airavata-django-portal/django_airavata/apps/workspace/views.py
+++ b/airavata-django-portal/django_airavata/apps/workspace/views.py
@@ -4,18 +4,18 @@ import logging
 from urllib.parse import urlparse
 
 from airavata.model.application.io.ttypes import DataType
-from airavata_django_portal_sdk import user_storage as user_storage_sdk
 from django.contrib.auth.decorators import login_required
 from django.shortcuts import render
 from django.utils.module_loading import import_string
 from rest_framework.renderers import JSONRenderer
 
+from airavata_django_portal_sdk import user_storage as user_storage_sdk
 from django_airavata.apps.api import models
 from django_airavata.apps.api.views import (
     ApplicationModuleViewSet,
     ExperimentSearchViewSet,
     FullExperimentViewSet,
-    ProjectViewSet
+    ProjectViewSet,
 )
 
 logger = logging.getLogger(__name__)
diff --git a/airavata-django-portal/django_airavata/context_processors.py 
b/airavata-django-portal/django_airavata/context_processors.py
index 43cbfcf95..2e85b07fd 100644
--- a/airavata-django-portal/django_airavata/context_processors.py
+++ b/airavata-django-portal/django_airavata/context_processors.py
@@ -84,8 +84,7 @@ def airavata_app_registry(request):
                      app.label not in settings.HIDDEN_AIRAVATA_APPS]
     # Sort by app_order then by verbose_name (case-insensitive)
     airavata_apps.sort(
-        key=lambda app: "{:09}-{}".format(app.app_order,
-                                          app.verbose_name.lower()))
+        key=lambda app: f"{app.app_order:09}-{app.verbose_name.lower()}")
     current_app = _get_current_app(request, airavata_apps)
 
     return {
diff --git a/airavata-django-portal/django_airavata/stubs.py 
b/airavata-django-portal/django_airavata/stubs.py
index 39aea8bf2..cd76e452c 100644
--- a/airavata-django-portal/django_airavata/stubs.py
+++ b/airavata-django-portal/django_airavata/stubs.py
@@ -1,20 +1,23 @@
-from typing import Dict, Any, Optional
-from django.http import HttpRequest, QueryDict
+from typing import Any
+
 from django.contrib.auth.models import AbstractUser
+from django.http import HttpRequest, QueryDict
+
 
 # Type stub to extend Django's HttpRequest with custom attributes added by 
middleware
 class AiravataHttpRequest(HttpRequest):
     airavata_client: Any
-    profile_service: Dict[str, Any]
+    profile_service: dict[str, Any]
     authz_token: Any
     gateway_id: str
     username: str
     is_gateway_admin: bool
     is_read_only_gateway_admin: bool
     query_params: QueryDict
-    data: Dict[str, Any]
+    data: dict[str, Any]
     user: 'AiravataUser'
+    META: dict[str, str]
 
 # Type stub to extend Django's User model with custom attributes
 class AiravataUser(AbstractUser):
-    user_profile: Any 
\ No newline at end of file
+    user_profile: Any
diff --git a/airavata-django-portal/django_airavata/uploadhandler.py 
b/airavata-django-portal/django_airavata/uploadhandler.py
index dfa28a530..a76378c57 100644
--- a/airavata-django-portal/django_airavata/uploadhandler.py
+++ b/airavata-django-portal/django_airavata/uploadhandler.py
@@ -1,8 +1,5 @@
 from django.conf import settings
-from django.core.files.uploadhandler import (
-    StopUpload,
-    TemporaryFileUploadHandler
-)
+from django.core.files.uploadhandler import StopUpload, 
TemporaryFileUploadHandler
 
 
 class MaxFileSizeTemporaryFileUploadHandler(TemporaryFileUploadHandler):
diff --git a/airavata-django-portal/django_airavata/urls.py 
b/airavata-django-portal/django_airavata/urls.py
index 2612371d9..ff7e870c4 100644
--- a/airavata-django-portal/django_airavata/urls.py
+++ b/airavata-django-portal/django_airavata/urls.py
@@ -18,8 +18,8 @@ from django.conf.urls import include
 from django.conf.urls.static import static
 from django.contrib import admin
 from django.urls import path, re_path
-from wagtail.admin import urls as wagtailadmin_urls
 from wagtail import urls as wagtail_urls
+from wagtail.admin import urls as wagtailadmin_urls
 from wagtail.documents import urls as wagtaildocs_urls
 
 from . import views
diff --git a/airavata-django-portal/django_airavata/utils.py 
b/airavata-django-portal/django_airavata/utils.py
index 343cea952..72c1e7ebd 100644
--- a/airavata-django-portal/django_airavata/utils.py
+++ b/airavata-django-portal/django_airavata/utils.py
@@ -6,17 +6,11 @@ from contextlib import contextmanager
 import thrift_connector.connection_pool as connection_pool
 from airavata.api import Airavata
 from airavata.service.profile.groupmanager.cpi import GroupManagerService
-from airavata.service.profile.groupmanager.cpi.constants import (
-    GROUP_MANAGER_CPI_NAME
-)
+from airavata.service.profile.groupmanager.cpi.constants import 
GROUP_MANAGER_CPI_NAME
 from airavata.service.profile.iam.admin.services.cpi import IamAdminServices
-from airavata.service.profile.iam.admin.services.cpi.constants import (
-    IAM_ADMIN_SERVICES_CPI_NAME
-)
+from airavata.service.profile.iam.admin.services.cpi.constants import 
IAM_ADMIN_SERVICES_CPI_NAME
 from airavata.service.profile.tenant.cpi import TenantProfileService
-from airavata.service.profile.tenant.cpi.constants import (
-    TENANT_PROFILE_CPI_NAME
-)
+from airavata.service.profile.tenant.cpi.constants import 
TENANT_PROFILE_CPI_NAME
 from airavata.service.profile.user.cpi import UserProfileService
 from airavata.service.profile.user.cpi.constants import USER_PROFILE_CPI_NAME
 from django.conf import settings
@@ -150,8 +144,8 @@ def get_thrift_client(host, port, is_secure, 
client_generator):
 
     try:
         transport.open()
-        log.debug("Thrift connection opened to {}:{}, "
-                  "secure={}".format(host, port, is_secure))
+        log.debug(f"Thrift connection opened to {host}:{port}, "
+                  f"secure={is_secure}")
         try:
             yield client
         except Exception as e:
@@ -161,14 +155,13 @@ def get_thrift_client(host, port, is_secure, 
client_generator):
         finally:
             if transport.isOpen():
                 transport.close()
-                log.debug("Thrift connection closed to {}:{}, "
-                          "secure={}".format(host, port, is_secure))
+                log.debug(f"Thrift connection closed to {host}:{port}, "
+                          f"secure={is_secure}")
     except ThriftClientException as tce:
         # Allow thrift client errors to bubble up
         raise tce
     except Exception as e:
-        msg = "Failed to open thrift connection to {}:{}, secure={}".format(
-            host, port, is_secure)
+        msg = f"Failed to open thrift connection to {host}:{port}, 
secure={is_secure}"
         log.debug(msg)
         raise ThriftConnectionException(msg) from e
 
@@ -196,7 +189,7 @@ class CustomThriftClient(connection_pool.ThriftClient):
         try:
             self.client.getAPIVersion()
         except Exception as e:
-            log.debug("getAPIVersion failed: {}".format(str(e)))
+            log.debug(f"getAPIVersion failed: {str(e)}")
             raise
 
 
diff --git a/airavata-django-portal/django_airavata/wagtailapps/base/blocks.py 
b/airavata-django-portal/django_airavata/wagtailapps/base/blocks.py
index f3cad89c6..3ea3b5a18 100644
--- a/airavata-django-portal/django_airavata/wagtailapps/base/blocks.py
+++ b/airavata-django-portal/django_airavata/wagtailapps/base/blocks.py
@@ -8,7 +8,7 @@ from wagtail.blocks import (
     RichTextBlock,
     StreamBlock,
     StructBlock,
-    TextBlock
+    TextBlock,
 )
 from wagtail.documents.blocks import DocumentChooserBlock
 from wagtail.embeds.blocks import EmbedBlock
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/management/commands/set_wagtail_site.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/management/commands/set_wagtail_site.py
index fdbebf6a9..8118d4619 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/management/commands/set_wagtail_site.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/management/commands/set_wagtail_site.py
@@ -3,11 +3,7 @@ from django.core.management.base import BaseCommand
 from django.db import transaction
 from wagtail.models import Page, Site
 
-from django_airavata.wagtailapps.base.models import (
-    BlankPage,
-    CybergatewayHomePage,
-    HomePage
-)
+from django_airavata.wagtailapps.base.models import BlankPage, 
CybergatewayHomePage, HomePage
 
 
 class Command(BaseCommand):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0001_initial.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0001_initial.py
index 6b9a8a1a3..4b1c8d848 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0001_initial.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0001_initial.py
@@ -1,14 +1,12 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-10 21:43
-from __future__ import unicode_literals
 
-from django.db import migrations, models
 import django.db.models.deletion
 import modelcluster.fields
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0002_auto_20180410_2236.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0002_auto_20180410_2236.py
index df8b68ecb..13b600d56 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0002_auto_20180410_2236.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0002_auto_20180410_2236.py
@@ -1,12 +1,10 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-10 22:36
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0003_navextra_nav_logo_link.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0003_navextra_nav_logo_link.py
index 3673d11dc..246fb315d 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0003_navextra_nav_logo_link.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0003_navextra_nav_logo_link.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-14 18:03
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0004_auto_20180414_1852.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0004_auto_20180414_1852.py
index 74d0f0494..6ca4d2089 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0004_auto_20180414_1852.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0004_auto_20180414_1852.py
@@ -1,12 +1,10 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-14 18:52
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0005_cybergatewayhomepage_rowcybergatewayhomepagerelation.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0005_cybergatewayhomepage_rowcybergatewayhomepagerelation.py
index 409f8ac72..db665e1fd 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0005_cybergatewayhomepage_rowcybergatewayhomepagerelation.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0005_cybergatewayhomepage_rowcybergatewayhomepagerelation.py
@@ -1,14 +1,12 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-14 22:59
-from __future__ import unicode_literals
 
-from django.db import migrations, models
 import django.db.models.deletion
 import modelcluster.fields
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0006_auto_20180415_0040.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0006_auto_20180415_0040.py
index 5297afb7f..8b7ef6688 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0006_auto_20180415_0040.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0006_auto_20180415_0040.py
@@ -1,12 +1,10 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-15 00:40
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0007_auto_20180415_0045.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0007_auto_20180415_0045.py
index 2b38bb4cb..196d8b309 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0007_auto_20180415_0045.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0007_auto_20180415_0045.py
@@ -1,12 +1,10 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-15 00:45
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0008_cybergatewayhomepage_contact.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0008_cybergatewayhomepage_contact.py
index 1ecfbf8c0..8b1c71b07 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0008_cybergatewayhomepage_contact.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0008_cybergatewayhomepage_contact.py
@@ -1,12 +1,10 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-15 01:34
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0009_auto_20180415_0141.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0009_auto_20180415_0141.py
index e17a110bd..27b2d266e 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0009_auto_20180415_0141.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0009_auto_20180415_0141.py
@@ -1,12 +1,10 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-15 01:41
-from __future__ import unicode_literals
 
-from django.db import migrations, models
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0010_auto_20180415_0142.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0010_auto_20180415_0142.py
index 550d58fe0..0815e816d 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0010_auto_20180415_0142.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0010_auto_20180415_0142.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-15 01:42
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0011_auto_20180415_0143.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0011_auto_20180415_0143.py
index 6d59a1246..572a0058c 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0011_auto_20180415_0143.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0011_auto_20180415_0143.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-15 01:43
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0012_auto_20180415_0149.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0012_auto_20180415_0149.py
index 72a0f9318..124f7c822 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0012_auto_20180415_0149.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0012_auto_20180415_0149.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-15 01:49
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0013_auto_20180417_2034.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0013_auto_20180417_2034.py
index de0a3d25a..a49311383 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0013_auto_20180417_2034.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0013_auto_20180417_2034.py
@@ -1,12 +1,10 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-17 20:34
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0014_homepage_show_footer.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0014_homepage_show_footer.py
index fcf7abb8c..78c6cc1d3 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0014_homepage_show_footer.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0014_homepage_show_footer.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-27 15:19
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0015_cybergatewayhomepage_show_announcements.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0015_cybergatewayhomepage_show_announcements.py
index 0135788dc..14f41db3e 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0015_cybergatewayhomepage_show_announcements.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0015_cybergatewayhomepage_show_announcements.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-27 17:53
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0016_auto_20180427_1755.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0016_auto_20180427_1755.py
index f10dcc331..874ee3734 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0016_auto_20180427_1755.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0016_auto_20180427_1755.py
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-04-27 17:55
-from __future__ import unicode_literals
 
 from django.db import migrations, models
 
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0017_gatewayicon_gatewaytitle.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0017_gatewayicon_gatewaytitle.py
index 221c0329a..38f577437 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0017_gatewayicon_gatewaytitle.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0017_gatewayicon_gatewaytitle.py
@@ -1,9 +1,7 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.3 on 2018-07-19 15:46
-from __future__ import unicode_literals
 
-from django.db import migrations, models
 import django.db.models.deletion
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0018_auto_20181010_0136.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0018_auto_20181010_0136.py
index ad4c2bf49..df130e6c3 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0018_auto_20181010_0136.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0018_auto_20181010_0136.py
@@ -1,11 +1,9 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.16 on 2018-10-10 01:36
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
 import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0019_auto_20181025_1522.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0019_auto_20181025_1522.py
index 2f86def1b..2fd241779 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0019_auto_20181025_1522.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0019_auto_20181025_1522.py
@@ -1,12 +1,10 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.16 on 2018-10-25 15:22
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0020_auto_20190417_1949.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0020_auto_20190417_1949.py
index 3efee7965..4d3d9c445 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0020_auto_20190417_1949.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0020_auto_20190417_1949.py
@@ -1,12 +1,10 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.20 on 2019-04-17 19:49
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0021_auto_20191105_2053.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0021_auto_20191105_2053.py
index f75ffa2ed..a63b0ac3f 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0021_auto_20191105_2053.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0021_auto_20191105_2053.py
@@ -1,10 +1,8 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2019-11-05 20:53
-from __future__ import unicode_literals
 
-from django.db import migrations, models
 import django.db.models.deletion
 import modelcluster.fields
+from django.db import migrations, models
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0022_auto_20191106_1542.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0022_auto_20191106_1542.py
index bdc332bc4..d557358e8 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0022_auto_20191106_1542.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0022_auto_20191106_1542.py
@@ -1,13 +1,11 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2019-11-06 15:42
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.documents.blocks
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0023_rowblankpagerelation_container.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0023_rowblankpagerelation_container.py
index ac15a8194..9e82e417c 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0023_rowblankpagerelation_container.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0023_rowblankpagerelation_container.py
@@ -1,11 +1,9 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.28 on 2020-05-04 14:30
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
 import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0024_auto_20200624_1925.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0024_auto_20200624_1925.py
index 119739fef..f9efdc7ba 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0024_auto_20200624_1925.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0024_auto_20200624_1925.py
@@ -1,13 +1,11 @@
-# -*- coding: utf-8 -*-
 # Generated by Django 1.11.21 on 2020-06-24 19:25
-from __future__ import unicode_literals
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.documents.blocks
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0025_auto_20210319_2247.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0025_auto_20210319_2247.py
index 3b88a257a..02a3cf075 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0025_auto_20210319_2247.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0025_auto_20210319_2247.py
@@ -1,9 +1,9 @@
 # Generated by Django 2.2.17 on 2021-03-19 22:47
 
-from django.db import migrations
 import wagtail.blocks
 import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0026_auto_20210923_2212.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0026_auto_20210923_2212.py
index b3c3b81cf..d94144a7a 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0026_auto_20210923_2212.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/migrations/0026_auto_20210923_2212.py
@@ -1,11 +1,11 @@
 # Generated by Django 3.2.7 on 2021-09-23 22:12
 
-from django.db import migrations
 import wagtail.blocks
-import wagtail.fields
 import wagtail.documents.blocks
 import wagtail.embeds.blocks
+import wagtail.fields
 import wagtail.images.blocks
+from django.db import migrations
 
 
 class Migration(migrations.Migration):
diff --git a/airavata-django-portal/django_airavata/wagtailapps/base/models.py 
b/airavata-django-portal/django_airavata/wagtailapps/base/models.py
index 0e53d8fed..aba2e3dbf 100644
--- a/airavata-django-portal/django_airavata/wagtailapps/base/models.py
+++ b/airavata-django-portal/django_airavata/wagtailapps/base/models.py
@@ -1,21 +1,13 @@
-from __future__ import unicode_literals
 
 import os
-from typing import Any
 
 from django.db import models
 from modelcluster.fields import ParentalKey
 from modelcluster.models import ClusterableModel
-from wagtail.admin.panels import (
-    FieldPanel,
-    InlinePanel,
-    MultiFieldPanel,
-    ObjectList,
-    PageChooserPanel,
-    TabbedInterface
-)
+from wagtail.admin.panels import FieldPanel, InlinePanel, MultiFieldPanel, 
ObjectList, PageChooserPanel, TabbedInterface
 from wagtail.fields import RichTextField, StreamField
 from wagtail.models import Orderable, Page
+
 # ImageChooserPanel is not available in this version, using FieldPanel instead
 from wagtail.snippets.models import register_snippet
 
@@ -373,7 +365,7 @@ class GatewayTitle(models.Model):
     ]
 
     def __str__(self):
-        return "Gateway Title: {}".format(self.title_text)
+        return f"Gateway Title: {self.title_text}"
 
     class Meta:
         verbose_name_plural = 'Gateway Title'
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/templatetags/navigation_tags.py
 
b/airavata-django-portal/django_airavata/wagtailapps/base/templatetags/navigation_tags.py
index d734b709b..000c9fe96 100644
--- 
a/airavata-django-portal/django_airavata/wagtailapps/base/templatetags/navigation_tags.py
+++ 
b/airavata-django-portal/django_airavata/wagtailapps/base/templatetags/navigation_tags.py
@@ -1,6 +1,6 @@
 from django import template
 from django.conf import settings
-from wagtail.models import Page, Site
+from wagtail.models import Site
 
 from django_airavata.wagtailapps.base.models import (
     Announcements,
@@ -11,7 +11,7 @@ from django_airavata.wagtailapps.base.models import (
     GatewayIcon,
     GatewayTitle,
     Navbar,
-    NavExtra
+    NavExtra,
 )
 
 register = template.Library()
diff --git 
a/airavata-django-portal/django_airavata/wagtailapps/base/wagtail_hooks.py 
b/airavata-django-portal/django_airavata/wagtailapps/base/wagtail_hooks.py
index fc0286b59..72a6f4720 100644
--- a/airavata-django-portal/django_airavata/wagtailapps/base/wagtail_hooks.py
+++ b/airavata-django-portal/django_airavata/wagtailapps/base/wagtail_hooks.py
@@ -1,10 +1,8 @@
 import logging
 
 from django.shortcuts import redirect
-from wagtail.admin.rich_text.converters.html_to_contentstate import (
-    BlockElementHandler
-)
 from wagtail import hooks
+from wagtail.admin.rich_text.converters.html_to_contentstate import 
BlockElementHandler
 
 logger = logging.getLogger(__name__)
 

Reply via email to