def view(request, project_uuid):
    """Queries project metadata and all associated metadata"""
    if request.user.is_anonymous():
        api_client = get_portal_api_client()
    else:
        # api_client = get_portal_api_client()
        api_client = request.user.agave_oauth.api_client

    try:
        project = Project(api_client=api_client, uuid=project_uuid)
    except Exception as e:
        exception_msg = 'Unable to load project. %s' % e
        logger.error(exception_msg)
        messages.error(request, exception_msg)
        return HttpResponseRedirect('/projects/')

    try:
        process_types = get_process_type_keys(project)
        project_fields = get_project_form_fields()
        project.set_fields(project_fields)
        investigation_type = get_investigation_type(project)

        context = {'project': project,
                   'investigation_type': investigation_type,
                   'process_types': process_types}

        return render(request, 'ids_projects/projects/detail.html', context)
    except Exception as e:
        exception_msg = 'Unable to load config values. %s' % e
        logger.warning(exception_msg)
        messages.warning(request, exception_msg)
        return HttpResponseRedirect(
                    reverse('ids_projects:project-list-private'))
def edit(request, project_uuid):
    """Edit a project, given the uuid"""
    api_client = request.user.agave_oauth.api_client

    try:
        project_fields = get_project_form_fields()
    except Exception as e:
        exception_msg = 'Unable to load config values, cannot create project. %s' % e
        logger.error(exception_msg)
        messages.warning(request, exception_msg)
        return HttpResponseRedirect(
                    reverse('ids_projects:project-list-private'))

    try:
        project = Project(api_client=api_client, uuid=project_uuid)
    except Exception as e:
        exception_msg = 'Unable to load project. %s' % e
        logger.exception(exception_msg)
        messages.warning(request, exception_msg)
        return HttpResponseRedirect('/projects/')

    #######
    # GET #
    #######
    if request.method == 'GET':

        context = {'form_project_edit': ProjectForm(fields=project_fields, initial=project.value),
                   'project': project}
        return render(request, 'ids_projects/projects/create.html', context)

    ########
    # POST #
    ########
    elif request.method == 'POST':

        form = ProjectForm(project_fields, request.POST)

        if form.is_valid():

            try:
                project.value.update(form.cleaned_data)
                project.save()

                messages.info(request, 'Project successfully edited.')
                return HttpResponseRedirect(
                            reverse('ids_projects:project-view',
                                    kwargs={ 'project_uuid': project.uuid }))
            except Exception as e:
                exception_msg = 'Unable to create new project. %s' % e
                logger.error(exception_msg)
                messages.error(request, exception_msg)
                return HttpResponseRedirect(
                            reverse('ids_projects:project-view',
                                    kwargs={ 'project_uuid': project.uuid }))
def create(request):
    """Create a new project"""
    api_client = request.user.agave_oauth.api_client

    try:
        project_fields = get_project_form_fields()
    except Exception as e:
        exception_msg = 'Unable to load config values, cannot create project. %s' % e
        logger.error(exception_msg)
        messages.warning(request, exception_msg)
        return HttpResponseRedirect(
                    reverse('ids_projects:project-list-private'))

    #######
    # GET #
    #######
    if request.method == 'GET':

        context = {'form_project_create': ProjectForm(project_fields), 'project': None}
        return render(request, 'ids_projects/projects/create.html', context)

    ########
    # POST #
    ########
    elif request.method == 'POST':

        form = ProjectForm(project_fields, request.POST)

        if form.is_valid():

            body = form.cleaned_data
            user_full = request.user.get_full_name()
            body.update({'creator': user_full})

            try:
                project = Project(api_client=api_client, value=body)
                project.save()

                messages.info(request, 'New project created.')
                return HttpResponseRedirect(
                            reverse('ids_projects:project-view',
                                    kwargs={'project_uuid': project.uuid}))
            except Exception as e:
                exception_msg = 'Unable to create new project. %s' % e
                logger.error(exception_msg)
                messages.error(request, exception_msg)
                return HttpResponseRedirect('/projects/')