def project_page_data(request, project_guid): """Returns a JSON object containing information used by the project page: :: json_response = { 'project': {..}, 'familiesByGuid': {..}, 'individualsByGuid': {..}, 'samplesByGuid': {..}, } Args: project_guid (string): GUID of the Project to retrieve data for. """ project = get_project_and_check_permissions(project_guid, request.user) update_project_from_json(project, {'last_accessed_date': timezone.now()}) response = _get_project_child_entities(project, request.user) project_json = _get_json_for_project(project, request.user) project_json['collaborators'] = get_json_for_project_collaborator_list(project) project_json['locusListGuids'] = response['locusListsByGuid'].keys() project_json['detailsLoaded'] = True project_json.update(_get_json_for_variant_tag_types(project)) gene_ids = set() for tag in project_json['discoveryTags']: gene_ids.update(tag.get('transcripts', {}).keys()) response.update({ 'projectsByGuid': {project_guid: project_json}, 'genesById': get_genes(gene_ids), }) return create_json_response(response)
def create_project_collaborator(request, project_guid): project = get_project_and_check_permissions(project_guid, request.user, can_edit=True) try: user = _create_user(request) except CreateUserException as e: if e.existing_user: return _update_existing_user(e.existing_user, project, json.loads(request.body)) else: return create_json_response({'error': str(e)}, status=e.status_code, reason=str(e)) project.can_view_group.user_set.add(user) return create_json_response({ 'projectsByGuid': { project_guid: { 'collaborators': get_json_for_project_collaborator_list(project) } } })
def _update_existing_user(user, project, request_json): user.first_name = request_json.get('firstName') or '' user.last_name = request_json.get('lastName') or '' user.save() project.can_view_group.user_set.add(user) if request_json.get('hasEditPermissions'): project.can_edit_group.user_set.add(user) else: project.can_edit_group.user_set.remove(user) create_xbrowse_project_collaborator( project, user, collaborator_type='manager' if request_json.get('hasEditPermissions') else 'collaborator') return create_json_response({ 'projectsByGuid': { project.guid: { 'collaborators': get_json_for_project_collaborator_list(project) } } })
def delete_project_collaborator(request, project_guid, username): project = get_project_and_check_permissions(project_guid, request.user, permission_level=CAN_EDIT) user = User.objects.get(username=username) project.can_view_group.user_set.remove(user) project.can_edit_group.user_set.remove(user) return create_json_response({ 'projectsByGuid': {project_guid: {'collaborators': get_json_for_project_collaborator_list(project)}} })
def _update_existing_user(user, project, request_json): project.can_view_group.user_set.add(user) if request_json.get('hasEditPermissions'): project.can_edit_group.user_set.add(user) else: project.can_edit_group.user_set.remove(user) return create_json_response({ 'projectsByGuid': { project.guid: { 'collaborators': get_json_for_project_collaborator_list(user, project) } } })
def create_project_collaborator(request, project_guid): project = get_project_and_check_permissions(project_guid, request.user, can_edit=True) if project.workspace_name: raise PermissionDenied( 'Adding collaborators directly in seqr is disabled. Users can be managed from the associated AnVIL workspace' ) request_json = json.loads(request.body) if not request_json.get('email'): return create_json_response({'error': 'Email is required'}, status=400) existing_user = User.objects.filter( email__iexact=request_json['email']).first() if existing_user: return _update_existing_user(existing_user, project, request_json) username = User.objects.make_random_password() user = User.objects.create_user( username, email=request_json['email'], first_name=request_json.get('firstName') or '', last_name=request_json.get('lastName') or '', ) logger.info('Created user {} (local)'.format(request_json['email']), extra={'user': request.user}) try: send_welcome_email(user, request.user) except AnymailError as e: return create_json_response({'error': str(e)}, status=getattr(e, 'status_code', None) or 400, reason=str(e)) project.can_view_group.user_set.add(user) return create_json_response({ 'projectsByGuid': { project_guid: { 'collaborators': get_json_for_project_collaborator_list(request.user, project) } } })