def post(self, request): """ Create a new Project. Projects and the root File directory for a Project should be owned by the portal, with roles/permissions granted to the creating user. 1. Create the metadata record for the project 2. Create a directory on the projects storage system named after the metadata uuid 3. Associate the metadata uuid and file uuid :param request: :return: The newly created project :rtype: JsonResponse """ # portal service account needs to create the objects on behalf of the user ag = get_service_account_client() if request.is_ajax(): post_data = json.loads(request.body) else: post_data = request.POST.copy() # create Project (metadata) metrics.info('projects', extra={'user' : request.user.username, 'sessionId': getattr(request.session, 'session_key', ''), 'operation': 'metadata_create', 'info': {'postData': post_data} }) p = Project(ag) p.title = post_data.get('title') p.pi = post_data.get('pi', None) p.save() # create Project Directory on Managed system metrics.info('projects', extra={'user' : request.user.username, 'sessionId': getattr(request.session, 'session_key', ''), 'operation': 'base_directory_create', 'info': { 'systemId': Project.STORAGE_SYSTEM_ID, 'uuid': p.uuid }}) project_storage_root = BaseFileResource(ag, Project.STORAGE_SYSTEM_ID, '/') project_storage_root.mkdir(p.uuid) # Wrap Project Directory as private system for project project_system_tmpl = template_project_storage_system(p) metrics.info('projects', extra={'user' : request.user.username, 'sessionId': getattr(request.session, 'session_key', ''), 'operation': 'private_system_create', 'info': { 'id': project_system_tmpl.get('id'), 'site': project_system_tmpl.get('site'), 'default': project_system_tmpl.get('default'), 'status': project_system_tmpl.get('status'), 'description': project_system_tmpl.get('description'), 'name': project_system_tmpl.get('name'), 'globalDefault': project_system_tmpl.get('globalDefault'), 'available': project_system_tmpl.get('available'), 'public': project_system_tmpl.get('public'), 'type': project_system_tmpl.get('type'), 'storage': { 'homeDir': project_system_tmpl.get('storage', {}).get('homeDir'), 'rootDir': project_system_tmpl.get('storage', {}).get('rootDir') } }}) ag.systems.add(body=project_system_tmpl) # grant initial permissions for creating user and PI, if exists project_system_tmpl = template_project_storage_system(p) metrics.info('projects', extra={'user' : request.user.username, 'sessionId': getattr(request.session, 'session_key', ''), 'operation': 'initial_pems_create', 'info': {'collab': request.user.username, 'pi': p.pi} }) p.add_collaborator(request.user.username) if p.pi and p.pi != request.user.username: p.add_collaborator(p.pi) return JsonResponse(p, encoder=AgaveJSONEncoder, safe=False)
def mkdir(self, system, file_path, dir_name): f = BaseFileResource(self._ag, system, file_path) resp = f.mkdir(dir_name) reindex_agave.apply_async(kwargs = {'username': '******', 'file_id': '{}/{}'.format(system, file_path)}) return resp