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__)
