add article and pubications
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user