Exemple #1
0
def render_analysis_list():
    try:
        current_user = get_current_user()
        return render_template('pages/list.html',
                               page_data=ListTableData(current_user, get_analyses(current_user), 'Analyses'))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #2
0
def render_home():
    try:
        current_user = get_current_user()
        page_data = DashboardPageData(current_user)
        return render_template('pages/home.html', page_data=page_data)
    except Exception as e:
        return handle_exception_browser(e)
Exemple #3
0
def render_create_user_group():
    try:
        current_user = get_current_user()
        if request.method == 'POST':
            data = {
                'admin_ids':
                [int(val) for val in request.form.getlist('admin_ids')],
                'member_ids':
                [int(val) for val in request.form.getlist('member_ids')],
                'name':
                request.form.get('name'),
                'description':
                request.form.get('description')
            }
            user_group = create_user_group(current_user, data)
            return redirect(
                url_for('user_groups.render_user_group',
                        user_group_id=user_group.id))
        if request.method == 'GET':
            selected_user_ids = {int(token) for token in request.args.get('sample_ids').strip('"').split(',')} \
                if request.args.get('user_ids', '') else {}
            selected_users = get_all_read_permitted_records(current_user, User)
            return render_template('pages/create.html',
                                   page_data=UserGroupCreateFormData(
                                       current_user, selected_users))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #4
0
def render_analysis(analysis_id=None):
    try:
        current_user = get_current_user()
        return render_template('pages/analysis_entry.html',
                               page_data=AnalysisPageData(current_user, get_analysis(current_user, analysis_id)))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #5
0
def render_create_collection():
    try:
        current_user = get_current_user()
        if request.method == 'POST':
            form_data = process_input_dict(request.form.to_dict(), True)
            samples = [
                dt.samples.get_sample(current_user, sample_id)
                for sample_id in request.form.getlist('sample_ids')
            ]
            if 'sample_ids' in form_data:
                del form_data['sample_ids']
            sort_by = form_data['sort_by']
            del form_data['sort_by']
            collection = dt.wrappers.collections.create_collection(
                current_user, samples, form_data, sort_by=sort_by)
            return redirect(
                url_for('collections.render_collection',
                        collection_id=collection.id))
        if request.method == 'GET':
            if request.args.get('sample_ids', ''):
                sample_ids = [
                    int(token) for token in request.args.get(
                        'sample_ids').strip('"').split(',')
                ]
                selected_samples = Sample.query.filter(
                    Sample.id.in_(sample_ids)).all()
            else:
                selected_samples = None
            return render_template('pages/create.html',
                                   page_data=CollectionCreateFormData(
                                       current_user, selected_samples))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #6
0
def render_edit_workflow(workflow_id=None):
    try:
        return redirect(
            f"{url_for('static', filename='workflow_editor/index.html')}#/{workflow_id}"
        )
    except Exception as e:
        return handle_exception_browser(e)
Exemple #7
0
def render_upload_sample_group():
    try:
        current_user = get_current_user()
        if request.method == 'POST':
            files = request.files.getlist('files')
            filenames = [
                os.path.join(UPLOADDIR, secure_filename(file.filename))
                for file in files
            ]
            [file.save(filename) for file, filename in zip(files, filenames)]
            metadata = process_input_dict(request.form.to_dict(), True)
            workflow_data = create_sample_creation_workflow(
                current_user, filenames, metadata)
            metadata['samples'] = [
                get_sample(current_user, sample_id)
                for sample_id in workflow_data['output_ids']
            ]
            sample_group = create_sample_group(current_user, metadata)
            job = start_job(workflow_data['workflow'], workflow_data['job'],
                            current_user, 'upload')
            update_sample_group(current_user, sample_group,
                                {'upload_job_id': job.id})
            return redirect(
                url_for('sample_groups.render_sample_group',
                        sample_group_id=sample_group.id))
        return render_template('pages/create.html',
                               page_data=SampleCreateFormData(current_user))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #8
0
def render_workflow(workflow_id=None):
    try:
        current_user = get_current_user()
        return render_template('pages/workflow_entry.html',
                               page_data=WorkflowPageData(
                                   current_user,
                                   get_workflow(current_user, workflow_id)))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #9
0
def render_user_profile(user_id=None):
    try:
        current_user = get_current_user()
        return render_template('pages/user_entry.html',
                               page_data=UserPageData(
                                   current_user,
                                   get_user(current_user, user_id)))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #10
0
def render_user_group_list():
    try:
        current_user = get_current_user()
        return render_template('pages/list.html',
                               page_data=ListTableData(
                                   current_user, get_user_groups(current_user),
                                   'User Groups'))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #11
0
def render_external_file(external_file_id=None):
    try:
        current_user = get_current_user()
        return render_template('pages/external_file_entry.html',
                               page_data=ExternalFilePageData(
                                   current_user,
                                   dt.external_files.get_external_file(
                                       current_user, external_file_id)))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #12
0
def render_external_file_list():
    try:
        current_user = get_current_user()
        return render_template(
            'pages/list.html',
            page_data=ListTableData(
                current_user,
                dt.external_files.get_external_files(current_user),
                'External File Records'))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #13
0
def render_user_group(user_group_id=None):
    try:
        current_user = get_current_user()
        user_group = get_user_group(current_user, user_group_id)
        if request.method == 'DELETE':
            delete_user_group(current_user, user_group)
            return redirect(url_for('user_groups.render_user_group_list'))
        return render_template('pages/user_group_entry.html',
                               page_data=UserGroupPageData(
                                   current_user, user_group))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #14
0
def render_create_workflow():
    try:
        current_user = get_current_user()
        if request.method == 'POST':
            workflow = create_workflow(
                current_user, process_input_dict(request.form.to_dict(), True))
            return redirect(
                url_for('workflows.render_workflow', workflow_id=workflow.id))
        return render_template('pages/create.html',
                               page_data=WorkflowCreateFormData(current_user))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #15
0
def render_create_external_file():
    try:
        current_user = get_current_user()
        if request.method == 'POST':
            # following must be true:
            # 1. if "file" is empty, then "filename" is not blank and the file exists
            # 2. if "file" is not empty, then "filename" is blank or "filename" is not blank and the file does not exist
            # 1. "filename" is not blank and file exists and "file" is empty
            # 2. "filename" is not blank and file does not exist and "file" is not empty
            data = process_input_dict(request.form.to_dict(), True)

            if 'filename' in data and data['filename']:
                data['filename'] = os.path.join(
                    DATADIR, 'external', secure_filename(data['filename']))
                if (not os.path.isfile(
                        data['filename'])) and (not request.files.get('file')):
                    Path(data['filename']).parent.mkdir(exist_ok=True,
                                                        parents=True)
                    Path(data['filename']).touch()
                if request.files.get('file') and os.path.isfile(
                        data['filename']):
                    raise ValueError(
                        f'File {data["filename"]} already exists!')
            else:
                if not request.files.get('file'):
                    raise ValueError(
                        f'No file submitted and filename field left blank!')

            if request.files.get('file'):
                file = request.files.get('file')
                if 'filename' in data and not data['filename']:
                    del data['filename']
                if 'filename' in data and os.path.isfile(data['filename']):
                    raise ValueError(
                        f'File {data["filename"]} already exists! Please set a filename in the filename field.'
                    )
                filename = os.path.join(UPLOADDIR,
                                        secure_filename(file.filename))
                file.save(filename)
                external_file = dt.external_files.upload_external_file(
                    current_user, filename, data)
            else:
                external_file = dt.external_files.create_external_file(
                    current_user, data)
            return redirect(
                url_for('external_files.render_external_file',
                        external_file_id=external_file.id))
        return render_template(
            'pages/create.html',
            page_data=ExternalFileCreateFormData(current_user))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #16
0
def render_sample(sample_id=None):
    try:
        current_user = get_current_user()
        sample = get_sample(current_user, sample_id)
        if request.method == 'DELETE':
            delete_sample(current_user, sample)
            return redirect(url_for('samples.render_sample_list'))
        if request.method == 'POST':
            update_sample(current_user, sample, request.form)
        return render_template('pages/sample_entry.html',
                               page_data=SamplePageData(current_user, sample))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #17
0
def render_user_list():
    try:
        current_user = get_current_user()
        if current_user.admin:
            mailto = get_mailto_all()
        else:
            mailto = None
        return render_template('pages/user_list.html',
                               page_data=UserListTableData(
                                   current_user, get_users(current_user),
                                   mailto))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #18
0
def render_workflow_module_list():
    try:
        current_user = get_current_user()
        if request.args.get('path'):
            path = request.args.get('path')
            module = get_module(path)
            return render_template('pages/workflow_module_entry.html',
                                   page_data=WorkflowModulePageData(
                                       current_user, module))
        return render_template('pages/list.html',
                               page_data=ListTableData(current_user,
                                                       get_modules(),
                                                       'Workflow Modules'))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #19
0
def render_collection(collection_id=None):
    try:
        current_user = get_current_user()
        collection = get_collection(current_user, collection_id)
        if request.method == 'DELETE':
            delete_collection(current_user, collection_id)
            return redirect(url_for('collections.render_collection_list'))
        if request.method == 'POST':
            dataset_name = request.form.get('dataset_name')
            dataset_type = request.form.get('dtype')
            dt.collections.create_new_label_dataset(current_user, collection,
                                                    dataset_name, dataset_type)
        return render_template('pages/collection_entry.html',
                               page_data=CollectionPageData(
                                   current_user, collection))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #20
0
def render_submit_job():
    try:
        if request.args.get('workflow_id') is None:
            raise NotFoundException(f'No workflow id provided')
        current_user = get_current_user()
        workflow = get_workflow(current_user, request.args.get('workflow_id'))
        workflow_data = workflow.get_file_info()
        if request.method == 'POST':
            job_params, workflow_data, labels, options = prepare_job_params(workflow_data,
                                                                            process_input_dict(request.form),
                                                                            current_user, workflow.id)
            job = start_job(workflow_data, job_params, current_user, 'analysis', labels, options)
            return redirect(url_for('jobs.render_job', job_id=job.id))
        page_data = SubmitFormData(current_user, workflow_data, f'Workflow {workflow.id}')
        return render_template('pages/submit_job.html', page_data=page_data)
    except Exception as e:
        return handle_exception_browser(e)
Exemple #21
0
def render_create_analysis():
    try:
        current_user = get_current_user()
        if request.method == 'POST':
            new_data = process_input_dict(request.form.to_dict(), True)
            if 'collection_ids' in new_data:
                del new_data['collection_ids']
            collection_ids = [int(collection_id) for collection_id in request.form.getlist('collection_ids')]
            collections = Collection.query.filter(Collection.id.in_(collection_ids)).all()
            analysis = dt.analyses.create_analysis(current_user, new_data, collections)
            return redirect(url_for('analyses.render_analysis', analysis_id=analysis.id))
        selected_collection_ids = [int(token) for token in request.args.get('collection_ids').strip('"').split(',')] \
            if request.args.get('sample_ids', '') else []
        selected_collections = Collection.query.filter(Collection.id.in_(selected_collection_ids)).all()
        return render_template('pages/create.html',
                               page_data=AnalysisCreateFormData(current_user, selected_collections))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #22
0
def render_sample_group(sample_group_id=None):
    try:
        current_user = get_current_user()
        sample_group = get_sample_group(current_user, sample_group_id)
        if request.method == 'DELETE':
            samples_to_delete = [
                sample for sample in sample_group.samples
                if len(sample.sample_groups) < 2
            ]
            delete_sample_group(current_user, sample_group)
            for sample in samples_to_delete:
                try:
                    delete_sample(current_user, sample)
                except AuthException:
                    pass
            return redirect(url_for('sample_groups.render_sample_group_list'))
        if request.method == 'POST':
            update_sample_group(current_user, sample_group, request.form)
        return render_template('pages/sample_group_entry.html',
                               page_data=SampleGroupPageData(
                                   current_user, sample_group))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #23
0
def render_job_list():
    try:
        return render_template('pages/list.html',
                               page_data=ListTableData(get_current_user(), get_jobs(), 'Jobs'))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #24
0
def render_job(job_id=None):
    try:
        return render_template('pages/job_entry.html',
                               page_data=JobPageData(get_current_user(), get_job(job_id)))
    except Exception as e:
        return handle_exception_browser(e)
Exemple #25
0
def render_settings():
    try:
        current_user = get_current_user()
        if request.method == 'GET':
            return render_template('pages/settings.html',
                                   page_data=SettingsPageData(current_user))
        if request.method == 'POST':
            data = {
                key: value
                for key, value in request.form.to_dict().items() if value
            }
            if 'changePassword1' in data:
                if current_user.admin:
                    change_password = not (data['changePassword1'] == ''
                                           and data['changePassword2'] == ''
                                           and data['changeEmail'] == '')
                    valid_passwords = data['changePassword1'] == data[
                        'changePassword2']
                    if change_password:
                        if not valid_passwords:
                            return render_template(
                                'pages/settings.html',
                                error='Passwords do not match')
                        new_password = data['changePassword1']
                        email = data['changeEmail']
                        other_user = dt.users.get_user_by_email(email)
                        dt.users.update_user(current_user, other_user,
                                             {'password': new_password})
                        msg = f'Changed password for {email}'
                        return render_template(
                            'pages/settings.html',
                            page_data=SettingsPageData(current_user),
                            msg=msg)
                return render_template(
                    'pages/settings.html',
                    page_data=SettingsPageData(current_user),
                    error='You are not an admin!')
            else:
                change_password = '******' in data and 'password2' in data
                valid_passwords = data['password1'] == data[
                    'password2'] if change_password else False
                new_data = {
                    key: value
                    for key, value in data.items()
                    if key in {'email', 'name', 'theme'}
                }
                valid_keys = ['name', 'email', 'password', 'theme']
                if change_password:
                    if not valid_passwords:
                        return render_template(
                            'pages/settings.html',
                            page_data=SettingsPageData(current_user),
                            error='passwords do not match')
                    new_data['password'] = data['password1']
                msg = '\n'.join([
                    'Changed password' if key == 'password' else
                    'Changed %s to %s.' % (key, value)
                    for key, value in new_data.items() if key in valid_keys
                ])
                dt.users.update_user(current_user, current_user, new_data)
                # update session with new data
                if 'password' in new_data:
                    # invalidate session on password change
                    browser_logout()
                    return redirect(
                        url_for('browser.browser_login',
                                msg=msg,
                                next=url_for('browser.render_settings')))
                login_user(current_user)
                return redirect(url_for(
                    'browser.render_settings'))  # redirect a fresh GET request
    except Exception as e:
        return handle_exception_browser(e)