add article and pubications

This commit is contained in:
2026-06-25 10:30:24 +03:00
parent 7fa8a9b7fc
commit 7206a0a0c5
25 changed files with 1180 additions and 86 deletions

View File

@@ -4,6 +4,7 @@ from datetime import datetime
from helpers.document_status import DocumentsStatus
from helpers.emails import send_gmail
from dataclasses import dataclass, field
import asyncio
@dataclass
class State:
@@ -11,6 +12,7 @@ class State:
file_picker: ft.FilePicker | None = None
picked_files: list[ft.FilePickerFile] = field(default_factory=list)
state = State()
class Documents:
@@ -21,11 +23,11 @@ class Documents:
self.token = self.page.session.store.get('token')
self.user = self.page.session.store.get('user')
self.user_id = self.user['id'] if self.user else None
self.documenet_title = None
self.all_requests = []
self.current_selected_request = None
# Elemente interfață: Căutare și Listă
self.search_bar = ft.TextField(
label="Căutare solicitări (Text solicitare sau comentariu)",
@@ -87,6 +89,11 @@ class Documents:
self.doc_id_info = ft.Text("Document Final: Niciunul", color=ft.Colors.GREY_700)
self.download_button = ft.IconButton(
icon=ft.Icons.DOWNLOAD,
on_click=self._on_download_button_click,
)
self.details_panel = ft.Column(
[
self.req_id_text,
@@ -108,15 +115,23 @@ class Documents:
]),
ft.Divider(),
ft.Text("Finalizare și Încărcare Document:", weight=ft.FontWeight.BOLD),
ft.Row([
ft.FilledButton(
"Încarcă Document Final",
icon=ft.Icons.UPLOAD_FILE,
on_click=self._handle_file_upload,
bgcolor=ft.Colors.GREEN_700
),
self.doc_id_info
])
ft.Row(
[
ft.Row([
ft.FilledButton(
"Încarcă Document Final",
icon=ft.Icons.UPLOAD_FILE,
on_click=self._handle_file_upload,
bgcolor=ft.Colors.GREEN_700
),
self.doc_id_info,
self.download_button
]),
ft.FilledButton("Salveaza si trimite", on_click=self._on_file_saved)
],
alignment=ft.MainAxisAlignment.SPACE_BETWEEN
)
],
visible=False,
expand=True,
@@ -301,8 +316,8 @@ class Documents:
print(f"Update failed: {e}")
return False
async def _handle_file_upload(self, e):
if not self.current_selected_request: return
async def _handle_file_upload(self, e: ft.Event[ft.Button]):
print('File uploaded')
try:
state.file_picker = ft.FilePicker()
files = await state.file_picker.pick_files(allow_multiple=False)
@@ -310,36 +325,69 @@ class Documents:
state.picked_files = files
uploaded_file_name = f"{datetime.now().strftime('%Y%m%d%H%M%S')}_{state.picked_files[0].name}"
await state.file_picker.upload(
files=[
ft.FilePickerUploadFile(
name=file.name,
upload_url=self.page.get_upload_url(uploaded_file_name, 60),
)
for file in state.picked_files
]
await state.file_picker.upload(
files=[
ft.FilePickerUploadFile(
name=file.name,
upload_url=self.page.get_upload_url(uploaded_file_name, 60),
)
for file in state.picked_files
]
)
self.documenet_title = uploaded_file_name
self.doc_id_info.value = f"ID Document asociat: {self.documenet_title}"
return f'{uploaded_file_name}'
except Exception as e:
print(e)
# 2. Înregistrare în tabela documents_custom
def _on_file_saved(self, e):
reg_resp = requests.post(
f"{self.base_url}/documents/customs/add",
json={"name": f"Document Final Solicitare #{self.current_selected_request['id']}", "path": self.documenet_title},
headers={'Authorization': f'Bearer {self.token}'}
)
reg_resp = requests.post(
f"{self.base_url}/documents/customs/add",
json={"name": f"Document Final Solicitare #{self.current_selected_request['id']}", "path": uploaded_file_name},
if reg_resp.status_code == 201:
doc_id = reg_resp.json().get('id')
# 3. Legare document de solicitare și marcare ca finalizat
self._update_request_api({
"document_id": doc_id,
"status": DocumentsStatus.COMPLETED,
"expert_id": self.user_id,
})
async def _on_download_button_click(self, e):
"""Handles the download of the final document."""
if not self.current_selected_request or not self.current_selected_request.get('document_id'):
self.page.show_dialog(ft.SnackBar(ft.Text("Nu există un document final asociat acestei solicitări."), open=True))
self.page.update()
return
document_id = self.current_selected_request['document_id']
try:
# Fetch document details to get the path
response = requests.get(
f"{self.base_url}/documents/customs/{document_id}",
headers={'Authorization': f'Bearer {self.token}'}
)
if reg_resp.status_code == 201:
doc_id = reg_resp.json().get('id')
# 3. Legare document de solicitare și marcare ca finalizat
self._update_request_api({
"document_id": doc_id,
"status": DocumentsStatus.COMPLETED,
"expert_id": self.user_id,
})
if response.status_code == 200:
document_data = response.json()
document_path = document_data.get('path')
if document_path:
download_url = f"{self.base_url}/documents/download?path={document_path}&token={self.token}"
await self.page.launch_url(download_url)
else:
self.page.show_dialog(ft.SnackBar(ft.Text("Calea documentului nu a putut fi găsită."), open=True))
else:
self.page.show_dialog(ft.SnackBar(ft.Text(f"Eroare la preluarea detaliilor documentului: {response.status_code}"), open=True))
except requests.exceptions.RequestException as err:
self.page.show_dialog(ft.SnackBar(ft.Text(f"Eroare de rețea la descărcarea documentului: {err}"), open=True))
except Exception as ex:
print(f"Error during file upload or registration: {ex}")
self.page.show_dialog(ft.SnackBar(ft.Text(f"A apărut o eroare neașteptată: {ex}"), open=True))
self.page.update()
def build(self):
return ft.Container(

View File

@@ -73,6 +73,13 @@ class Documents:
disabled=True, # Will be enabled based on status
visible=False # Initially hidden
)
self.download_button = ft.FilledButton(
"Descarcă Document Final",
icon=ft.Icons.DOWNLOAD,
on_click=self._on_download_button_click,
disabled=True, # Will be enabled based on status and document_id
visible=False # Initially hidden
)
self.comment_text_field = ft.TextField(
label="Adauga un comentariu",
multiline=True,
@@ -96,11 +103,13 @@ class Documents:
ft.Text("Pret:", weight=ft.FontWeight.BOLD),
self.request_price_text,
self.pay_button,
self.download_button,
ft.Divider(),
ft.Text("Adauga Comentariu:", weight=ft.FontWeight.BOLD),
ft.Row([self.comment_text_field, self.add_comment_button]),
],
expand=True,
scroll=ft.ScrollMode.ADAPTIVE,
visible=False # Initially hidden
)
@@ -186,6 +195,14 @@ class Documents:
self.pay_button.visible = False
self.pay_button.disabled = True
# Handle Download button visibility and state
if request_data.get('status') == DocumentsStatus.COMPLETED and request_data.get('document_id'):
self.download_button.visible = True
self.download_button.disabled = False
else:
self.download_button.visible = False
self.download_button.disabled = True
# Enable comment section
self.add_comment_button.disabled = False
self.comment_text_field.disabled = False
@@ -308,6 +325,36 @@ class Documents:
))
self.page.update()
async def _on_download_button_click(self, e):
"""Handles the download of the final document."""
if not self.current_selected_request or not self.current_selected_request.get('document_id'):
self.page.show_dialog(ft.SnackBar(ft.Text("Nu există un document final asociat acestei solicitări."), open=True))
self.page.update()
return
document_id = self.current_selected_request['document_id']
try:
# Fetch document details to get the path
response = requests.get(
f"{self.base_url}/documents/customs/{document_id}",
headers={'Authorization': f'Bearer {self.token}'}
)
if response.status_code == 200:
document_data = response.json()
document_path = document_data.get('path')
if document_path:
download_url = f"{self.base_url}/documents/download?path={document_path}&token={self.token}"
await self.page.launch_url(download_url)
else:
self.page.show_dialog(ft.SnackBar(ft.Text("Calea documentului nu a putut fi găsită."), open=True))
else:
self.page.show_dialog(ft.SnackBar(ft.Text(f"Eroare la preluarea detaliilor documentului: {response.status_code}"), open=True))
except requests.exceptions.RequestException as err:
self.page.show_dialog(ft.SnackBar(ft.Text(f"Eroare de rețea la descărcarea documentului: {err}"), open=True))
except Exception as ex:
self.page.show_dialog(ft.SnackBar(ft.Text(f"A apărut o eroare neașteptată: {ex}"), open=True))
self.page.update()
def _close_dialog(self, e):
self.page.pop_dialog()
self.page.update()