Lucas ARRIESSE
commited on
Commit
·
730ea19
1
Parent(s):
ed93d85
Add ability to bulk download files sorted by agenda item or not
Browse files- api/docs.py +3 -1
- schemas.py +1 -0
- static/index.html +18 -4
- static/js/app.js +4 -1
api/docs.py
CHANGED
|
@@ -383,7 +383,9 @@ async def download_docs(req: DownloadDocsRequest, http_client: AsyncClient = Dep
|
|
| 383 |
failed = "failed" in task
|
| 384 |
doc_id = task["doc_id"]
|
| 385 |
base_filename = f"failed_{doc_id}.txt" if failed else f"{doc_id}.txt"
|
| 386 |
-
|
|
|
|
|
|
|
| 387 |
zip_file.writestr(full_file_path, task["content"])
|
| 388 |
|
| 389 |
zip_buffer.seek(0)
|
|
|
|
| 383 |
failed = "failed" in task
|
| 384 |
doc_id = task["doc_id"]
|
| 385 |
base_filename = f"failed_{doc_id}.txt" if failed else f"{doc_id}.txt"
|
| 386 |
+
|
| 387 |
+
# sort by agenda item if enabled
|
| 388 |
+
full_file_path = f"{directory_name}/{base_filename}" if req.sort_by_agenda_item else base_filename
|
| 389 |
zip_file.writestr(full_file_path, task["content"])
|
| 390 |
|
| 391 |
zip_buffer.seek(0)
|
schemas.py
CHANGED
|
@@ -40,6 +40,7 @@ class DocInfo(BaseModel):
|
|
| 40 |
class DownloadDocsRequest(BaseModel):
|
| 41 |
documents: List[DocInfo] = Field(
|
| 42 |
description="List of documents to download")
|
|
|
|
| 43 |
|
| 44 |
# --------------------------------------
|
| 45 |
|
|
|
|
| 40 |
class DownloadDocsRequest(BaseModel):
|
| 41 |
documents: List[DocInfo] = Field(
|
| 42 |
description="List of documents to download")
|
| 43 |
+
sort_by_agenda_item: bool = Field(default=False, description="Whether to sort the files by their agenda item.")
|
| 44 |
|
| 45 |
# --------------------------------------
|
| 46 |
|
static/index.html
CHANGED
|
@@ -158,14 +158,28 @@
|
|
| 158 |
<div class="flex gap-2 items-center">
|
| 159 |
<div class="tooltip" data-tip="Extract requirements from selected pCR / CR documents">
|
| 160 |
<button id="extract-requirements-btn"
|
| 161 |
-
class="bg-orange-300 text-white text-sm rounded px-3 py-1 shadow hover:bg-orange-600">💉
|
| 162 |
Extract Requirements from CRs
|
| 163 |
</button>
|
| 164 |
</div>
|
| 165 |
<div class="tooltip" data-tip="Download all selected docs as text files">
|
| 166 |
-
<
|
| 167 |
-
|
| 168 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 169 |
</div>
|
| 170 |
</div>
|
| 171 |
|
|
|
|
| 158 |
<div class="flex gap-2 items-center">
|
| 159 |
<div class="tooltip" data-tip="Extract requirements from selected pCR / CR documents">
|
| 160 |
<button id="extract-requirements-btn"
|
| 161 |
+
class="btn bg-orange-300 text-white text-sm rounded px-3 py-1 shadow hover:bg-orange-600">💉
|
| 162 |
Extract Requirements from CRs
|
| 163 |
</button>
|
| 164 |
</div>
|
| 165 |
<div class="tooltip" data-tip="Download all selected docs as text files">
|
| 166 |
+
<div class="dropdown">
|
| 167 |
+
<div tabindex="0" role="button" class="btn text-sm rounded px-3 py-1 shadow cursor-pointer">
|
| 168 |
+
📦 Download </div>
|
| 169 |
+
<div tabindex="0" class="dropdown-content card card-sm bg-base-100 z-1 w-64 shadow-md">
|
| 170 |
+
<div class="card-body space-y-2">
|
| 171 |
+
<label class="label">
|
| 172 |
+
<input class="checkbox checkbox-primary" name="download-sorted-files"
|
| 173 |
+
type="checkbox" id="download-sorted-files">
|
| 174 |
+
<p class="text-m">Sort files by agenda</p>
|
| 175 |
+
</label>
|
| 176 |
+
<button id="download-tdocs-btn"
|
| 177 |
+
class="text-sm rounded px-3 py-1 shadow cursor-pointer">
|
| 178 |
+
📦 Download docs
|
| 179 |
+
</button>
|
| 180 |
+
</div>
|
| 181 |
+
</div>
|
| 182 |
+
</div>
|
| 183 |
</div>
|
| 184 |
</div>
|
| 185 |
|
static/js/app.js
CHANGED
|
@@ -236,6 +236,9 @@ async function downloadTDocs() {
|
|
| 236 |
// Extraire les données du tableau avec le format suivant pour la requete backend
|
| 237 |
// { document: "nom_doc", url: "url_doc", type: "type_de_doc"}
|
| 238 |
const selectedData = extractTableData({ 'TDoc': 'document', 'URL': 'url', 'Type': "type", "Agenda": "agenda_item" });
|
|
|
|
|
|
|
|
|
|
| 239 |
|
| 240 |
if (selectedData.length === 0) {
|
| 241 |
alert('Please select at least one document');
|
|
@@ -248,7 +251,7 @@ async function downloadTDocs() {
|
|
| 248 |
const response = await fetch('/docs/download_docs', {
|
| 249 |
method: 'POST',
|
| 250 |
headers: { 'Content-Type': 'application/json' },
|
| 251 |
-
body: JSON.stringify({ documents: documents })
|
| 252 |
});
|
| 253 |
|
| 254 |
const blob = await response.blob();
|
|
|
|
| 236 |
// Extraire les données du tableau avec le format suivant pour la requete backend
|
| 237 |
// { document: "nom_doc", url: "url_doc", type: "type_de_doc"}
|
| 238 |
const selectedData = extractTableData({ 'TDoc': 'document', 'URL': 'url', 'Type': "type", "Agenda": "agenda_item" });
|
| 239 |
+
const sortByAgendaItem = document.getElementById('download-sorted-files').checked;
|
| 240 |
+
|
| 241 |
+
console.log(sortByAgendaItem)
|
| 242 |
|
| 243 |
if (selectedData.length === 0) {
|
| 244 |
alert('Please select at least one document');
|
|
|
|
| 251 |
const response = await fetch('/docs/download_docs', {
|
| 252 |
method: 'POST',
|
| 253 |
headers: { 'Content-Type': 'application/json' },
|
| 254 |
+
body: JSON.stringify({ documents: documents, sort_by_agenda_item: sortByAgendaItem })
|
| 255 |
});
|
| 256 |
|
| 257 |
const blob = await response.blob();
|