Ejemplo n.º 1
0
def share(request, experiment_id):
    '''
    Choose access rights and licence.
    '''
    experiment = Experiment.objects.get(id=experiment_id)
    user = request.user

    c = {}

    c['has_write_permissions'] = \
        authz.has_write_permissions(request, experiment_id)
    c['has_download_permissions'] = \
        authz.has_experiment_download_access(request, experiment_id)
    if user.is_authenticated():
        c['is_owner'] = authz.has_experiment_ownership(request, experiment_id)
        c['is_superuser'] = user.is_superuser
        c['is_staff'] = user.is_staff

    domain = Site.objects.get_current().domain
    public_link = experiment.public_access >= Experiment.PUBLIC_ACCESS_METADATA

    c['experiment'] = experiment
    c['public_link'] = public_link
    c['domain'] = domain

    return HttpResponse(render_response_index(request,
                        'tardis_portal/ajax/share.html', c))
Ejemplo n.º 2
0
 def update_detail(self, object_list, bundle):
     if not bundle.request.user.is_authenticated():
         return False
     if type(bundle.obj) == Experiment:
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment') and \
             has_write_permissions(bundle.request, bundle.obj.id)
     elif type(bundle.obj) == ExperimentParameterSet:
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment')  # and \
     #      has_write_permissions(bundle.request, bundle.obj.experiment.id)
     elif type(bundle.obj) == ExperimentParameter:
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment')
     elif type(bundle.obj) == Dataset:
         return False
     elif type(bundle.obj) == DatasetParameterSet:
         return False
     elif type(bundle.obj) == DatasetParameter:
         return False
     elif type(bundle.obj) == Dataset_File:
         return False
     elif type(bundle.obj) == DatafileParameterSet:
         return False
     elif type(bundle.obj) == DatafileParameter:
         return False
     elif type(bundle.obj) == Schema:
         return False
     raise NotImplementedError(type(bundle.obj))
Ejemplo n.º 3
0
def share(request, experiment_id):
    '''
    Choose access rights and licence.
    '''
    experiment = Experiment.objects.get(id=experiment_id)
    user = request.user

    c = {}

    c['has_write_permissions'] = \
        authz.has_write_permissions(request, experiment_id)
    c['has_download_permissions'] = \
        authz.has_experiment_download_access(request, experiment_id)
    if user.is_authenticated():
        c['is_owner'] = authz.has_experiment_ownership(request, experiment_id)
        c['is_superuser'] = user.is_superuser
        c['is_staff'] = user.is_staff

    domain = Site.objects.get_current().domain
    public_link = experiment.public_access >= Experiment.PUBLIC_ACCESS_METADATA

    c['experiment'] = experiment
    c['public_link'] = public_link
    c['domain'] = domain

    return HttpResponse(render_response_index(request,
                        'tardis_portal/ajax/share.html', c))
Ejemplo n.º 4
0
def experiment_description(request, experiment_id):
    """View an existing experiment's description. To be loaded via ajax.

    :param request: a HTTP Request instance
    :type request: :class:`django.http.HttpRequest`
    :param experiment_id: the ID of the experiment to be edited
    :type experiment_id: string
    :rtype: :class:`django.http.HttpResponse`

    """
    c = {}

    try:
        experiment = Experiment.safe.get(request.user, experiment_id)
    except PermissionDenied:
        return return_response_error(request)
    except Experiment.DoesNotExist:
        return return_response_not_found(request)

    c['experiment'] = experiment
    c['subtitle'] = experiment.title
    c['nav'] = [{
        'name': 'Data',
        'link': '/experiment/view/'
    }, {
        'name': experiment.title,
        'link': experiment.get_absolute_url()
    }]

    c['authors'] = experiment.experimentauthor_set.all()

    c['datafiles'] = \
        DataFile.objects.filter(dataset__experiments=experiment_id)

    c['owners'] = experiment.get_owners()

    # calculate the sum of the datafile sizes
    c['size'] = DataFile.sum_sizes(c['datafiles'])

    c['has_download_permissions'] = \
        authz.has_experiment_download_access(request, experiment_id)

    c['has_write_permissions'] = \
        authz.has_write_permissions(request, experiment_id)

    if request.user.is_authenticated():
        c['is_owner'] = authz.has_experiment_ownership(request, experiment_id)

    _add_protocols_and_organizations(request, experiment, c)

    if 'status' in request.GET:
        c['status'] = request.GET['status']
    if 'error' in request.GET:
        c['error'] = request.GET['error']

    return HttpResponse(
        render_response_index(
            request, 'tardis_portal/ajax/experiment_description.html', c))
Ejemplo n.º 5
0
def add_experiment_par(request, experiment_id):
    parentObject = Experiment.objects.get(id=experiment_id)
    if authz.has_write_permissions(request, parentObject.id):
        return add_par(request,
                       parentObject,
                       otype="experiment",
                       stype=Schema.EXPERIMENT)
    else:
        return return_response_error(request)
Ejemplo n.º 6
0
def retrieve_datasets(request, sample_id):
    datasetwrappers = DatasetWrapper.objects.filter(sample=sample_id).order_by('pk')
    datasets = [wrapper.dataset for wrapper in datasetwrappers]
    sample = Sample.objects.get(pk=sample_id)
    has_write_permissions = \
        authz.has_write_permissions(request, sample.experiment.id)
            
    c = Context({'datasets' : datasets, 'has_write_permissions' : has_write_permissions})
    return HttpResponse(render_response_index(request,
                        'tardis_portal/ajax/dataset.html', c))
Ejemplo n.º 7
0
    def delete_detail(self, object_list, bundle):
        if isinstance(bundle.obj, ObjectACL):
            # must be allowed to delete ObjectACLs and change the associated
            # Experiment to be able to delete the ObjectACL
            return bundle.request.user.has_perm(
                'tardis_portal.delete_objectacl') and \
                   has_write_permissions(bundle.request,
                                          bundle.obj.object_id)

        return super(tardis.tardis_portal.api.ACLAuthorization,
                     self).delete_detail(object_list, bundle)
Ejemplo n.º 8
0
    def delete_detail(self, object_list, bundle):
        if isinstance(bundle.obj, ObjectACL):
            # must be allowed to delete ObjectACLs and change the associated
            # Experiment to be able to delete the ObjectACL
            return bundle.request.user.has_perm(
                'tardis_portal.delete_objectacl') and \
                   has_write_permissions(bundle.request,
                                          bundle.obj.object_id)

        return super(tardis_api.ACLAuthorization,
                     self).delete_detail(object_list, bundle)
Ejemplo n.º 9
0
def experiment_description(request, experiment_id):
    """View an existing experiment's description. To be loaded via ajax.

    :param request: a HTTP Request instance
    :type request: :class:`django.http.HttpRequest`
    :param experiment_id: the ID of the experiment to be edited
    :type experiment_id: string
    :rtype: :class:`django.http.HttpResponse`

    """
    c = {}

    try:
        experiment = Experiment.safe.get(request.user, experiment_id)
    except PermissionDenied:
        return return_response_error(request)
    except Experiment.DoesNotExist:
        return return_response_not_found(request)

    c['experiment'] = experiment
    c['subtitle'] = experiment.title
    c['nav'] = [{'name': 'Data', 'link': '/experiment/view/'},
                {'name': experiment.title,
                 'link': experiment.get_absolute_url()}]

    c['authors'] = experiment.experimentauthor_set.all()

    c['datafiles'] = \
        DataFile.objects.filter(dataset__experiments=experiment_id)

    c['owners'] = experiment.get_owners()

    # calculate the sum of the datafile sizes
    c['size'] = DataFile.sum_sizes(c['datafiles'])

    c['has_download_permissions'] = \
        authz.has_experiment_download_access(request, experiment_id)

    c['has_write_permissions'] = \
        authz.has_write_permissions(request, experiment_id)

    if request.user.is_authenticated():
        c['is_owner'] = authz.has_experiment_ownership(request, experiment_id)

    _add_protocols_and_organizations(request, experiment, c)

    if 'status' in request.GET:
        c['status'] = request.GET['status']
    if 'error' in request.GET:
        c['error'] = request.GET['error']

    return HttpResponse(render_response_index(request,
                        'tardis_portal/ajax/experiment_description.html', c))
Ejemplo n.º 10
0
def retrieve_experiment_metadata(request, experiment_id):
    experiment = Experiment.objects.get(pk=experiment_id)
    has_write_permissions = \
        authz.has_write_permissions(request, experiment_id)
    parametersets = experiment.experimentparameterset_set\
                              .exclude(schema__hidden=True)

    c = {'experiment': experiment,
         'parametersets': parametersets,
         'has_write_permissions': has_write_permissions}
    return HttpResponse(render_response_index(request,
                        'tardis_portal/ajax/experiment_metadata.html', c))
Ejemplo n.º 11
0
def index(request, experiment_id):
    template = 'related_info/index.html'
    c = Context()
    if request.user.is_authenticated():
        c['has_write_permissions'] = authz.has_write_permissions(request, experiment_id)

    rih = RelatedInfoHandler(experiment_id)
    c['related_info_list'] = rih.info_list()
    c['experiment_id'] = int(experiment_id)
    c['other_info'] = ExperimentParameter.objects.filter(name__schema__namespace=auxiliary_schema_namespace, parameterset__experiment=experiment_id)

    return HttpResponse(render_response_index(request, template, c))
Ejemplo n.º 12
0
def _create_related_info(request, experiment_id):
    if not authz.has_write_permissions(request, experiment_id):
        return return_response_error(request)
    form = RelatedInfoForm(json.loads(request.body))
    if not form.is_valid():
        return HttpResponse('', status=400)
    ps = ExperimentParameterSet(experiment_id=experiment_id,
                                schema=_get_schema())
    ps.save()
    ParameterSetManager(ps).set_params_from_dict(form.cleaned_data)
    return HttpResponse(json.dumps(_get_dict_from_ps(ps)),
                        content_type='application/json; charset=utf-8',
                        status=201)
Ejemplo n.º 13
0
def _create_related_info(request, experiment_id):
    if not authz.has_write_permissions(request, experiment_id):
        return return_response_error(request)
    form = RelatedInfoForm(json.loads(request.body))
    if not form.is_valid():
        return HttpResponse('', status=400)
    ps = ExperimentParameterSet(experiment_id=experiment_id,
                                schema=_get_schema())
    ps.save()
    ParameterSetManager(ps).set_params_from_dict(form.cleaned_data)
    return HttpResponse(json.dumps(_get_dict_from_ps(ps)),
                        content_type='application/json; charset=utf-8',
                        status=201)
Ejemplo n.º 14
0
def _delete_related_info(request, experiment_id, related_info_id):
    if not authz.has_write_permissions(request, experiment_id):
        return return_response_error(request)

    try:
        ps = ExperimentParameterSet.objects.get(experiment_id=experiment_id,
                                                id=related_info_id)
    except ExperimentParameterSet.DoesNotExist:
        return HttpResponse('', status=404)
    obj = _get_dict_from_ps(ps)
    ps.delete()
    return HttpResponse(json.dumps(obj),
                        content_type='application/json; charset=utf-8')
Ejemplo n.º 15
0
def _delete_related_info(request, experiment_id, related_info_id):
    if not authz.has_write_permissions(request, experiment_id):
        return return_response_error(request)

    try:
        ps = ExperimentParameterSet.objects.get(experiment_id=experiment_id,
                                                id=related_info_id)
    except ExperimentParameterSet.DoesNotExist:
        return HttpResponse('', status=404)
    obj = _get_dict_from_ps(ps)
    ps.delete()
    return HttpResponse(json.dumps(obj),
                        content_type='application/json; charset=utf-8')
Ejemplo n.º 16
0
def index(request, experiment_id):
    try:
        experiment = Experiment.safe.get(request, experiment_id)
    except PermissionDenied:
        return return_response_error(request)
    except Experiment.DoesNotExist:
        return return_response_not_found(request)

    c = Context({'experiment': experiment})

    if authz.has_write_permissions(request, experiment_id):
        template = 'related_info/index.html'
    else:
        template = 'related_info/index_ro.html'
    return HttpResponse(render_response_index(request, template, c))
Ejemplo n.º 17
0
def index(request, experiment_id):
    try:
        experiment = Experiment.safe.get(request.user, experiment_id)
    except PermissionDenied:
        return return_response_error(request)
    except Experiment.DoesNotExist:
        return return_response_not_found(request)

    c = {'experiment': experiment}

    if authz.has_write_permissions(request, experiment_id):
        template = 'related_info/index.html'
    else:
        template = 'related_info/index_ro.html'
    return HttpResponse(render_response_index(request, template, c))
Ejemplo n.º 18
0
def retrieve_experiment_metadata(request, experiment_id):
    experiment = Experiment.objects.get(pk=experiment_id)
    has_write_permissions = \
        authz.has_write_permissions(request, experiment_id)
    parametersets = experiment.experimentparameterset_set\
                              .exclude(schema__hidden=True)

    c = {
        'experiment': experiment,
        'parametersets': parametersets,
        'has_write_permissions': has_write_permissions
    }
    return HttpResponse(
        render_response_index(request,
                              'tardis_portal/ajax/experiment_metadata.html',
                              c))
Ejemplo n.º 19
0
def index(request, experiment_id):
    try:
        experiment = Experiment.safe.get(request.user, experiment_id)
    except PermissionDenied:
        return return_response_error(request)
    except Experiment.DoesNotExist:
        return return_response_not_found(request)

    c = {'experiment': experiment,
         'for_code_json': json.dumps(_get_for_codes(),
                                     sort_keys=True)}

    if authz.has_write_permissions(request, experiment_id):
        template = 'anzsrc_codes/index.html'
    else:
        template = 'anzsrc_codes/index_ro.html'
    return HttpResponse(render_response_index(request, template, c))
Ejemplo n.º 20
0
def _update_related_info(request, experiment_id, related_info_id):
    if not authz.has_write_permissions(request, experiment_id):
        return return_response_error(request)

    form = RelatedInfoForm(json.loads(request.body))
    if not form.is_valid():
        return HttpResponse('', status=400)

    try:
        ps = ExperimentParameterSet.objects.get(experiment_id=experiment_id,
                                                id=related_info_id)
    except ExperimentParameterSet.DoesNotExist:
        return HttpResponse('', status=404)

    ParameterSetManager(ps).set_params_from_dict(form.cleaned_data)
    return HttpResponse(json.dumps(_get_dict_from_ps(ps)),
                        content_type='application/json; charset=utf-8',
                        status=201)
Ejemplo n.º 21
0
def _update_related_info(request, experiment_id, related_info_id):
    if not authz.has_write_permissions(request, experiment_id):
        return return_response_error(request)

    form = RelatedInfoForm(json.loads(request.body))
    if not form.is_valid():
        return HttpResponse('', status=400)

    try:
        ps = ExperimentParameterSet.objects.get(experiment_id=experiment_id,
                                                id=related_info_id)
    except ExperimentParameterSet.DoesNotExist:
        return HttpResponse('', status=404)

    ParameterSetManager(ps).set_params_from_dict(form.cleaned_data)
    return HttpResponse(json.dumps(_get_dict_from_ps(ps)),
                        content_type='application/json; charset=utf-8',
                        status=201)
Ejemplo n.º 22
0
def index(request, experiment_id):
    try:
        experiment = Experiment.safe.get(request, experiment_id)
    except PermissionDenied:
        return return_response_error(request)
    except Experiment.DoesNotExist:
        return return_response_not_found(request)

    c = Context({
        'experiment': experiment,
        'for_code_json': json.dumps(_get_for_codes(), sort_keys=True)
    })

    if authz.has_write_permissions(request, experiment_id):
        template = 'anzsrc_codes/index.html'
    else:
        template = 'anzsrc_codes/index_ro.html'
    return HttpResponse(render_response_index(request, template, c))
Ejemplo n.º 23
0
 def update_detail(self, object_list, bundle):  # noqa # too complex
     if not bundle.request.user.is_authenticated():
         return False
     if isinstance(bundle.obj, Experiment):
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment') and \
             has_write_permissions(bundle.request, bundle.obj.id)
     elif isinstance(bundle.obj, ExperimentParameterSet):
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment')  # and \
     #      has_write_permissions(bundle.request, bundle.obj.experiment.id)
     elif isinstance(bundle.obj, ExperimentParameter):
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment')
     elif isinstance(bundle.obj, Dataset):
         return False
     elif isinstance(bundle.obj, DatasetParameterSet):
         return False
     elif isinstance(bundle.obj, DatasetParameter):
         return False
     elif isinstance(bundle.obj, DataFile):
         return bundle.request.user.has_perm(
             'tardis_portal.change_datafile')
     elif isinstance(bundle.obj, DatafileParameterSet):
         return False
     elif isinstance(bundle.obj, DatafileParameter):
         return False
     elif isinstance(bundle.obj, Schema):
         return False
     elif isinstance(bundle.obj, Group):
         return False
     elif isinstance(bundle.obj, Facility):
         return False
     elif isinstance(bundle.obj, Instrument):
         facilities = facilities_managed_by(bundle.request.user)
         return bundle.obj.facility in facilities and \
             bundle.request.user.has_perm('tardis_portal.change_instrument')
     raise NotImplementedError(type(bundle.obj))
Ejemplo n.º 24
0
 def update_detail(self, object_list, bundle):  # noqa # too complex
     if not bundle.request.user.is_authenticated():
         return False
     if isinstance(bundle.obj, Experiment):
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment') and \
             has_write_permissions(bundle.request, bundle.obj.id)
     elif isinstance(bundle.obj, ExperimentParameterSet):
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment')  # and \
     #      has_write_permissions(bundle.request, bundle.obj.experiment.id)
     elif isinstance(bundle.obj, ExperimentParameter):
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment')
     elif isinstance(bundle.obj, Dataset):
         return False
     elif isinstance(bundle.obj, DatasetParameterSet):
         return False
     elif isinstance(bundle.obj, DatasetParameter):
         return False
     elif isinstance(bundle.obj, DataFile):
         return bundle.request.user.has_perm('tardis_portal.change_datafile')
     elif isinstance(bundle.obj, DatafileParameterSet):
         return False
     elif isinstance(bundle.obj, DatafileParameter):
         return False
     elif isinstance(bundle.obj, Schema):
         return False
     elif isinstance(bundle.obj, Group):
         return False
     elif isinstance(bundle.obj, Facility):
         return False
     elif isinstance(bundle.obj, Instrument):
         facilities = facilities_managed_by(bundle.request.user)
         return bundle.obj.facility in facilities and \
             bundle.request.user.has_perm('tardis_portal.change_instrument')
     raise NotImplementedError(type(bundle.obj))
Ejemplo n.º 25
0
def retrieve_datafile_list(request, dataset_id, template_name='tardis_portal/ajax/datafile_list.html'):

    params = {}

    query = None
    highlighted_dsf_pks = []

    if 'query' in request.GET:
        search_query = FacetFixedSearchQuery(backend=HighlightSearchBackend())
        sqs = SearchQuerySet(query=search_query)
        query =  SearchQueryString(request.GET['query'])
        results = sqs.raw_search(query.query_string() + ' AND dataset_id_stored:%i' % (int(dataset_id))).load_all()
        highlighted_dsf_pks = [int(r.pk) for r in results if r.model_name == 'dataset_file' and r.dataset_id_stored == int(dataset_id)]

        params['query'] = query.query_string()

    elif 'datafileResults' in request.session and 'search' in request.GET:
        highlighted_dsf_pks = [r.pk for r in request.session['datafileResults']]

    dataset_results = \
        Dataset_File.objects.filter(
            dataset__pk=dataset_id,
        ).order_by('filename')
        
# microtardis change start
    if 'session_show_hidden' not in request.session:
        request.session['session_show_hidden'] = False
    if 'session_hidden_text' not in request.session:
        request.session['session_hidden_text'] = "Show Hidden Datasets and Files"
        
    if not request.session['session_show_hidden']:
        # hide hidden objects
        hidden_datafiles = Datafile_Hidden.objects.filter(hidden=True).values_list('datafile', flat=True)
        dataset_results = dataset_results.exclude(pk__in=hidden_datafiles)
# microtardis change end

    if request.GET.get('limit', False) and len(highlighted_dsf_pks):
        dataset_results = \
        dataset_results.filter(pk__in=highlighted_dsf_pks)
        params['limit'] = request.GET['limit']

    filename_search = None

    if 'filename' in request.GET and len(request.GET['filename']):
        filename_search = request.GET['filename']
        dataset_results = \
            dataset_results.filter(url__icontains=filename_search)

        params['filename'] = filename_search

    # pagination was removed by someone in the interface but not here.
    # need to fix.
    pgresults = 100

    paginator = Paginator(dataset_results, pgresults)

    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    # If page request (9999) is out of range, deliver last page of results.

    try:
        dataset = paginator.page(page)
    except (EmptyPage, InvalidPage):
        dataset = paginator.page(paginator.num_pages)

    is_owner = False
    has_write_permissions = False

    if request.user.is_authenticated():
        experiment_id = Experiment.objects.get(dataset__id=dataset_id).id
        is_owner = authz.has_experiment_ownership(request, experiment_id)

        has_write_permissions = \
            authz.has_write_permissions(request, experiment_id)

    immutable = Dataset.objects.get(id=dataset_id).immutable

    params = urlencode(params)

    c = Context({
        'dataset': dataset,
        'paginator': paginator,
        'immutable': immutable,
        'dataset_id': dataset_id,
        'filename_search': filename_search,
        'is_owner': is_owner,
        'highlighted_dataset_files': highlighted_dsf_pks,
        'has_write_permissions': has_write_permissions,
        'search_query' : query,
        'params' : params

        })

# microtardis change start
    if request.session['session_show_hidden']:
        # show all objects
        # highlight hidden objects
        hidden_datafiles = Datafile_Hidden.objects.filter(hidden=True).values_list('datafile', flat=True)
        objects = Dataset_File.objects.filter(dataset__pk=dataset_id, pk__in=hidden_datafiles)
        c['linethrough_dataset_files'] = [ obj.pk for obj in objects ]
# microtardis change end

    return HttpResponse(render_response_index(request, template_name, c))
Ejemplo n.º 26
0
def experiment_datasets(request, experiment_id):

    """View a listing of dataset of an existing experiment as ajax loaded tab.

    :param request: a HTTP Request instance
    :type request: :class:`django.http.HttpRequest`
    :param experiment_id: the ID of the experiment to be edited
    :type experiment_id: string
    :param template_name: the path of the template to render
    :type template_name: string
    :rtype: :class:`django.http.HttpResponse`

    """
    c = Context({'upload_complete_url':
                     reverse('tardis.tardis_portal.views.upload_complete'),
                 'searchDatafileSelectionForm':
                     getNewSearchDatafileSelectionForm(),
                 })

    try:
        experiment = Experiment.safe.get(request, experiment_id)
    except PermissionDenied:
        return return_response_error(request)
    except Experiment.DoesNotExist:
        return return_response_not_found(request)

    c['experiment'] = experiment
    if 'query' in request.GET:

        # We've been passed a query to get back highlighted results.
        # Only pass back matching datafiles
        #
        search_query = FacetFixedSearchQuery(backend=HighlightSearchBackend())
        sqs = SearchQuerySet(query=search_query)
        query = SearchQueryString(request.GET['query'])
        facet_counts = sqs.raw_search(query.query_string() + ' AND experiment_id_stored:%i' % (int(experiment_id)), end_offset=1).facet('dataset_id_stored').highlight().facet_counts()
        if facet_counts:
            dataset_id_facets = facet_counts['fields']['dataset_id_stored']
        else:
            dataset_id_facets = []

        c['highlighted_datasets'] = [ int(f[0]) for f in dataset_id_facets ]
        c['file_matched_datasets'] = []
        c['search_query'] = query

        # replace '+'s with spaces
    elif 'datafileResults' in request.session and 'search' in request.GET:
        c['highlighted_datasets'] = None
        c['highlighted_dataset_files'] = [r.pk for r in request.session['datafileResults']]
        c['file_matched_datasets'] = \
            list(set(r.dataset.pk for r in request.session['datafileResults']))
        c['search'] = True

    else:
        c['highlighted_datasets'] = None
        c['highlighted_dataset_files'] = None
        c['file_matched_datasets'] = None

# microtardis change start
    if 'session_show_hidden' not in request.session:
        request.session['session_show_hidden'] = False
    if 'session_hidden_text' not in request.session:
        request.session['session_hidden_text'] = "Show Hidden Datasets and Files"
        
    if not request.session['session_show_hidden']:
        # hide hidden objects
        hidden_datasets = Dataset_Hidden.objects.filter(hidden=True).values_list('dataset', flat=True)
        c['datasets'] = Dataset.objects.filter(experiment=experiment_id).exclude(pk__in=hidden_datasets)
        hidden_datafiles = Datafile_Hidden.objects.filter(hidden=True).values_list('datafile', flat=True)
        datafiles = {}
        for dataset in c['datasets']:
            datafiles[dataset] = Dataset_File.objects.filter(dataset=dataset.id).exclude(pk__in=hidden_datafiles).count()
        c['datafiles'] = datafiles
    else:
        # show all objects
        c['datasets'] = Dataset.objects.filter(experiment=experiment_id)
        datafiles = {}
        for dataset in c['datasets']:
            datafiles[dataset] = Dataset_File.objects.filter(dataset=dataset.id).count()
        c['datafiles'] = datafiles
        # highlight hidden datasets
        hidden_datasets = Dataset_Hidden.objects.filter(hidden=True).values_list('dataset', flat=True)
        dataset_objects = Dataset.objects.filter(experiment=experiment_id, pk__in=hidden_datasets)
        c['linethrough_datasets'] = [ obj.pk for obj in dataset_objects ]
        # highlight datasets which have hidden datafiles
        hidden_datafiles = Datafile_Hidden.objects.filter(hidden=True).values_list('datafile', flat=True)
        experiment_dataset_objects = Dataset.objects.filter(experiment=experiment_id)
        hidden_datafiles_objects = Dataset_File.objects.filter(pk__in=hidden_datafiles, dataset__in=experiment_dataset_objects)
        c['file_hidden_datasets'] = list(set(obj.dataset.pk for obj in hidden_datafiles_objects))
# microtardis change end

    c['has_write_permissions'] = \
        authz.has_write_permissions(request, experiment_id)

    c['protocol'] = []
    download_urls = experiment.get_download_urls()
    for key, value in download_urls.iteritems():
        c['protocol'] += [[key, value]]

    if 'status' in request.GET:
        c['status'] = request.GET['status']
    if 'error' in request.GET:
        c['error'] = request.GET['error']

    return HttpResponse(render_response_index(request,
                        'tardis_portal/ajax/experiment_datasets.html', c))
Ejemplo n.º 27
0
def experiment_description(request, experiment_id):
    """View an existing experiment's description. To be loaded via ajax.

    :param request: a HTTP Request instance
    :type request: :class:`django.http.HttpRequest`
    :param experiment_id: the ID of the experiment to be edited
    :type experiment_id: string
    :rtype: :class:`django.http.HttpResponse`

    """
    c = Context({})

    try:
        experiment = Experiment.safe.get(request, experiment_id)
    except PermissionDenied:
        return return_response_error(request)
    except Experiment.DoesNotExist:
        return return_response_not_found(request)

    c['experiment'] = experiment
    c['subtitle'] = experiment.title
    c['nav'] = [{'name': 'Data', 'link': '/experiment/view/'},
                {'name': experiment.title,
                 'link': experiment.get_absolute_url()}]

    c['authors'] = experiment.author_experiment_set.all()

# microtardis change start
    if 'session_show_hidden' not in request.session:
        request.session['session_show_hidden'] = False
    if 'session_hidden_text' not in request.session:
        request.session['session_hidden_text'] = "Show Hidden Datasets and Files"
        
    if not request.session['session_show_hidden']:
        # hide hidden objects
        hidden_datasets = Dataset_Hidden.objects.filter(hidden=True).values_list('dataset', flat=True)
        c['datasets'] = Dataset.objects.filter(experiment=experiment_id).exclude(pk__in=hidden_datasets)
        hidden_datafiles = Datafile_Hidden.objects.filter(hidden=True).values_list('datafile', flat=True)
        c['datafiles'] = Dataset_File.objects.filter(dataset__experiment=experiment_id).exclude(pk__in=hidden_datafiles)
    else:
        # show all objects
        c['datasets'] = Dataset.objects.filter(experiment=experiment_id)
        c['datafiles'] = Dataset_File.objects.filter(dataset__experiment=experiment_id)
# microtardis change end

    acl = ExperimentACL.objects.filter(pluginId=django_user,
                                       experiment=experiment,
                                       isOwner=True)

    # TODO: resolve usernames through UserProvider!
    # Right now there are exceptions every time for ldap users..
    c['owners'] = []
    for a in acl:
        try:
            c['owners'].append(User.objects.get(pk=str(a.entityId)))
        except User.DoesNotExist:
            #logger.exception('user for acl %i does not exist' % a.id)
            pass

    # calculate the sum of the datafile sizes
    size = 0
    for df in c['datafiles']:
        try:
            size = size + long(df.size)
        except:
            pass
    c['size'] = size

    c['has_read_or_owner_ACL'] = \
        authz.has_read_or_owner_ACL(request, experiment_id)

    c['has_write_permissions'] = \
        authz.has_write_permissions(request, experiment_id)

    if request.user.is_authenticated():
        c['is_owner'] = authz.has_experiment_ownership(request, experiment_id)

    c['protocol'] = []
    download_urls = experiment.get_download_urls()
    for key, value in download_urls.iteritems():
        c['protocol'] += [[key, value]]

    if 'status' in request.GET:
        c['status'] = request.GET['status']
    if 'error' in request.GET:
        c['error'] = request.GET['error']

    return HttpResponse(render_response_index(request,
                        'tardis_portal/ajax/experiment_description.html', c))
Ejemplo n.º 28
0
def view_experiment(request, experiment_id):

    """View an existing experiment.

    :param request: a HTTP Request instance
    :type request: :class:`django.http.HttpRequest`
    :param experiment_id: the ID of the experiment to be edited
    :type experiment_id: string
    :rtype: :class:`django.http.HttpResponse`

    """
    c = Context({})

    try:
        experiment = Experiment.safe.get(request, experiment_id)
    except PermissionDenied:
        return return_response_error(request)
    except Experiment.DoesNotExist:
        return return_response_not_found(request)

# microtardis change start
    if 'session_show_hidden' not in request.session:
        request.session['session_show_hidden'] = False
    if 'session_hidden_text' not in request.session:
        request.session['session_hidden_text'] = "Show Hidden Datasets and Files"
    
    if not request.session['session_show_hidden']:
        # hide hidden objects
        hidden_datasets = Dataset_Hidden.objects.filter(hidden=True).values_list('dataset', flat=True)
        c['datasets'] = Dataset.objects.filter(experiment=experiment_id).exclude(pk__in=hidden_datasets)
    else:
        # show all datasets
        c['datasets'] = Dataset.objects.filter(experiment=experiment_id)
# microtardis change end

    c['experiment'] = experiment
    c['has_write_permissions'] = \
        authz.has_write_permissions(request, experiment_id)
    if request.user.is_authenticated():
        c['is_owner'] = authz.has_experiment_ownership(request, experiment_id)
    c['subtitle'] = experiment.title
    c['nav'] = [{'name': 'Data', 'link': '/experiment/view/'},
                {'name': experiment.title,
                 'link': experiment.get_absolute_url()}]

    if 'status' in request.POST:
        c['status'] = request.POST['status']
    if 'error' in request.POST:
        c['error'] = request.POST['error']
    if 'query' in request.GET:
        c['search_query'] = SearchQueryString(request.GET['query'])
    if  'search' in request.GET:
        c['search'] = request.GET['search']
    if  'load' in request.GET:
        c['load'] = request.GET['load']

    import sys
    appnames = []
    appurls = []
    for app in getTardisApps():
        try:
            appnames.append(sys.modules['%s.%s.settings'
                                        % (settings.TARDIS_APP_ROOT, app)].NAME)
            appurls.append('%s.%s.views.index' % (settings.TARDIS_APP_ROOT, app))
        except:
            pass

    c['apps'] = zip(appurls, appnames)

    return HttpResponse(render_response_index(request,
                        'tardis_portal/view_experiment.html', c))
Ejemplo n.º 29
0
def experiment_samples(request, experiment_id):

    """View a listing of dataset of an existing experiment as ajax loaded tab.

    :param request: a HTTP Request instance
    :type request: :class:`django.http.HttpRequest`
    :param experiment_id: the ID of the experiment to be edited
    :type experiment_id: string
    :param template_name: the path of the template to render
    :type template_name: string
    :rtype: :class:`django.http.HttpResponse`

    """
    c = Context({'upload_complete_url':
                     reverse('tardis.tardis_portal.views.upload_complete'),
                 'searchDatafileSelectionForm':
                     getNewSearchDatafileSelectionForm(),
                 })

    try:
        experiment = Experiment.safe.get(request, experiment_id)
    except PermissionDenied:
        return return_response_error(request)
    except Experiment.DoesNotExist:
        return return_response_not_found(request)

    c['experiment'] = experiment
    if 'query' in request.GET:

        # We've been passed a query to get back highlighted results.
        # Only pass back matching datafiles
        #
        search_query = FacetFixedSearchQuery(backend=HighlightSearchBackend())
        sqs = SearchQuerySet(query=search_query)
        query = SearchQueryString(request.GET['query'])
        facet_counts = sqs.raw_search(query.query_string() + ' AND experiment_id_stored:%i' % (int(experiment_id)), end_offset=1).facet('dataset_id_stored').highlight().facet_counts()
        if facet_counts:
            dataset_id_facets = facet_counts['fields']['dataset_id_stored']
        else:
            dataset_id_facets = []

        c['highlighted_datasets'] = [ int(f[0]) for f in dataset_id_facets ]
        c['file_matched_datasets'] = []
        c['search_query'] = query

        # replace '+'s with spaces
    elif 'datafileResults' in request.session and 'search' in request.GET:
        c['highlighted_datasets'] = None
        c['highlighted_dataset_files'] = [r.pk for r in request.session['datafileResults']]
        c['file_matched_datasets'] = \
            list(set(r.dataset.pk for r in request.session['datafileResults']))
        c['search'] = True

    else:
        c['highlighted_datasets'] = None
        c['highlighted_dataset_files'] = None
        c['file_matched_datasets'] = None

    c['samples'] = \
         Sample.objects.filter(experiment=experiment_id).order_by("id")

    c['datasets'] = \
         Dataset.objects.filter(experiment=experiment_id)

    c['has_write_permissions'] = \
        authz.has_write_permissions(request, experiment_id)

    c['protocol'] = []
    download_urls = experiment.get_download_urls()
    for key, value in download_urls.iteritems():
        c['protocol'] += [[key, value]]

    if 'status' in request.GET:
        c['status'] = request.GET['status']
    if 'error' in request.GET:
        c['error'] = request.GET['error']
        
    return HttpResponse(render_response_index(request,
                        'tardis_portal/ajax/experiment_samples.html', c))
Ejemplo n.º 30
0
 def create_detail(self, object_list, bundle):  # noqa # too complex
     if not bundle.request.user.is_authenticated():
         return False
     if bundle.request.user.is_authenticated() and \
        bundle.request.user.is_superuser:
         return True
     if isinstance(bundle.obj, Experiment):
         return bundle.request.user.has_perm('tardis_portal.add_experiment')
     elif isinstance(bundle.obj, ExperimentParameterSet):
         if not bundle.request.user.has_perm(
                 'tardis_portal.change_experiment'):
             return False
         experiment_uri = bundle.data.get('experiment', None)
         if experiment_uri is not None:
             experiment = ExperimentResource.get_via_uri(
                 ExperimentResource(), experiment_uri, bundle.request)
             return has_write_permissions(bundle.request, experiment.id)
         elif getattr(bundle.obj.experiment, 'id', False):
             return has_write_permissions(bundle.request,
                                          bundle.obj.experiment.id)
         return False
     elif isinstance(bundle.obj, ExperimentParameter):
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment') and \
             has_write_permissions(bundle.request,
                                   bundle.obj.parameterset.experiment.id)
     elif isinstance(bundle.obj, Dataset):
         if not bundle.request.user.has_perm(
                 'tardis_portal.change_dataset'):
             return False
         perm = False
         for exp_uri in bundle.data.get('experiments', []):
             try:
                 this_exp = ExperimentResource.get_via_uri(
                     ExperimentResource(), exp_uri, bundle.request)
             except:
                 return False
             if has_write_permissions(bundle.request, this_exp.id):
                 perm = True
             else:
                 return False
         return perm
     elif isinstance(bundle.obj, DatasetParameterSet):
         if not bundle.request.user.has_perm(
                 'tardis_portal.change_dataset'):
             return False
         dataset_uri = bundle.data.get('dataset', None)
         if dataset_uri is not None:
             dataset = DatasetResource.get_via_uri(
                 DatasetResource(), dataset_uri, bundle.request)
             return has_dataset_write(bundle.request, dataset.id)
         elif getattr(bundle.obj.dataset, 'id', False):
             return has_dataset_write(bundle.request,
                                      bundle.obj.dataset.id)
         return False
     elif isinstance(bundle.obj, DatasetParameter):
         return bundle.request.user.has_perm(
             'tardis_portal.change_dataset') and \
             has_dataset_write(bundle.request,
                               bundle.obj.parameterset.dataset.id)
     elif isinstance(bundle.obj, DataFile):
         dataset = DatasetResource.get_via_uri(DatasetResource(),
                                               bundle.data['dataset'],
                                               bundle.request)
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_datafile'),
             has_dataset_write(bundle.request, dataset.id),
         ])
     elif isinstance(bundle.obj, DatafileParameterSet):
         dataset = Dataset.objects.get(
             pk=bundle.obj.datafile.dataset.id)
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_datafile'),
             has_dataset_write(bundle.request, dataset.id),
         ])
     elif isinstance(bundle.obj, DatafileParameter):
         dataset = Dataset.objects.get(
             pk=bundle.obj.parameterset.datafile.dataset.id)
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_datafile'),
             has_dataset_write(bundle.request, dataset.id),
         ])
     elif isinstance(bundle.obj, DataFileObject):
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_datafile'),
             has_dataset_write(bundle.request,
                               bundle.obj.datafile.dataset.id),
         ])
     elif isinstance(bundle.obj, ObjectACL):
         return bundle.request.user.has_perm('tardis_portal.add_objectacl')
     elif isinstance(bundle.obj, Group):
         return bundle.request.user.has_perm('tardis_portal.add_group')
     elif isinstance(bundle.obj, Facility):
         return bundle.request.user.has_perm('tardis_portal.add_facility')
     elif isinstance(bundle.obj, Instrument):
         facilities = facilities_managed_by(bundle.request.user)
         return all([
             bundle.request.user.has_perm('tardis_portal.add_instrument'),
             bundle.obj.facility in facilities
         ])
     raise NotImplementedError(type(bundle.obj))
Ejemplo n.º 31
0
def edit_experiment_par(request, parameterset_id):
    parameterset = ExperimentParameterSet.objects.get(id=parameterset_id)
    if authz.has_write_permissions(request, parameterset.experiment.id):
        return edit_parameters(request, parameterset, otype="experiment")
    return return_response_error(request)
Ejemplo n.º 32
0
 def create_detail(self, object_list, bundle):  # noqa # too complex
     if not bundle.request.user.is_authenticated():
         return False
     if bundle.request.user.is_authenticated() and \
        bundle.request.user.is_superuser:
         return True
     if isinstance(bundle.obj, Experiment):
         return bundle.request.user.has_perm('tardis_portal.add_experiment')
     elif isinstance(bundle.obj, ExperimentParameterSet):
         if not bundle.request.user.has_perm(
                 'tardis_portal.change_experiment'):
             return False
         experiment_uri = bundle.data.get('experiment', None)
         if experiment_uri is not None:
             experiment = ExperimentResource.get_via_uri(
                 ExperimentResource(), experiment_uri, bundle.request)
             return has_write_permissions(bundle.request, experiment.id)
         elif getattr(bundle.obj.experiment, 'id', False):
             return has_write_permissions(bundle.request,
                                          bundle.obj.experiment.id)
         return False
     elif isinstance(bundle.obj, ExperimentParameter):
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment') and \
             has_write_permissions(bundle.request,
                                   bundle.obj.parameterset.experiment.id)
     elif isinstance(bundle.obj, Dataset):
         if not bundle.request.user.has_perm(
                 'tardis_portal.change_dataset'):
             return False
         perm = False
         for exp_uri in bundle.data.get('experiments', []):
             try:
                 this_exp = ExperimentResource.get_via_uri(
                     ExperimentResource(), exp_uri, bundle.request)
             except:
                 return False
             if has_write_permissions(bundle.request, this_exp.id):
                 perm = True
             else:
                 return False
         return perm
     elif isinstance(bundle.obj, DatasetParameterSet):
         if not bundle.request.user.has_perm(
                 'tardis_portal.change_dataset'):
             return False
         dataset_uri = bundle.data.get('dataset', None)
         if dataset_uri is not None:
             dataset = DatasetResource.get_via_uri(DatasetResource(),
                                                   dataset_uri,
                                                   bundle.request)
             return has_dataset_write(bundle.request, dataset.id)
         elif getattr(bundle.obj.dataset, 'id', False):
             return has_dataset_write(bundle.request, bundle.obj.dataset.id)
         return False
     elif isinstance(bundle.obj, DatasetParameter):
         return bundle.request.user.has_perm(
             'tardis_portal.change_dataset') and \
             has_dataset_write(bundle.request,
                               bundle.obj.parameterset.dataset.id)
     elif isinstance(bundle.obj, DataFile):
         dataset = DatasetResource.get_via_uri(DatasetResource(),
                                               bundle.data['dataset'],
                                               bundle.request)
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_datafile'),
             has_dataset_write(bundle.request, dataset.id),
         ])
     elif isinstance(bundle.obj, DatafileParameterSet):
         dataset = Dataset.objects.get(pk=bundle.obj.datafile.dataset.id)
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_datafile'),
             has_dataset_write(bundle.request, dataset.id),
         ])
     elif isinstance(bundle.obj, DatafileParameter):
         dataset = Dataset.objects.get(
             pk=bundle.obj.parameterset.datafile.dataset.id)
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_datafile'),
             has_dataset_write(bundle.request, dataset.id),
         ])
     elif isinstance(bundle.obj, DataFileObject):
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_datafile'),
             has_dataset_write(bundle.request,
                               bundle.obj.datafile.dataset.id),
         ])
     elif isinstance(bundle.obj, ObjectACL):
         return bundle.request.user.has_perm('tardis_portal.add_objectacl')
     elif isinstance(bundle.obj, Group):
         return bundle.request.user.has_perm('tardis_portal.add_group')
     elif isinstance(bundle.obj, Facility):
         return bundle.request.user.has_perm('tardis_portal.add_facility')
     elif isinstance(bundle.obj, Instrument):
         facilities = facilities_managed_by(bundle.request.user)
         return all([
             bundle.request.user.has_perm('tardis_portal.add_instrument'),
             bundle.obj.facility in facilities
         ])
     raise NotImplementedError(type(bundle.obj))
Ejemplo n.º 33
0
def add_experiment_par(request, experiment_id):
    parentObject = Experiment.objects.get(id=experiment_id)
    if authz.has_write_permissions(request, parentObject.id):
        return add_par(request, parentObject, otype="experiment",
                       stype=Schema.EXPERIMENT)
    return return_response_error(request)
Ejemplo n.º 34
0
    def get_context_data(self, request, experiment, **kwargs):
        """
        Prepares the values to be passed to the default experiment view,
        respecting authorization rules. Returns a dict of values (the context).

        :param request: a HTTP request object
        :type request: :class:`django.http.HttpRequest`
        :param experiment: the experiment model instance
        :type experiment: tardis.tardis_portal.models.experiment.Experiment
        :return: A dictionary of values for the view/template.
        :rtype: dict
        """

        c = super(ExperimentView, self).get_context_data(**kwargs)

        c['experiment'] = experiment
        c['has_write_permissions'] = \
            authz.has_write_permissions(request, experiment.id)
        c['has_download_permissions'] = \
            authz.has_experiment_download_access(request, experiment.id)
        if request.user.is_authenticated():
            c['is_owner'] = authz.has_experiment_ownership(request, experiment.id)
            c['has_read_or_owner_ACL'] = authz.has_read_or_owner_ACL(request,
                                                                     experiment.id)

        # Enables UI elements for the publication form
        c['pub_form_enabled'] = 'tardis.apps.publication_forms' in \
                                settings.INSTALLED_APPS

        # Enables UI elements for the push_to app
        c['push_to_enabled'] = PushToConfig.name in settings.INSTALLED_APPS
        if c['push_to_enabled']:
            push_to_args = {
                'experiment_id': experiment.pk
            }
            c['push_to_url'] = reverse(initiate_push_experiment,
                                       kwargs=push_to_args)

        c['subtitle'] = experiment.title
        c['nav'] = [{'name': 'Data', 'link': '/experiment/view/'},
                    {'name': experiment.title,
                     'link': experiment.get_absolute_url()}]

        if 'status' in request.POST:
            c['status'] = request.POST['status']
        if 'error' in request.POST:
            c['error'] = request.POST['error']
        if 'query' in request.GET:
            c['search_query'] = SearchQueryString(request.GET['query'])
        if 'search' in request.GET:
            c['search'] = request.GET['search']
        if 'load' in request.GET:
            c['load'] = request.GET['load']

        _add_protocols_and_organizations(request, experiment, c)

        default_apps = [
            {'name': 'Description',
             'viewfn': 'tardis.tardis_portal.views.experiment_description'},
            {'name': 'Metadata',
             'viewfn': 'tardis.tardis_portal.views.retrieve_experiment_metadata'},
            {'name': 'Sharing', 'viewfn': 'tardis.tardis_portal.views.share'},
            {'name': 'Transfer Datasets',
             'viewfn': 'tardis.tardis_portal.views.experiment_dataset_transfer'},
        ]
        appnames = []
        appurls = []

        for app in getattr(settings, 'EXPERIMENT_APPS', default_apps):
            try:
                appnames.append(app['name'])
                if 'viewfn' in app:
                    appurls.append(reverse(app['viewfn'], args=[experiment.id]))
                elif 'url' in app:
                    appurls.append(app['url'])
            except:
                logger.debug('error when loading default exp apps')

        from tardis.app_config import get_tardis_apps

        for app_name, app in get_tardis_apps():
            try:
                appnames.append(
                    sys.modules['%s.settings' % app].NAME)
                appurls.append(
                    reverse('%s.views.index' % app, args=[experiment.id]))
            except:
                logger.debug("No tab for %s" % app)

        c['apps'] = zip(appurls, appnames)

        return c
Ejemplo n.º 35
0
def edit_experiment_par(request, parameterset_id):
    parameterset = ExperimentParameterSet.objects.get(id=parameterset_id)
    if authz.has_write_permissions(request, parameterset.experiment.id):
        return edit_parameters(request, parameterset, otype="experiment")
    else:
        return return_response_error(request)
Ejemplo n.º 36
0
 def create_detail(self, object_list, bundle):
     if not bundle.request.user.is_authenticated():
         return False
     if bundle.request.user.is_authenticated() and \
        bundle.request.user.is_superuser:
         return True
     if type(bundle.obj) == Experiment:
         return bundle.request.user.has_perm('tardis_portal.add_experiment')
     elif type(bundle.obj) in (ExperimentParameterSet,):
         if not bundle.request.user.has_perm(
                 'tardis_portal.change_experiment'):
             return False
         experiment_uri = bundle.data.get('experiment', None)
         if experiment_uri is not None:
             experiment = ExperimentResource.get_via_uri(
                 ExperimentResource(), experiment_uri, bundle.request)
             return has_write_permissions(bundle.request, experiment.id)
         elif getattr(bundle.obj.experiment, 'id', False):
             return has_write_permissions(bundle.request,
                                          bundle.obj.experiment.id)
         return False
     elif type(bundle.obj) in (ExperimentParameter,):
         return bundle.request.user.has_perm(
             'tardis_portal.change_experiment') and \
             has_write_permissions(bundle.request,
                                   bundle.obj.parameterset.experiment.id)
     elif type(bundle.obj) == Dataset:
         if not bundle.request.user.has_perm(
                 'tardis_portal.change_dataset'):
             return False
         perm = False
         for exp_uri in bundle.data.get('experiments', []):
             try:
                 this_exp = ExperimentResource.get_via_uri(
                     ExperimentResource(), exp_uri, bundle.request)
             except:
                 return False
             if has_write_permissions(bundle.request, this_exp.id):
                 perm = True
             else:
                 return False
         return perm
     elif type(bundle.obj) in (DatasetParameterSet,):
         if not bundle.request.user.has_perm(
                 'tardis_portal.change_dataset'):
             return False
         dataset_uri = bundle.data.get('dataset', None)
         if dataset_uri is not None:
             dataset = DatasetResource.get_via_uri(
                 DatasetResource(), dataset_uri, bundle.request)
             return has_dataset_write(bundle.request, dataset.id)
         elif getattr(bundle.obj.dataset, 'id', False):
             return has_dataset_write(bundle.request,
                                      bundle.obj.dataset.id)
         return False
     elif type(bundle.obj) in (DatasetParameter,):
         return bundle.request.user.has_perm(
             'tardis_portal.change_dataset') and \
             has_dataset_write(bundle.request,
                               bundle.obj.parameterset.dataset.id)
     elif type(bundle.obj) == Dataset_File:
         dataset = DatasetResource.get_via_uri(DatasetResource(),
                                               bundle.data['dataset'],
                                               bundle.request)
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_dataset_file'),
             has_dataset_write(bundle.request, dataset.id),
         ])
     elif type(bundle.obj) == DatafileParameterSet:
         dataset = Dataset.objects.get(
             pk=bundle.obj.dataset_file.dataset.id)
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_dataset_file'),
             has_dataset_write(bundle.request, dataset.id),
         ])
     elif type(bundle.obj) == DatafileParameter:
         dataset = Dataset.objects.get(
             pk=bundle.obj.parameterset.dataset_file.dataset.id)
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_dataset_file'),
             has_dataset_write(bundle.request, dataset.id),
         ])
     elif type(bundle.obj) == Replica:
         return all([
             bundle.request.user.has_perm('tardis_portal.change_dataset'),
             bundle.request.user.has_perm('tardis_portal.add_dataset_file'),
             has_dataset_write(bundle.request,
                               bundle.obj.datafile.dataset.id),
         ])
     raise NotImplementedError(type(bundle.obj))
Ejemplo n.º 37
0
    def get_context_data(self, request, experiment, **kwargs):
        """
        Prepares the values to be passed to the default experiment view,
        respecting authorization rules. Returns a dict of values (the context).

        :param request: a HTTP request object
        :type request: :class:`django.http.HttpRequest`
        :param experiment: the experiment model instance
        :type experiment: tardis.tardis_portal.models.experiment.Experiment
        :return: A dictionary of values for the view/template.
        :rtype: dict
        """

        c = super(ExperimentView, self).get_context_data(**kwargs)

        c['experiment'] = experiment
        c['has_write_permissions'] = \
            authz.has_write_permissions(request, experiment.id)
        c['has_download_permissions'] = \
            authz.has_experiment_download_access(request, experiment.id)
        if request.user.is_authenticated():
            c['is_owner'] = authz.has_experiment_ownership(
                request, experiment.id)
            c['has_read_or_owner_ACL'] = authz.has_read_or_owner_ACL(
                request, experiment.id)

        # Enables UI elements for the publication form
        c['pub_form_enabled'] = 'tardis.apps.publication_forms' in \
                                settings.INSTALLED_APPS

        # Enables UI elements for the push_to app
        c['push_to_enabled'] = PushToConfig.name in settings.INSTALLED_APPS
        if c['push_to_enabled']:
            push_to_args = {'experiment_id': experiment.pk}
            c['push_to_url'] = reverse(initiate_push_experiment,
                                       kwargs=push_to_args)

        c['subtitle'] = experiment.title
        c['nav'] = [{
            'name': 'Data',
            'link': '/experiment/view/'
        }, {
            'name': experiment.title,
            'link': experiment.get_absolute_url()
        }]

        if 'status' in request.POST:
            c['status'] = request.POST['status']
        if 'error' in request.POST:
            c['error'] = request.POST['error']
        if 'query' in request.GET:
            c['search_query'] = SearchQueryString(request.GET['query'])
        if 'search' in request.GET:
            c['search'] = request.GET['search']
        if 'load' in request.GET:
            c['load'] = request.GET['load']

        _add_protocols_and_organizations(request, experiment, c)

        default_apps = [
            {
                'name': 'Description',
                'viewfn': 'tardis.tardis_portal.views.experiment_description'
            },
            {
                'name': 'Metadata',
                'viewfn':
                'tardis.tardis_portal.views.retrieve_experiment_metadata'
            },
            {
                'name': 'Sharing',
                'viewfn': 'tardis.tardis_portal.views.share'
            },
            {
                'name': 'Transfer Datasets',
                'viewfn':
                'tardis.tardis_portal.views.experiment_dataset_transfer'
            },
        ]
        appnames = []
        appurls = []

        for app in getattr(settings, 'EXPERIMENT_APPS', default_apps):
            try:
                appnames.append(app['name'])
                if 'viewfn' in app:
                    appurls.append(reverse(app['viewfn'],
                                           args=[experiment.id]))
                elif 'url' in app:
                    appurls.append(app['url'])
            except:
                logger.debug('error when loading default exp apps')

        from tardis.app_config import get_tardis_apps

        for app_name, app in get_tardis_apps():
            try:
                appnames.append(sys.modules['%s.settings' % app].NAME)
                appurls.append(
                    reverse('%s.views.index' % app, args=[experiment.id]))
            except:
                logger.debug("No tab for %s" % app)

        c['apps'] = zip(appurls, appnames)

        return c