Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
            }
        }
    })
Exemplo n.º 3
0
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)
            }
        }
    })
Exemplo n.º 4
0
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)}}
    })
Exemplo n.º 5
0
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)
            }
        }
    })
Exemplo n.º 6
0
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)
            }
        }
    })