Esempio n. 1
0
def request_handler(request, func, *args):
    try:
        record_timing(request, note="before")
        msg = {'result': str(func(*args))}
        record_timing(request, note="after")
    except InvalidNumber:
        msg = {'message': 'Invalid number'}

    return msg
Esempio n. 2
0
async def get_with_intermediate_timing(request: Request) -> None:
    await asyncio.sleep(0.1)
    record_timing(request, note="halfway")
    await asyncio.sleep(0.1)
Esempio n. 3
0
def get_with_intermediate_timing(request: Request) -> None:
    record_timing(request, note="hello")
Esempio n. 4
0
def fail_to_record(request: Request) -> None:
    record_timing(request)
Esempio n. 5
0
File: run.py Progetto: lab-grid/flow
async def patch_run(
    request: Request,
    run_id: int,
    patch: list,
    enforcer: casbin.Enforcer = Depends(get_enforcer),
    db: Session = Depends(get_db),
    current_user: Auth0ClaimsPatched = Depends(get_current_user)):
    if not check_access(enforcer,
                        user=current_user.username,
                        path=f"/run/{str(run_id)}",
                        method="PUT"):
        raise HTTPException(status_code=403, detail='Insufficient Permissions')

    new_run = db.query(Run).get(run_id)
    original_run_version = new_run.current
    if not new_run or new_run.is_deleted:
        raise HTTPException(status_code=404, detail='Run Not Found')

    record_timing(request, note=f"Fetched run {run_id}")

    run_dict = versioned_row_to_dict(new_run, new_run.current)
    run_dict.pop('protocol', None)
    json_patch = jsonpatch.JsonPatch(patch)
    run_dict.pop('protocol', None)
    run_dict = json_patch.apply(run_dict)

    if not change_allowed(run_to_dict(new_run, new_run.current), run_dict):
        raise HTTPException(status_code=403, detail='Insufficient Permissions')

    new_run_version = RunVersion(data=strip_metadata(run_dict),
                                 server_version=settings.server_version)
    new_run_version.run = new_run
    add_updator(new_run_version, current_user.username)
    original_run_version = new_run.current
    new_run.current = new_run_version
    db.add(new_run_version)
    db.commit()

    record_timing(request, note=f"Saved changes to run {run_id}")

    samples_dirty = False
    for operation in patch:
        operation_path = operation.get('path', '')
        # Check for changes to the path: /sections/*/blocks/*/plates
        if re.search(
                "^/(sections/([^/]+/(blocks/([^/]+/(plates(/.*)?)?)?)?)?)?$",
                operation_path):
            samples_dirty = True
            break
        # Check for changes to the path: /sections/*/blocks/*/plateSequencingResults
        if re.search(
                "^/(sections/([^/]+/(blocks/([^/]+/(plateSequencingResults(/.*)?)?)?)?)?)?$",
                operation_path):
            samples_dirty = True
            break
        # Check for changes to the path: /protocol/sections/*/blocks/*/plateMarkers
        if re.search(
                "^/(protocol/(sections/([^/]+/(blocks/([^/]+/(plateMarkers(/.*)?)?)?)?)?)?)?$",
                operation_path):
            samples_dirty = True
            break

    if samples_dirty:
        logger.info("======================================")
        logger.info(
            f"Regenerating samples for run_version: ({new_run.id}, {new_run_version.id})"
        )
        samples = get_samples(new_run_version, new_run.protocol_version)

        record_timing(
            request,
            note=f"Regenerated run {new_run.id} samples (len: {len(samples)})")

        if samples:
            for sample in samples:
                db.merge(sample)
        logger.info(
            f"Generated {len(samples)} samples for run_version: ({new_run.id}, {new_run_version.id})"
        )
        logger.info("======================================")

        record_timing(
            request,
            note=f"Saved {len(samples)} regenerated samples to run {new_run.id}"
        )
    else:
        logger.info("======================================")
        logger.info(
            f"Using old samples for run_version: ({new_run.id}, {new_run_version.id})"
        )
        samples = db.query(Sample)\
            .filter(Sample.run_version_id == original_run_version.id)\
            .distinct()
        sample_count = 0
        for sample in samples:
            new_sample_version = clone_model(db,
                                             sample.current,
                                             run_version_id=new_run_version.id)
            new_sample = clone_model(db,
                                     sample,
                                     current=new_sample_version,
                                     run_version_id=new_run_version.id)
            db.merge(new_sample)
            sample_count += 1
        logger.info(
            f"Attached {sample_count} existing samples to run_version: ({new_run.id}, {new_run_version.id})"
        )
        logger.info("======================================")

        record_timing(
            request,
            note=f"Attached {sample_count} existing samples to run {new_run.id}"
        )

    db.commit()
    return run_to_dict(new_run, new_run.current)