This is an automated email from the ASF dual-hosted git repository. machristie pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git
commit cd47d63afefd65ba4ae60e650a839527fee9a287 Merge: c592887 34be846 Author: Marcus Christie <[email protected]> AuthorDate: Wed Sep 30 19:05:39 2020 -0400 Merge branch 'develop' into merge-AIRAVATA-3346 .travis.yml | 4 +- README.md | 9 + django_airavata/apps/admin/.prettierignore | 2 + django_airavata/apps/admin/README.md | 4 + django_airavata/apps/admin/babel.config.js | 6 +- django_airavata/apps/admin/package.json | 4 +- .../admin/static/django_airavata_admin/src/App.vue | 4 +- .../src/components/admin/ComputeResourcesModal.vue | 42 +- .../BatchQueueResourcePolicy.vue | 20 +- .../ComputePreference.vue | 86 ++-- .../ComputeResourcePolicyEditor.vue | 40 +- .../ComputeResourcePolicySummary.vue | 83 ++-- .../ComputeResourceReservationEditor.vue | 24 +- .../ComputeResourceReservationList.vue | 38 +- .../ComputeResourceReservationsSummary.vue | 18 +- .../GroupComputeResourcePreference.vue | 72 ++-- .../applications/ApplicationDeploymentEditor.vue | 185 ++++++-- .../applications/ApplicationDeploymentsList.vue | 109 +++-- .../applications/ApplicationEditorContainer.vue | 303 +++++++------ .../applications/ApplicationInputFieldEditor.vue | 188 ++++++-- .../applications/ApplicationInterfaceEditor.vue | 116 +++-- .../applications/ApplicationModuleEditor.vue | 62 ++- .../applications/ApplicationOutputFieldEditor.vue | 110 +++-- .../applications/CommandObjectsEditor.vue | 42 +- .../src/components/applications/JSONEditor.vue | 19 +- .../components/applications/SetEnvPathsEditor.vue | 46 +- .../credentials/NewPasswordCredentialModal.vue | 41 +- .../credentials/NewSSHCredentialModal.vue | 25 +- .../credentials/SSHCredentialSelector.vue | 44 +- .../dashboards/ApplicationsDashboard.vue | 34 +- .../ComputeResourcePreferenceDashboard.vue | 42 +- .../dashboards/CredentialStoreDashboard.vue | 77 ++-- .../GatewayResourceProfileEditor.vue | 21 +- .../GatewayResourceProfileEditorContainer.vue | 57 +-- .../gatewayprofile/StoragePreferenceEditor.vue | 47 +- .../gatewayprofile/StoragePreferenceList.vue | 109 +++-- .../src/components/notices/NoticeEditor.vue | 125 +++--- .../notices/NoticesManagementContainer.vue | 117 ++--- .../statistics/ExperimentDetailsView.vue | 476 ++++++++++++--------- .../statistics/ExperimentStatisticsCard.vue | 27 +- .../statistics/ExperimentStatisticsContainer.vue | 196 ++++----- .../src/components/users/ActivateUserPanel.vue | 15 +- .../src/components/users/DeleteUserPanel.vue | 14 +- .../src/components/users/EnableUserPanel.vue | 15 +- .../components/users/GroupMembershipDisplay.vue | 33 +- .../IdentityServiceUserManagementContainer.vue | 84 ++-- .../UnverifiedEmailUserManagementContainer.vue | 60 ++- .../src/components/users/UserDetailsContainer.vue | 33 +- .../components/users/UserGroupMembershipEditor.vue | 49 ++- .../components/users/UserManagementContainer.vue | 15 +- .../admin/static/django_airavata_admin/src/main.js | 10 +- .../static/django_airavata_admin/src/router.js | 73 ++-- .../django_airavata_admin/static/css/admin.css | 80 ++-- .../django_airavata_admin/static/css/main.css | 188 ++++---- django_airavata/apps/admin/vue.config.js | 34 +- django_airavata/apps/admin/yarn.lock | 5 + django_airavata/apps/api/.prettierignore | 1 + django_airavata/apps/api/README.md | 4 +- django_airavata/apps/api/apps.py | 2 +- django_airavata/apps/api/babel.config.js | 12 +- django_airavata/apps/api/exceptions.py | 3 +- django_airavata/apps/api/helpers.py | 3 +- django_airavata/apps/api/output_views.py | 12 +- django_airavata/apps/api/package.json | 4 +- django_airavata/apps/api/serializers.py | 7 +- django_airavata/apps/api/signals.py | 3 +- .../django_airavata_api/js/errors/ErrorReporter.js | 12 +- .../django_airavata_api/js/errors/ErrorUtils.js | 2 +- .../js/errors/UnhandledError.js | 25 +- .../js/errors/UnhandledErrorDispatcher.js | 4 +- .../js/errors/UnhandledErrorDisplayList.js | 27 +- .../api/static/django_airavata_api/js/index.js | 12 +- .../js/models/ApplicationDeploymentDescription.js | 48 +-- .../js/models/ApplicationInterfaceDefinition.js | 24 +- .../js/models/ApplicationModule.js | 12 +- .../django_airavata_api/js/models/BaseEnum.js | 53 +-- .../django_airavata_api/js/models/BaseModel.js | 4 +- .../django_airavata_api/js/models/BatchQueue.js | 34 +- .../js/models/BatchQueueResourcePolicy.js | 2 +- .../django_airavata_api/js/models/CommandObject.js | 11 +- .../models/ComputationalResourceSchedulingModel.js | 143 ++++--- .../js/models/ComputeResourceDescription.js | 74 ++-- .../js/models/ComputeResourceReservation.js | 8 +- .../js/models/CredentialSummary.js | 6 +- .../django_airavata_api/js/models/DataProduct.js | 101 ++--- .../js/models/DataReplicaLocation.js | 52 +-- .../django_airavata_api/js/models/DataType.js | 4 +- .../django_airavata_api/js/models/ErrorModel.js | 34 +- .../django_airavata_api/js/models/Experiment.js | 34 +- .../js/models/ExperimentSearchFields.js | 2 +- .../js/models/ExperimentState.js | 6 +- .../js/models/ExperimentStatistics.js | 12 +- .../js/models/ExperimentStatus.js | 6 +- .../js/models/ExperimentSummary.js | 16 +- .../js/models/FullExperiment.js | 30 +- .../js/models/GatewayResourceProfile.js | 4 +- .../static/django_airavata_api/js/models/Group.js | 14 +- .../js/models/GroupComputeResourcePreference.js | 12 +- .../js/models/GroupPermission.js | 33 +- .../js/models/GroupResourceProfile.js | 36 +- .../js/models/IAMUserProfile.js | 6 +- .../js/models/InputDataObjectType.js | 16 +- .../static/django_airavata_api/js/models/Job.js | 6 +- .../django_airavata_api/js/models/JobState.js | 23 +- .../django_airavata_api/js/models/JobStatus.js | 6 +- .../django_airavata_api/js/models/LogRecord.js | 4 +- .../django_airavata_api/js/models/Notification.js | 30 +- .../js/models/NotificationPriority.js | 11 +- .../js/models/OutputDataObjectType.js | 12 +- .../js/models/ParallelismType.js | 7 +- .../static/django_airavata_api/js/models/Parser.js | 11 +- .../django_airavata_api/js/models/ParserInput.js | 4 +- .../django_airavata_api/js/models/ParserOutput.js | 4 +- .../django_airavata_api/js/models/ProcessModel.js | 24 +- .../django_airavata_api/js/models/ProcessState.js | 2 +- .../django_airavata_api/js/models/ProcessStatus.js | 6 +- .../js/models/ProcessWorkflow.js | 4 +- .../django_airavata_api/js/models/Project.js | 44 +- .../js/models/ResourcePermissionType.js | 12 +- .../django_airavata_api/js/models/SetEnvPaths.js | 12 +- .../django_airavata_api/js/models/SharedEntity.js | 24 +- .../js/models/StoragePreference.js | 2 +- .../js/models/StorageResourceDescription.js | 2 +- .../django_airavata_api/js/models/SummaryType.js | 11 +- .../static/django_airavata_api/js/models/Task.js | 14 +- .../django_airavata_api/js/models/TaskStatus.js | 5 +- .../django_airavata_api/js/models/TaskTypes.js | 2 +- .../js/models/UnverifiedEmailUserProfile.js | 4 +- .../js/models/UserConfigurationData.js | 104 ++--- .../js/models/UserPermission.js | 33 +- .../django_airavata_api/js/models/UserProfile.js | 88 ++-- .../django_airavata_api/js/models/UserStatus.js | 33 +- .../js/models/UserStorageDirectory.js | 2 +- .../js/models/UserStorageFile.js | 2 +- .../js/models/UserStoragePath.js | 10 +- .../js/models/WorkspacePreferences.js | 2 +- .../dependencies/BooleanExpressionEvaluator.js | 21 +- .../js/models/validators/MaxLengthValidator.js | 50 +-- .../js/models/validators/MinLengthValidator.js | 50 +-- .../validators/RegularExpressionValidator.js | 46 +- .../js/models/validators/ValidatorFactory.js | 41 +- .../django_airavata_api/js/service_config.js | 162 +++---- .../js/services/CloudJobSubmissionService.js | 12 +- .../js/services/DataMovementService.js | 14 +- .../js/services/FullExperimentService.js | 23 +- .../js/services/GlobusJobSubmissionService.js | 15 +- .../js/services/GridFTPDataMovementService.js | 12 +- .../js/services/JobSubmissionService.js | 15 +- .../js/services/LocaJobSubmissionService.js | 15 +- .../js/services/ProjectService.js | 74 ++-- .../js/services/SCPDataMovementService.js | 10 +- .../js/services/ServiceFactory.js | 38 +- .../js/services/SshJobSubmissionService.js | 13 +- .../js/services/UnicoreDataMovementService.js | 10 +- .../js/services/UnicoreJobSubmissionService.js | 15 +- .../js/services/UserProfileService.js | 22 +- .../static/django_airavata_api/js/utils/Cache.js | 2 +- .../django_airavata_api/js/utils/FetchUtils.js | 106 ++--- .../js/utils/PaginationIterator.js | 88 ++-- .../django_airavata_api/js/utils/StringUtils.js | 11 +- .../static/django_airavata_api/tests/.eslintrc.js | 8 +- .../BooleanExpressionEvaluator.test.js | 102 ++--- django_airavata/apps/api/tests/test_views.py | 6 +- django_airavata/apps/api/urls.py | 6 +- django_airavata/apps/api/views.py | 42 +- django_airavata/apps/api/webpack.config.js | 4 +- django_airavata/apps/api/yarn.lock | 5 + django_airavata/apps/auth/tests/test_signals.py | 4 +- django_airavata/apps/auth/utils.py | 3 +- django_airavata/apps/dataparsers/.prettierignore | 2 + django_airavata/apps/dataparsers/babel.config.js | 6 +- django_airavata/apps/dataparsers/package.json | 4 +- .../js/containers/ParserDetailsContainer.vue | 19 +- .../js/containers/ParserEditContainer.vue | 66 +-- .../js/containers/ParsersManageContainer.vue | 100 ++--- .../js/entry-parser-details.js | 12 +- .../js/parser-components/ParserEditor.vue | 176 +++++--- .../js/parser-components/ParserList.vue | 71 +-- .../js/parser-components/ParserListItem.vue | 63 ++- .../js/parser-edit-entry-point.js | 12 +- .../js/parser-listing-entry-point.js | 4 +- django_airavata/apps/dataparsers/urls.py | 6 +- django_airavata/apps/dataparsers/vue.config.js | 49 ++- django_airavata/apps/dataparsers/yarn.lock | 5 + django_airavata/apps/groups/.prettierignore | 2 + django_airavata/apps/groups/babel.config.js | 6 +- django_airavata/apps/groups/package.json | 4 +- .../js/containers/GroupCreateContainer.vue | 53 ++- .../js/containers/GroupEditContainer.vue | 57 ++- .../js/containers/GroupsManageContainer.vue | 108 ++--- .../js/group-create-entry-point.js | 4 +- .../js/group-edit-entry-point.js | 40 +- .../js/group-listing-entry-point.js | 4 +- .../js/group_components/GroupEditor.vue | 61 ++- .../js/group_components/GroupList.vue | 87 ++-- .../js/group_components/GroupListItem.vue | 192 +++++---- .../js/group_components/GroupMembersEditor.vue | 54 +-- django_airavata/apps/groups/vue.config.js | 49 ++- django_airavata/apps/groups/yarn.lock | 5 + django_airavata/apps/workspace/.prettierignore | 4 + django_airavata/apps/workspace/babel.config.js | 6 +- .../.prettierignore | 2 + .../django-airavata-workspace-plugin-api/README.md | 5 +- .../babel.config.js | 6 +- .../js/index.js | 8 +- .../js/input-editors/InputEditorMixin.js | 140 +++--- .../package.json | 4 +- .../vue.config.js | 4 +- .../django-airavata-workspace-plugin-api/yarn.lock | 5 + django_airavata/apps/workspace/jest.config.js | 29 +- django_airavata/apps/workspace/package.json | 4 +- .../js/components/PgaLink.vue | 25 +- .../ComputationalResourceSchedulingEditor.vue | 84 ++-- .../experiment/ExperimentDescriptionEditor.vue | 31 +- .../js/components/experiment/ExperimentEditor.vue | 161 +++---- .../js/components/experiment/ExperimentSummary.vue | 419 +++++++++--------- .../experiment/GroupResourceProfileSelector.vue | 168 ++++---- .../components/experiment/QueueSettingsEditor.vue | 81 ++-- .../input-editors/AutocompleteInputEditor.vue | 40 +- .../input-editors/CheckboxInputEditor.vue | 75 ++-- .../experiment/input-editors/FileInputEditor.vue | 53 +-- .../input-editors/InputEditorContainer.vue | 271 ++++++------ .../input-editors/InputEditorFormGroup.vue | 75 ++-- .../experiment/input-editors/InputFileSelector.vue | 26 +- .../input-editors/MultiFileInputEditor.vue | 14 +- .../input-editors/RadioButtonInputEditor.vue | 59 +-- .../experiment/input-editors/SelectInputEditor.vue | 14 +- .../experiment/input-editors/StringInputEditor.vue | 28 +- .../input-editors/TextareaInputEditor.vue | 43 +- .../input-editors/UserFileInputEditor.vue | 41 +- .../output-displays/DefaultOutputDisplay.vue | 12 +- .../output-displays/HtmlOutputDisplay.vue | 14 +- .../output-displays/ImageOutputDisplay.vue | 8 +- .../output-displays/LinkOutputDisplay.vue | 6 +- .../output-displays/NotebookOutputDisplay.vue | 17 +- .../output-displays/OutputDisplayContainer.vue | 34 +- .../output-displays/OutputViewDataLoader.js | 8 +- .../InteractiveParameterCheckboxWidget.vue | 8 +- .../InteractiveParameterRangeWidget.vue | 14 +- .../InteractiveParameterSelectWidget.vue | 10 +- .../InteractiveParameterStepperWidget.vue | 14 +- .../InteractiveParameterTextInputWidget.vue | 12 +- .../InteractiveParameterWidgetContainer.vue | 10 +- .../InteractiveParametersPanel.vue | 22 +- .../js/components/project/ProjectButtonNew.vue | 43 +- .../js/components/project/ProjectEditor.vue | 33 +- .../js/components/project/ProjectList.vue | 53 +-- .../js/components/project/ProjectListItem.vue | 18 +- .../components/storage/UserStorageCreateView.vue | 86 ++-- .../storage/UserStorageFileSelectionContainer.vue | 26 +- .../storage/UserStoragePathBreadcrumb.vue | 15 +- .../components/storage/UserStoragePathViewer.vue | 82 ++-- .../storage-edit/UserStorageAudioEditViewer.vue | 29 +- .../storage-edit/UserStorageDefaultEditViewer.vue | 26 +- .../storage-edit/UserStorageDownloadButton.vue | 16 +- .../storage/storage-edit/UserStorageEditViewer.vue | 141 +++--- .../storage-edit/UserStorageImageEditViewer.vue | 27 +- .../storage-edit/UserStoragePdfEditViewer.vue | 27 +- .../storage-edit/UserStorageTextEditViewer.vue | 134 +++--- .../storage-edit/UserStorageVideoEditViewer.vue | 29 +- .../js/containers/CreateExperimentContainer.vue | 20 +- .../js/containers/DashboardContainer.vue | 69 ++- .../js/containers/EditExperimentContainer.vue | 32 +- .../js/containers/EditProjectContainer.vue | 40 +- .../js/containers/ExperimentListContainer.vue | 84 ++-- .../js/containers/ProjectListContainer.vue | 116 ++--- .../js/containers/RecentExperimentsContainer.vue | 44 +- .../js/containers/UserStorageContainer.vue | 23 +- .../js/containers/ViewExperimentContainer.vue | 81 ++-- .../js/entry-create-experiment.js | 12 +- .../js/entry-dashboard.js | 14 +- .../js/entry-edit-experiment.js | 12 +- .../js/entry-edit-project.js | 12 +- .../js/entry-experiment-list.js | 12 +- .../js/entry-project-list.js | 12 +- .../js/entry-user-storage.js | 10 +- .../js/entry-view-experiment.js | 12 +- .../django_airavata_workspace/js/utils/urls.js | 8 +- .../django_airavata_workspace/tests/.eslintrc.js | 6 +- .../input-editors/InputEditorContainer.spec.js | 37 +- django_airavata/apps/workspace/views.py | 4 +- django_airavata/apps/workspace/vue.config.js | 60 +-- django_airavata/apps/workspace/yarn.lock | 10 + django_airavata/settings.py | 6 +- django_airavata/settings_local.py.ide | 2 +- django_airavata/static/common/.prettierignore | 2 + django_airavata/static/common/babel.config.js | 6 +- django_airavata/static/common/js/cms.js | 2 +- .../common/js/components/ApplicationCard.vue | 30 +- .../common/js/components/ApplicationName.vue | 14 +- .../common/js/components/AutocompleteTextInput.vue | 52 ++- .../common/js/components/ClipboardCopyButton.vue | 20 +- .../common/js/components/ClipboardCopyLink.vue | 23 +- .../common/js/components/ComputeResourceName.vue | 18 +- .../common/js/components/ConfirmationDialog.vue | 22 +- .../common/js/components/DataProductViewer.vue | 22 +- .../static/common/js/components/DeleteButton.vue | 15 +- .../static/common/js/components/DeleteLink.vue | 12 +- .../common/js/components/ExperimentStatusBadge.vue | 12 +- .../static/common/js/components/FavoriteToggle.vue | 19 +- .../common/js/components/GatewayGroupsBadge.vue | 9 +- .../js/components/GatewayNoticesContainer.vue | 47 +- .../static/common/js/components/HumanDate.vue | 7 +- .../static/common/js/components/Linkify.vue | 34 ++ .../static/common/js/components/MainLayout.vue | 11 +- .../common/js/components/NotificationsDisplay.vue | 48 +-- .../static/common/js/components/Pager.vue | 86 ++-- .../static/common/js/components/ShareButton.vue | 129 +++--- .../common/js/components/SharedEntityEditor.vue | 229 +++++----- .../static/common/js/components/Sidebar.vue | 5 +- .../static/common/js/components/SidebarFeed.vue | 21 +- .../common/js/components/SidebarFeedItem.vue | 24 +- .../static/common/js/components/SidebarHeader.vue | 14 +- .../common/js/components/UnsavedChangesGuard.vue | 9 +- .../static/common/js/components/Uppy.vue | 38 +- .../static/common/js/components/ValidatedForm.vue | 20 +- .../common/js/components/ValidatedFormGroup.vue | 14 +- .../static/common/js/errors/GlobalErrorHandler.js | 58 ++- .../static/common/js/errors/ValidationErrors.js | 6 +- django_airavata/static/common/js/index.js | 14 +- .../static/common/js/layouts/ListLayout.vue | 42 +- django_airavata/static/common/js/main.js | 2 +- .../static/common/js/mixins/VModelMixin.js | 24 +- django_airavata/static/common/js/notices.js | 8 +- .../static/common/js/notifications/Notification.js | 26 +- .../common/js/notifications/NotificationList.js | 2 +- django_airavata/static/common/js/utils.js | 4 +- django_airavata/static/common/package.json | 5 +- django_airavata/static/common/scss/main.scss | 401 +++++++++-------- django_airavata/static/common/vue.config.js | 10 +- django_airavata/static/common/yarn.lock | 10 + django_airavata/utils.py | 9 +- docs/dev/developing_backend.md | 16 +- docs/dev/developing_frontend.md | 38 +- docs/dev/new_django_app.md | 4 +- docs/tutorial/gateways2019_tutorial.md | 149 ++++++- requirements-dev.txt | 4 +- runtests.py | 19 + setup.cfg | 6 + tests/__init__.py | 0 tests/settings.py | 30 ++ 341 files changed, 7271 insertions(+), 5945 deletions(-) diff --cc django_airavata/apps/api/serializers.py index 0ecd926,3c589e9..07f7a43 --- a/django_airavata/apps/api/serializers.py +++ b/django_airavata/apps/api/serializers.py @@@ -62,9 -58,11 +58,12 @@@ from airavata.model.workspace.ttypes im Project ) from airavata_django_portal_sdk import user_storage + from django.conf import settings + from django.urls import reverse + from rest_framework import serializers from . import models, thrift_utils +import requests log = logging.getLogger(__name__) diff --cc django_airavata/apps/api/views.py index 404117b,25f420f..7a07075 --- a/django_airavata/apps/api/views.py +++ b/django_airavata/apps/api/views.py @@@ -3,27 -3,7 +3,9 @@@ import jso import logging import os from datetime import datetime, timedelta +from urllib.parse import quote +import requests - from django.conf import settings - from django.contrib.auth.decorators import login_required - from django.core.exceptions import ObjectDoesNotExist, PermissionDenied - from django.http import FileResponse, Http404, HttpResponse, JsonResponse - from django.urls import reverse - from rest_framework import mixins - from rest_framework.decorators import ( - action, - api_view, - detail_route, - list_route - ) - from rest_framework.exceptions import ParseError - from rest_framework.renderers import JSONRenderer - from rest_framework.response import Response - from rest_framework.status import HTTP_400_BAD_REQUEST, HTTP_404_NOT_FOUND - from rest_framework.views import APIView - from airavata.model.appcatalog.computeresource.ttypes import ( CloudJobSubmission, GlobusJobSubmission, @@@ -43,6 -23,19 +25,23 @@@ from airavata.model.experiment.ttypes i from airavata.model.group.ttypes import ResourcePermissionType from airavata.model.user.ttypes import Status from airavata_django_portal_sdk import user_storage + from django.conf import settings -from django.contrib.auth.decorators import login_required + from django.core.exceptions import ObjectDoesNotExist, PermissionDenied + from django.http import FileResponse, Http404, HttpResponse, JsonResponse + from django.urls import reverse + from rest_framework import mixins -from rest_framework.decorators import action, detail_route, list_route ++from rest_framework.decorators import ( ++ action, ++ api_view, ++ detail_route, ++ list_route ++) + from rest_framework.exceptions import ParseError + from rest_framework.renderers import JSONRenderer + from rest_framework.response import Response + from rest_framework.status import HTTP_400_BAD_REQUEST + from rest_framework.views import APIView + from django_airavata.apps.api.view_utils import ( APIBackedViewSet, APIResultIterator, @@@ -1610,8 -1577,11 +1609,9 @@@ class UserStoragePathView(APIView) if uploaded is not None: data['uploaded'] = uploaded data['parts'] = self._split_path(path) - serializer = self.serializer_class(data, context={'request': request}) + serializer = self.serializer_class( + data, context={'request': request}) return Response(serializer.data) - user_storage.delete_dir(request, path) - return Response(status=204) def _split_path(self, path): head, tail = os.path.split(path)
