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))
def sftp_access(request): """ Show dynamically generated instructions on how to connect to SFTP :param request: HttpRequest :return: HttpResponse """ object_type = request.GET.get('object_type') object_id = request.GET.get('object_id') sftp_start_dir = '' if object_type and object_id: ct = ContentType.objects.get_by_natural_key( 'tardis_portal', object_type) item = ct.model_class().objects.get(id=object_id) if object_type == 'experiment': exps = [item] dataset = None datafile = None else: if object_type == 'dataset': dataset = item datafile = None elif object_type == 'datafile': datafile = item dataset = datafile.dataset exps = dataset.experiments.all() allowed_exps = [] for exp in exps: if has_experiment_download_access(request, exp.id): allowed_exps.append(exp) if len(allowed_exps) > 0: exp = allowed_exps[0] path_parts = ['/home', request.user.username, 'experiments', dirname_with_id(exp.title, exp.id)] if dataset is not None: path_parts.append( dirname_with_id(dataset.description, dataset.id)) if datafile is not None: path_parts.append(datafile.directory) sftp_start_dir = path.join(*path_parts) if request.user.userprofile.isDjangoAccount: sftp_username = request.user.username else: login_attr = getattr(settings, 'SFTP_USERNAME_ATTRIBUTE', 'email') sftp_username = getattr(request.user, login_attr) c = { 'sftp_host': request.get_host().split(':')[0], 'sftp_port': getattr(settings, 'SFTP_PORT', 2200), 'sftp_username': sftp_username, 'sftp_start_dir': sftp_start_dir, 'site_name': getattr(settings, 'SITE_TITLE', 'MyTardis'), } c['sftp_url'] = 'sftp://{}@{}:{}{}'.format( c['sftp_username'], c['sftp_host'], c['sftp_port'], c['sftp_start_dir']) return render(request, template_name='tardis_portal/sftp.html', context=c)
def sftp_access(request): """ Show dynamically generated instructions on how to connect to SFTP :param request: HttpRequest :return: HttpResponse """ object_type = request.GET.get('object_type') object_id = request.GET.get('object_id') sftp_start_dir = '' if object_type and object_id: ct = ContentType.objects.get_by_natural_key('tardis_portal', object_type) item = ct.model_class().objects.get(id=object_id) if object_type == 'experiment': exps = [item] dataset = None datafile = None else: if object_type == 'dataset': dataset = item datafile = None elif object_type == 'datafile': datafile = item dataset = datafile.dataset exps = dataset.experiments.all() allowed_exps = [] for exp in exps: if has_experiment_download_access(request, exp.id): allowed_exps.append(exp) if len(allowed_exps) > 0: exp = allowed_exps[0] path_parts = [ '/home', request.user.username, 'experiments', dirname_with_id(exp.title, exp.id) ] if dataset is not None: path_parts.append( dirname_with_id(dataset.description, dataset.id)) if datafile is not None: path_parts.append(datafile.directory) sftp_start_dir = path.join(*path_parts) if request.user.userprofile.isDjangoAccount: sftp_username = request.user.username else: login_attr = getattr(settings, 'SFTP_USERNAME_ATTRIBUTE', 'email') sftp_username = getattr(request.user, login_attr) c = { 'sftp_host': request.get_host().split(':')[0], 'sftp_port': getattr(settings, 'SFTP_PORT', 2200), 'sftp_username': sftp_username, 'sftp_start_dir': sftp_start_dir, 'site_name': getattr(settings, 'SITE_TITLE', 'MyTardis'), } c['sftp_url'] = 'sftp://{}@{}:{}{}'.format(c['sftp_username'], c['sftp_host'], c['sftp_port'], c['sftp_start_dir']) return render(request, template_name='tardis_portal/sftp.html', context=c)
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))
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))
def experiment_datasets_json(request, experiment_id): try: experiment = Experiment.safe.get(request.user, experiment_id) except Experiment.DoesNotExist: return return_response_not_found(request) has_download_permissions = \ authz.has_experiment_download_access(request, experiment_id) objects = [ get_dataset_info(ds, include_thumbnail=has_download_permissions, exclude=['datafiles']) for ds in experiment.datasets.all().order_by('description')] return HttpResponse(json.dumps(objects), content_type='application/json')
def experiment_datasets_json(request, experiment_id): try: experiment = Experiment.safe.get(request.user, experiment_id) except Experiment.DoesNotExist: return return_response_not_found(request) has_download_permissions = \ authz.has_experiment_download_access(request, experiment_id) objects = [ get_dataset_info(ds, include_thumbnail=has_download_permissions, exclude=['datafiles']) for ds in experiment.datasets.all().order_by('description') ] return HttpResponse(json.dumps(objects), content_type='application/json')
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
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