Пример #1
0
 def read_list(self, object_list, bundle):  # noqa # too complex
     obj_ids = [obj.id for obj in object_list]
     if bundle.request.user.is_authenticated() and \
        bundle.request.user.is_superuser:
         return object_list
     if isinstance(bundle.obj, Experiment):
         experiments = Experiment.safe.all(bundle.request.user)
         return experiments.filter(id__in=obj_ids)
     elif isinstance(bundle.obj, ExperimentParameterSet):
         experiments = Experiment.safe.all(bundle.request.user)
         return ExperimentParameterSet.objects.filter(
             experiment__in=experiments, id__in=obj_ids)
     elif isinstance(bundle.obj, ExperimentParameter):
         experiments = Experiment.safe.all(bundle.request.user)
         return ExperimentParameter.objects.filter(
             parameterset__experiment__in=experiments,
             id__in=obj_ids
         )
     elif isinstance(bundle.obj, Dataset):
         dataset_ids = [ds.id for ds in object_list
                        if has_dataset_access(bundle.request, ds.id)]
         return Dataset.objects.filter(id__in=dataset_ids)
     elif isinstance(bundle.obj, DatasetParameterSet):
         return [dps for dps in object_list
                 if has_dataset_access(bundle.request, dps.dataset.id)]
     elif isinstance(bundle.obj, DatasetParameter):
         return [dp for dp in object_list
                 if has_dataset_access(bundle.request,
                                       dp.parameterset.dataset.id)]
     elif isinstance(bundle.obj, DataFile):
         all_files = get_accessible_datafiles_for_user(bundle.request)
         return all_files.filter(id__in=obj_ids)
     elif isinstance(bundle.obj, DatafileParameterSet):
         datafiles = get_accessible_datafiles_for_user(bundle.request)
         return DatafileParameterSet.objects.filter(
             datafile__in=datafiles, id__in=obj_ids
         )
     elif isinstance(bundle.obj, DatafileParameter):
         datafiles = get_accessible_datafiles_for_user(bundle.request)
         return DatafileParameter.objects.filter(
             parameterset__datafile__in=datafiles, id__in=obj_ids)
     elif isinstance(bundle.obj, Schema):
         return object_list
     elif isinstance(bundle.obj, ParameterName):
         return object_list
     elif isinstance(bundle.obj, ObjectACL):
         experiment_ids = Experiment.safe.all(
             bundle.request.user).values_list('id', flat=True)
         return ObjectACL.objects.filter(
             content_type__model='experiment',
             object_id__in=experiment_ids,
             id__in=obj_ids
         )
     elif bundle.request.user.is_authenticated() and \
             isinstance(bundle.obj, User):
         if len(facilities_managed_by(bundle.request.user)) > 0:
             return object_list
         else:
             return [user for user in object_list if
                     (user == bundle.request.user or
                      user.experiment_set.filter(public_access__gt=1)
                      .count() > 0)]
     elif isinstance(bundle.obj, Group):
         if facilities_managed_by(bundle.request.user).count() > 0:
             return object_list
         else:
             return bundle.request.user.groups.filter(id__in=obj_ids)
     elif isinstance(bundle.obj, Facility):
         facilities = facilities_managed_by(bundle.request.user)
         return [facility for facility in object_list
                 if facility in facilities]
     elif isinstance(bundle.obj, Instrument):
         facilities = facilities_managed_by(bundle.request.user)
         instruments = Instrument.objects.filter(facility__in=facilities)
         return [instrument for instrument in object_list
                 if instrument in instruments]
     elif isinstance(bundle.obj, StorageBox):
         return object_list
     elif isinstance(bundle.obj, StorageBoxOption):
         return [option for option in object_list
                 if option.key in StorageBoxOptionResource.accessible_keys]
     elif isinstance(bundle.obj, StorageBoxAttribute):
         return object_list
     else:
         return []
Пример #2
0
 def read_list(self, object_list, bundle):  # noqa # too complex
     obj_ids = [obj.id for obj in object_list]
     if bundle.request.user.is_authenticated() and \
        bundle.request.user.is_superuser:
         return object_list
     if isinstance(bundle.obj, Experiment):
         experiments = Experiment.safe.all(bundle.request.user)
         return experiments.filter(id__in=obj_ids)
     elif isinstance(bundle.obj, ExperimentParameterSet):
         experiments = Experiment.safe.all(bundle.request.user)
         return ExperimentParameterSet.objects.filter(
             experiment__in=experiments, id__in=obj_ids)
     elif isinstance(bundle.obj, ExperimentParameter):
         experiments = Experiment.safe.all(bundle.request.user)
         return ExperimentParameter.objects.filter(
             parameterset__experiment__in=experiments, id__in=obj_ids)
     elif isinstance(bundle.obj, Dataset):
         dataset_ids = [
             ds.id for ds in object_list
             if has_dataset_access(bundle.request, ds.id)
         ]
         return Dataset.objects.filter(id__in=dataset_ids)
     elif isinstance(bundle.obj, DatasetParameterSet):
         return [
             dps for dps in object_list
             if has_dataset_access(bundle.request, dps.dataset.id)
         ]
     elif isinstance(bundle.obj, DatasetParameter):
         return [
             dp for dp in object_list if has_dataset_access(
                 bundle.request, dp.parameterset.dataset.id)
         ]
     elif isinstance(bundle.obj, DataFile):
         all_files = get_accessible_datafiles_for_user(bundle.request)
         return all_files.filter(id__in=obj_ids)
     elif isinstance(bundle.obj, DatafileParameterSet):
         datafiles = get_accessible_datafiles_for_user(bundle.request)
         return DatafileParameterSet.objects.filter(datafile__in=datafiles,
                                                    id__in=obj_ids)
     elif isinstance(bundle.obj, DatafileParameter):
         datafiles = get_accessible_datafiles_for_user(bundle.request)
         return DatafileParameter.objects.filter(
             parameterset__datafile__in=datafiles, id__in=obj_ids)
     elif isinstance(bundle.obj, Schema):
         return object_list
     elif isinstance(bundle.obj, ParameterName):
         return object_list
     elif isinstance(bundle.obj, ObjectACL):
         experiment_ids = Experiment.safe.all(
             bundle.request.user).values_list('id', flat=True)
         return ObjectACL.objects.filter(content_type__model='experiment',
                                         object_id__in=experiment_ids,
                                         id__in=obj_ids)
     elif bundle.request.user.is_authenticated() and \
             isinstance(bundle.obj, User):
         if len(facilities_managed_by(bundle.request.user)) > 0:
             return object_list
         else:
             return [
                 user for user in object_list
                 if (user == bundle.request.user or user.experiment_set.
                     filter(public_access__gt=1).count() > 0)
             ]
     elif isinstance(bundle.obj, Group):
         if facilities_managed_by(bundle.request.user).count() > 0:
             return object_list
         else:
             return bundle.request.user.groups.filter(id__in=obj_ids)
     elif isinstance(bundle.obj, Facility):
         facilities = facilities_managed_by(bundle.request.user)
         return [
             facility for facility in object_list if facility in facilities
         ]
     elif isinstance(bundle.obj, Instrument):
         facilities = facilities_managed_by(bundle.request.user)
         instruments = Instrument.objects.filter(facility__in=facilities)
         return [
             instrument for instrument in object_list
             if instrument in instruments
         ]
     elif isinstance(bundle.obj, StorageBox):
         return object_list
     elif isinstance(bundle.obj, StorageBoxOption):
         return [
             option for option in object_list
             if option.key in StorageBoxOptionResource.accessible_keys
         ]
     elif isinstance(bundle.obj, StorageBoxAttribute):
         return object_list
     else:
         return []
Пример #3
0
def __getFilteredDatafiles(request, searchQueryType, searchFilterData):
    """Filter the list of datafiles for the provided searchQueryType using the
    cleaned up searchFilterData.

    Arguments:
    request -- the HTTP request
    searchQueryType -- the type of query, 'mx' or 'saxs'
    searchFilterData -- the cleaned up search form data

    Returns:
    A list of datafiles as a result of the query or None if the provided search
      request is invalid

    """

    datafile_results = authz.get_accessible_datafiles_for_user(request)
    logger.info('__getFilteredDatafiles: searchFilterData {0}'.
                format(searchFilterData))

    # there's no need to do any filtering if we didn't find any
    # datafiles that the user has access to
    if not datafile_results:
        logger.info("""__getFilteredDatafiles: user {0} doesn\'t have
                    access to any experiments""".format(request.user))
        return datafile_results

    q = {
        'datafileparameterset__datafileparameter__name__schema__namespace__in':
        Schema.getNamespaces(Schema.DATAFILE, searchQueryType)
    }
    datafile_results = datafile_results.filter(**q).distinct()

    # if filename is searchable which i think will always be the case...
    if searchFilterData['filename'] != '':
        datafile_results = \
            datafile_results.filter(
                filename__icontains=searchFilterData['filename'])
    # TODO: might need to cache the result of this later on

    # get all the datafile parameters for the given schema
    parameters = [p for p in
                  ParameterName.objects.filter(
                      schema__namespace__in=Schema.getNamespaces(
                          Schema.DATAFILE, searchQueryType))]

    datafile_results = __filterParameters(
        parameters, datafile_results,
        searchFilterData, 'datafileparameterset__datafileparameter')

    # get all the dataset parameters for given schema
    parameters = [p for p in
                  ParameterName.objects.filter(
                      schema__namespace__in=Schema.getNamespaces(
                          Schema.DATASET, searchQueryType))]

    datafile_results = __filterParameters(
        parameters, datafile_results,
        searchFilterData, 'dataset__datasetparameterset__datasetparameter')

    # let's sort it in the end

    if datafile_results:
        datafile_results = datafile_results.order_by('filename')
    logger.debug("results: {0}".format(datafile_results))
    return datafile_results
Пример #4
0
 def read_list(self, object_list, bundle):
     if bundle.request.user.is_authenticated() and \
        bundle.request.user.is_superuser:
         return object_list
     if type(bundle.obj) == Experiment:
         return type(bundle.obj).safe.all(bundle.request.user)
     elif type(bundle.obj) == ExperimentParameterSet:
         experiments = Experiment.safe.all(bundle.request.user)
         eps_list = []
         for eps in object_list:
             exp = eps.experiment
             if exp in experiments:
                 eps_list.append(eps)
         return eps_list
     elif type(bundle.obj) == ExperimentParameter:
         experiments = Experiment.safe.all(bundle.request.user)
         ep_list = []
         for ep in object_list:
             exp = ep.experiment
             if exp in experiments:
                 ep_list.append(ep)
         return eps_list
     elif type(bundle.obj) == Dataset:
         datasets = []
         for ds in object_list:
             if has_dataset_access(bundle.request, ds.id):
                 datasets.append(ds)
         return datasets
     elif type(bundle.obj) == DatasetParameterSet:
         dps_list = []
         for dps in object_list:
             if has_dataset_access(bundle.request, dps.dataset.id):
                 dps_list.append(dps)
         return dps_list
     elif type(bundle.obj) == DatasetParameter:
         dp_list = []
         for dp in object_list:
             if has_dataset_access(bundle.request,
                                   dp.parameterset.dataset.id):
                 dp_list.append(dp)
         return dp_list
     elif type(bundle.obj) == Dataset_File:
         all_dfs = set(
             get_accessible_datafiles_for_user(bundle.request))
         return list(all_dfs.intersection(object_list))
     elif type(bundle.obj) == DatafileParameterSet:
         datafiles = get_accessible_datafiles_for_user(bundle.request)
         dfps_list = []
         for dfps in object_list:
             if dfps.dataset_file in datafiles:
                 dfps_list.append(dfps)
         return dfps_list
     elif type(bundle.obj) == DatafileParameter:
         datafiles = get_accessible_datafiles_for_user(bundle.request)
         dfp_list = []
         for dfp in object_list:
             if dfp.parameterset.dataset_file in datafiles:
                 dfp_list.append(dfp)
         return dfp_list
     else:
         return []
Пример #5
0
def __getFilteredDatafiles(request, searchQueryType, searchFilterData):
    """Filter the list of datafiles for the provided searchQueryType using the
    cleaned up searchFilterData.

    Arguments:
    request -- the HTTP request
    searchQueryType -- the type of query, 'mx' or 'saxs'
    searchFilterData -- the cleaned up search form data

    Returns:
        list: A list of datafiles as a result of the query or None if the
            provided search request is invalid
    """

    datafile_results = authz.get_accessible_datafiles_for_user(request)
    logger.info('__getFilteredDatafiles: searchFilterData {0}'.
                format(searchFilterData))

    # there's no need to do any filtering if we didn't find any
    # datafiles that the user has access to
    if not datafile_results:
        logger.info("""__getFilteredDatafiles: user {0} doesn\'t have
                    access to any experiments""".format(request.user))
        return datafile_results

    q = {
        'datafileparameterset__datafileparameter__name__schema__namespace__in':
        Schema.getNamespaces(Schema.DATAFILE, searchQueryType)
    }
    datafile_results = datafile_results.filter(**q).distinct()

    # if filename is searchable which i think will always be the case...
    if searchFilterData['filename'] != '':
        datafile_results = \
            datafile_results.filter(
                filename__icontains=searchFilterData['filename'])
    # TODO: might need to cache the result of this later on

    # get all the datafile parameters for the given schema
    parameters = [p for p in
                  ParameterName.objects.filter(
                      schema__namespace__in=Schema.getNamespaces(
                          Schema.DATAFILE, searchQueryType))]

    datafile_results = __filterParameters(
        parameters, datafile_results,
        searchFilterData, 'datafileparameterset__datafileparameter')

    # get all the dataset parameters for given schema
    parameters = [p for p in
                  ParameterName.objects.filter(
                      schema__namespace__in=Schema.getNamespaces(
                          Schema.DATASET, searchQueryType))]

    datafile_results = __filterParameters(
        parameters, datafile_results,
        searchFilterData, 'dataset__datasetparameterset__datasetparameter')

    # let's sort it in the end

    if datafile_results:
        datafile_results = datafile_results.order_by('filename')
    logger.debug("results: {0}".format(datafile_results))
    return datafile_results