File indexing completed on 2026-04-27 07:41:44
0001 {% extends 'base.html' %}
0002
0003 {% block title %}{{ task.name }} - Prod Task - PCS{% endblock %}
0004
0005 {% block content %}
0006 <div class="container mt-4">
0007 <nav aria-label="breadcrumb">
0008 <ol class="breadcrumb">
0009 <li class="breadcrumb-item"><a href="{% url 'pcs:pcs_hub' %}">PCS</a></li>
0010 <li class="breadcrumb-item"><a href="{% url 'pcs:prod_task_compose' %}?tab=tasks">Prod Tasks</a></li>
0011 <li class="breadcrumb-item active">{{ task.name }}</li>
0012 </ol>
0013 </nav>
0014
0015 <div class="d-flex justify-content-between align-items-start mb-3">
0016 <div>
0017 <h2>{{ task.name }}</h2>
0018 <p class="text-muted">
0019 <span class="badge bg-{% if task.status == 'draft' %}secondary{% elif task.status == 'ready' %}primary{% elif task.status == 'submitted' %}info{% elif task.status == 'completed' %}success{% else %}danger{% endif %}">{{ task.status }}</span>
0020 Created by {{ task.created_by }} on {{ task.created_at|date:"Y-m-d H:i" }}
0021 {% if task.updated_at != task.created_at %} | Updated {{ task.updated_at|date:"Y-m-d H:i" }}{% endif %}
0022 </p>
0023 </div>
0024 <div>
0025 <a href="{% url 'pcs:prod_task_compose' %}?tab=tasks&selected={{ task.name|urlencode }}" class="btn btn-dark-green btn-sm">Edit in Compose</a>
0026 <button class="btn btn-secondary btn-sm" id="btn-regen">Regenerate Commands</button>
0027 </div>
0028 </div>
0029
0030 {% if task.description %}
0031 <p>{{ task.description }}</p>
0032 {% endif %}
0033
0034 <div class="row">
0035 <div class="col-md-6 mb-3">
0036 <div class="card h-100">
0037 <div class="card-body">
0038 <h5 class="card-title">Dataset</h5>
0039 <table class="table table-sm table-bordered mb-0">
0040 <tr><td style="width:40%"><strong>Name</strong></td><td><a href="{% url 'pcs:dataset_detail' pk=task.dataset.pk %}">{{ task.dataset.dataset_name }}</a></td></tr>
0041 <tr><td><strong>DID</strong></td><td><code>{{ task.dataset.did }}</code></td></tr>
0042 <tr><td><strong>Detector Version</strong></td><td>{{ task.dataset.detector_version }}</td></tr>
0043 <tr><td><strong>Detector Config</strong></td><td>{{ task.dataset.detector_config }}</td></tr>
0044 </table>
0045 </div>
0046 </div>
0047 </div>
0048 <div class="col-md-6 mb-3">
0049 <div class="card h-100">
0050 <div class="card-body">
0051 <h5 class="card-title">Production Config</h5>
0052 <table class="table table-sm table-bordered mb-0">
0053 <tr><td style="width:40%"><strong>Name</strong></td><td><a href="{% url 'pcs:prod_config_detail' pk=task.prod_config.pk %}">{{ task.prod_config.name }}</a></td></tr>
0054 <tr><td><strong>JUG_XL Tag</strong></td><td>{{ task.prod_config.jug_xl_tag|default:"-" }}</td></tr>
0055 <tr><td><strong>Container</strong></td><td><code>{{ task.prod_config.container_image|default:"-" }}</code></td></tr>
0056 <tr><td><strong>BG Mixing</strong></td><td>{% if task.prod_config.bg_mixing %}Yes{% else %}No{% endif %}</td></tr>
0057 </table>
0058 </div>
0059 </div>
0060 </div>
0061 </div>
0062
0063 <div class="card mb-3">
0064 <div class="card-body">
0065 <h5 class="card-title">Tags</h5>
0066 <table class="table table-sm table-bordered" style="max-width: 800px;">
0067 <thead><tr><th>Type</th><th>Tag</th><th>Description</th><th>Key Parameters</th></tr></thead>
0068 <tbody>
0069 <tr>
0070 <td>Physics</td>
0071 <td><a href="{% url 'pcs:tag_compose' tag_type='p' %}?selected={{ task.dataset.physics_tag.tag_label|urlencode }}">{{ task.dataset.physics_tag.tag_label }}</a></td>
0072 <td>{{ task.dataset.physics_tag.description|truncatewords:10 }}</td>
0073 <td>{% for k, v in task.dataset.physics_tag.parameters.items %}<code>{{ k }}</code>={{ v }}{% if not forloop.last %}, {% endif %}{% endfor %}</td>
0074 </tr>
0075 <tr>
0076 <td>EvGen</td>
0077 <td><a href="{% url 'pcs:tag_compose' tag_type='e' %}?selected={{ task.dataset.evgen_tag.tag_label|urlencode }}">{{ task.dataset.evgen_tag.tag_label }}</a></td>
0078 <td>{{ task.dataset.evgen_tag.description|truncatewords:10 }}</td>
0079 <td>{% for k, v in task.dataset.evgen_tag.parameters.items %}<code>{{ k }}</code>={{ v }}{% if not forloop.last %}, {% endif %}{% endfor %}</td>
0080 </tr>
0081 <tr>
0082 <td>Simulation</td>
0083 <td><a href="{% url 'pcs:tag_compose' tag_type='s' %}?selected={{ task.dataset.simu_tag.tag_label|urlencode }}">{{ task.dataset.simu_tag.tag_label }}</a></td>
0084 <td>{{ task.dataset.simu_tag.description|truncatewords:10 }}</td>
0085 <td>{% for k, v in task.dataset.simu_tag.parameters.items %}<code>{{ k }}</code>={{ v }}{% if not forloop.last %}, {% endif %}{% endfor %}</td>
0086 </tr>
0087 <tr>
0088 <td>Reconstruction</td>
0089 <td><a href="{% url 'pcs:tag_compose' tag_type='r' %}?selected={{ task.dataset.reco_tag.tag_label|urlencode }}">{{ task.dataset.reco_tag.tag_label }}</a></td>
0090 <td>{{ task.dataset.reco_tag.description|truncatewords:10 }}</td>
0091 <td>{% for k, v in task.dataset.reco_tag.parameters.items %}<code>{{ k }}</code>={{ v }}{% if not forloop.last %}, {% endif %}{% endfor %}</td>
0092 </tr>
0093 </tbody>
0094 </table>
0095 </div>
0096 </div>
0097
0098 {% if task.csv_file %}
0099 <div class="card mb-3">
0100 <div class="card-body">
0101 <h5 class="card-title">Submission</h5>
0102 <table class="table table-sm table-bordered" style="max-width: 600px;">
0103 <tr><td style="width:30%"><strong>CSV File</strong></td><td><code>{{ task.csv_file }}</code></td></tr>
0104 </table>
0105 </div>
0106 </div>
0107 {% endif %}
0108
0109 {% if task.overrides %}
0110 <div class="card mb-3">
0111 <div class="card-body">
0112 <h5 class="card-title">Overrides</h5>
0113 <table class="table table-sm table-bordered mb-0">
0114 {% for key, value in task.overrides.items %}
0115 <tr><td style="width:40%"><strong>{{ key }}</strong></td><td><code>{{ value }}</code></td></tr>
0116 {% endfor %}
0117 </table>
0118 </div>
0119 </div>
0120 {% endif %}
0121
0122 {% if task.condor_command %}
0123 <div class="card mb-3">
0124 <div class="card-body">
0125 <div class="d-flex justify-content-between align-items-center mb-2">
0126 <h5 class="card-title mb-0">Condor Command</h5>
0127 <button class="btn btn-secondary btn-sm btn-copy" data-target="condor-cmd">Copy</button>
0128 </div>
0129 <pre id="condor-cmd" class="bg-dark text-light p-3 mb-0" style="font-size: 0.8em; white-space: pre-wrap; word-break: break-all;">{{ task.condor_command }}</pre>
0130 </div>
0131 </div>
0132 {% endif %}
0133
0134 {% if task.panda_command %}
0135 <div class="card mb-3">
0136 <div class="card-body">
0137 <div class="d-flex justify-content-between align-items-center mb-2">
0138 <h5 class="card-title mb-0">PanDA Command</h5>
0139 <button class="btn btn-secondary btn-sm btn-copy" data-target="panda-cmd">Copy</button>
0140 </div>
0141 <pre id="panda-cmd" class="bg-dark text-light p-3 mb-0" style="font-size: 0.8em; white-space: pre-wrap; word-break: break-all;">{{ task.panda_command }}</pre>
0142 </div>
0143 </div>
0144 {% endif %}
0145
0146 {% if task_params_json %}
0147 <div class="card mb-3">
0148 <div class="card-body">
0149 <div class="d-flex justify-content-between align-items-center mb-2">
0150 <h5 class="card-title mb-0">JEDI taskParamMap</h5>
0151 <button class="btn btn-secondary btn-sm btn-copy" data-target="task-params">Copy</button>
0152 </div>
0153 <div class="text-muted mb-2" style="font-size: 0.85em;">
0154 Computed from current PCS state. Passed to <code>Client.insertTaskParams()</code> for JEDI submission.
0155 </div>
0156 <pre id="task-params" class="bg-dark text-light p-3 mb-0" style="font-size: 0.8em; white-space: pre-wrap;">{{ task_params_json }}</pre>
0157 </div>
0158 </div>
0159 {% elif task_params_error %}
0160 <div class="alert alert-warning mb-3">
0161 <strong>JEDI taskParamMap unavailable:</strong> {{ task_params_error }}
0162 </div>
0163 {% endif %}
0164
0165 {% if task.panda_task_id or task.condor_cluster_id %}
0166 <div class="card mb-3">
0167 <div class="card-body">
0168 <h5 class="card-title">Tracking</h5>
0169 <table class="table table-sm table-bordered" style="max-width: 600px;">
0170 {% if task.panda_task_id %}<tr><td><strong>PanDA Task ID</strong></td><td>{{ task.panda_task_id }}</td></tr>{% endif %}
0171 {% if task.condor_cluster_id %}<tr><td><strong>Condor Cluster ID</strong></td><td>{{ task.condor_cluster_id }}</td></tr>{% endif %}
0172 </table>
0173 </div>
0174 </div>
0175 {% endif %}
0176 </div>
0177
0178 <script>
0179 document.querySelectorAll('.btn-copy').forEach(btn => {
0180 btn.addEventListener('click', function() {
0181 const pre = document.getElementById(this.dataset.target);
0182 navigator.clipboard.writeText(pre.textContent).then(() => {
0183 this.textContent = 'Copied!';
0184 setTimeout(() => { this.textContent = 'Copy'; }, 1500);
0185 });
0186 });
0187 });
0188 document.getElementById('btn-regen').addEventListener('click', function() {
0189 fetch('{% url "pcs:prod_task_generate_commands" pk=task.pk %}')
0190 .then(r => r.json())
0191 .then(data => { location.reload(); });
0192 });
0193 </script>
0194 {% endblock %}