Commit e2f0446e authored by Cage, Gregory's avatar Cage, Gregory
Browse files

Update paging for job information std out

parent 23aadd11
Loading
Loading
Loading
Loading
+33 −1
Original line number Diff line number Diff line
<template>
    <div>
        <job-details-provider auto-refresh :jobId="job_id" @update:result="updateJob" />
        <job-details-provider auto-refresh :jobId="job_id" :page_start=stdout_start :page_end=stdout_end @update:result="updateJob" />
        <h3>Job Information</h3>
        <table id="job-information" class="tabletip info_data_table">
            <tbody>
@@ -103,6 +103,11 @@ export default {
    data() {
        return {
            job: null,
            stdout_start: 1,
            stdout_end: 3,
            stdout_page_length: 5000,
            stdout_live: true,
            stdout_old: false,
        };
    },
    computed: {
@@ -115,12 +120,39 @@ export default {
            return this.job && !JOB_STATES_MODEL.NON_TERMINAL_STATES.includes(this.job.state);
        },
    },
    updated() {
        try {
            const stdout_block = document.querySelector("#stdout").querySelector(".code");
            if (stdout_block.scrollTop <= .25 * stdout_block.scrollHeight) {
                this.stdout_live = false;
                this.stdout_old = true;
            } else if (stdout_block.scrollTop >= .75 * stdout_block.scrollHeight) {
                this.stdout_live = true;
                this.stdout_old = false;
            } else {
                this.stdout_live = false;
                this.stdout_old = false;
            }
        } catch(exception) {
            console.log("Can not find code div.");
        }
    },
    methods: {
        getAppRoot() {
            return getAppRoot();
        },
        updateJob(job) {
            this.job = job;
            if (this.job.tool_stdout.length >= this.stdout_page_length * 3 && this.stdout_live) {
                this.stdout_start += 1;
                this.stdout_end += 1;
            }
            if (!this.stdout_live && this.stdout_old) {
                this.stdout_start = this.stdout_start > 1 ? this.stdout_start - 1: 1;
                this.stdout_end = this.stdout_end > 3 ? this.stdout_end - 1: 3;
            }


        },
    },
};
+2 −2
Original line number Diff line number Diff line
@@ -5,8 +5,8 @@ import { rethrowSimple } from "utils/simple-error";
import { stateIsTerminal } from "./utils";
import { cleanPaginationParameters } from "./utils";

async function jobDetails({ jobId }) {
    const url = `${getAppRoot()}api/jobs/${jobId}?full=True`;
async function jobDetails({ jobId, page_start = 0, page_end = 0 }) {
    const url = `${getAppRoot()}api/jobs/${jobId}?full=True&stdout_start=${page_start}&stdout_end=${page_end}`;
    try {
        const { data } = await axios.get(url);
        return data;
+8 −10
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ from galaxy.util.search import (
    parse_filters_structured,
    RawTextTerm,
)

import traceback
log = logging.getLogger(__name__)

STDOUT_PAGE_SIZE_CHARS = 5000
@@ -221,7 +221,7 @@ class JobManager:
        )
        return self.job_lock()

    def get_accessible_job(self, trans, decoded_job_id, stdout_page=0):
    def get_accessible_job(self, trans, decoded_job_id, stdout_start=0, stdout_end=0):
        job = trans.sa_session.query(trans.app.model.Job).filter(trans.app.model.Job.id == decoded_job_id).first()
        if job is None:
            raise ObjectNotFound()
@@ -238,20 +238,18 @@ class JobManager:
                if not self.dataset_manager.is_accessible(data_assoc.dataset.dataset, trans.user):
                    raise ItemAccessibilityException("You are not allowed to rerun this job.")
        trans.sa_session.refresh(job)
        if job.state == job.states.RUNNING and stdout_page != 0:
        if job.state == job.states.RUNNING and stdout_start > 0:
            try:
                stdout_path = Path(".").parent.parent.parent.parent.parent / "database/jobs_directory/000" / str(
                    job.id) / "outputs/tool_stdout"
                stdout_file = open(stdout_path, "rb")
                if stdout_page < 0:
                    stdout_file.seek((stdout_page) * STDOUT_PAGE_SIZE_CHARS, 2)
                    job.job_stdout = stdout_file.read(STDOUT_PAGE_SIZE_CHARS).decode("utf-8")
                else:
                    stdout_file.seek((stdout_page - 1) * STDOUT_PAGE_SIZE_CHARS)
                    job.job_stdout = stdout_file.read(STDOUT_PAGE_SIZE_CHARS).decode("utf-8")
                stdout_file = open(stdout_path, "r")
                number_of_pages = stdout_end - stdout_start + 1 if stdout_end > 0 else 1
                stdout_file.seek((stdout_start - 1) * STDOUT_PAGE_SIZE_CHARS)
                job.job_stdout = stdout_file.read(STDOUT_PAGE_SIZE_CHARS * number_of_pages)
                job.tool_stdout = job.job_stdout
            except Exception as e:
                log.error("Could not read STDOUT: %s", e)
                log.error(traceback.format_exc())
        return job

    def stop(self, job, message=None):
+3 −2
Original line number Diff line number Diff line
@@ -178,7 +178,8 @@ class FastAPIJobs:
        id: EncodedDatabaseIdField,
        trans: ProvidesUserContext = DependsOnTrans,
        full: Optional[bool] = False,
        stdout_page: Optional[int] = None,
        stdout_start: Optional[int] = None,
        stdout_end: Optional[int] = None,
    ) -> Dict[str, Any]:
        """
        Return dictionary containing description of job data
@@ -187,7 +188,7 @@ class FastAPIJobs:
        - id: ID of job to return
        - full: Return extra information ?
        """
        return self.service.show(trans, id, bool(full), int(stdout_page) if stdout_page else 0)
        return self.service.show(trans, id, bool(full), int(stdout_start) if stdout_start else 0, int(stdout_end) if stdout_end else 0)

    @router.get("/api/jobs")
    def index(
+3 −2
Original line number Diff line number Diff line
@@ -48,10 +48,11 @@ class JobsService:
        trans: ProvidesUserContext,
        id: EncodedDatabaseIdField,
        full: bool = False,
        stdout_page: int = 0,
        stdout_start: int = 0,
        stdout_end: int = 0,
    ) -> Dict[str, Any]:
        id = trans.app.security.decode_id(id)
        job = self.job_manager.get_accessible_job(trans, id, stdout_page)
        job = self.job_manager.get_accessible_job(trans, id, stdout_start, stdout_end)
        return view_show_job(trans, job, bool(full))

    def index(