django_airavata/apps/api/helpers.py (77 lines of code) (raw):
import logging
from airavata.model.group.ttypes import ResourcePermissionType
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist
from . import models
logger = logging.getLogger(__name__)
class WorkspacePreferencesHelper:
def get(self, request):
try:
workspace_preferences = models.WorkspacePreferences.objects.get(
username=request.user.username)
self._check(request, workspace_preferences)
except ObjectDoesNotExist:
workspace_preferences = self._create_default(request)
workspace_preferences.save()
return workspace_preferences
def _create_default(self, request):
workspace_preferences = models.WorkspacePreferences.create(
request.user.username)
most_recent_project = self._get_most_recent_project(request)
workspace_preferences.most_recent_project_id = \
most_recent_project.projectID
first_grp = \
self._get_first_group_resource_profile(request)
workspace_preferences.most_recent_group_resource_profile_id = \
first_grp.groupResourceProfileId if first_grp else None
return workspace_preferences
def _get_most_recent_project(self, request):
"Return most recent writeable project."
projects = request.airavata_client.getUserProjects(
request.authz_token, settings.GATEWAY_ID, request.user.username,
-1, 0)
for project in projects:
if self._can_write(request, project.projectID):
return project
return None
def _get_first_group_resource_profile(self, request):
"Return first accessible group resource profile"
group_resource_profiles = request.airavata_client.getGroupResourceList(
request.authz_token, settings.GATEWAY_ID)
if len(group_resource_profiles) > 0:
return group_resource_profiles[0]
else:
return None
def _check(self, request, prefs):
"Validate preference values and update as needed."
if (not prefs.most_recent_project_id or
not self._can_write(request, prefs.most_recent_project_id)):
most_recent_project = self._get_most_recent_project(request)
logger.warn(
"_check: updating most_recent_project_id to {}".format(
most_recent_project.projectID))
prefs.most_recent_project_id = most_recent_project.projectID
prefs.save()
group_resource_profiles = request.airavata_client.getGroupResourceList(
request.authz_token, settings.GATEWAY_ID)
group_resource_profile_ids = list(map(lambda g: g.groupResourceProfileId, group_resource_profiles))
if (not prefs.most_recent_group_resource_profile_id or
prefs.most_recent_group_resource_profile_id not in group_resource_profile_ids):
first_grp_id = (group_resource_profile_ids[0]
if len(group_resource_profile_ids) > 0
else None)
logger.warn(f"_check: updating "
f"most_recent_group_resource_profile_id to "
f"{first_grp_id}")
prefs.most_recent_group_resource_profile_id = first_grp_id
prefs.save()
def _can_write(self, request, entity_id):
return request.airavata_client.userHasAccess(
request.authz_token,
entity_id,
ResourcePermissionType.WRITE)
def _can_read(self, request, entity_id):
return request.airavata_client.userHasAccess(
request.authz_token,
entity_id,
ResourcePermissionType.READ)