from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTableWidget, QTableWidgetItem, QHeaderView) from PySide6.QtCore import Qt from PySide6.QtCharts import QChart, QChartView, QPieSeries, QBarSeries, QBarSet from PySide6.QtGui import QPainter from database import get_session from models import Document, Folder, Statistics import json import os from datetime import datetime class StatisticsView(QWidget): def __init__(self, parent=None): super().__init__(parent) self.setup_ui() def setup_ui(self): layout = QVBoxLayout(self) # Refresh button self.refresh_btn = QPushButton("Atualizar Estatísticas") self.refresh_btn.clicked.connect(self.update_statistics) layout.addWidget(self.refresh_btn) # Summary layout summary_layout = QHBoxLayout() # Total documents self.total_docs_label = QLabel("Total de Documentos: 0") summary_layout.addWidget(self.total_docs_label) # Total folders self.total_folders_label = QLabel("Total de Pastas: 0") summary_layout.addWidget(self.total_folders_label) # Storage used self.storage_label = QLabel("Espaço Utilizado: 0 MB") summary_layout.addWidget(self.storage_label) layout.addLayout(summary_layout) # Charts layout charts_layout = QHBoxLayout() # Document types chart self.types_chart = QChart() self.types_chart.setTitle("Documentos por Tipo") types_view = QChartView(self.types_chart) types_view.setRenderHint(QPainter.RenderHint.Antialiasing) charts_layout.addWidget(types_view) # Brands chart self.brands_chart = QChart() self.brands_chart.setTitle("Documentos por Marca") brands_view = QChartView(self.brands_chart) brands_view.setRenderHint(QPainter.RenderHint.Antialiasing) charts_layout.addWidget(brands_view) layout.addLayout(charts_layout) self.update_statistics() def update_statistics(self): session = get_session() try: # Count documents and folders total_docs = session.query(Document).count() total_folders = session.query(Folder).count() # Calculate storage used storage_used = 0 for doc in session.query(Document).all(): if os.path.exists(doc.file_path): storage_used += os.path.getsize(doc.file_path) for version in doc.versions: if os.path.exists(version.file_path): storage_used += os.path.getsize(version.file_path) # Update labels self.total_docs_label.setText(f"Total de Documentos: {total_docs}") self.total_folders_label.setText(f"Total de Pastas: {total_folders}") self.storage_label.setText( f"Espaço Utilizado: {storage_used / (1024*1024):.2f} MB") # Document types statistics types_series = QPieSeries() types_count = {} for doc in session.query(Document).all(): types_count[doc.tipo_documento] = types_count.get( doc.tipo_documento, 0) + 1 for doc_type, count in types_count.items(): types_series.append(f"{doc_type} ({count})", count) self.types_chart.removeAllSeries() self.types_chart.addSeries(types_series) # Brands statistics brands_series = QBarSeries() brands_count = {} for doc in session.query(Document).all(): brands_count[doc.marca] = brands_count.get(doc.marca, 0) + 1 brands_set = QBarSet("Marcas") brands = list(brands_count.keys()) values = [brands_count[brand] for brand in brands] brands_set.append(values) brands_series.append(brands_set) self.brands_chart.removeAllSeries() self.brands_chart.addSeries(brands_series) # Save statistics stats = Statistics( date=datetime.utcnow(), total_documents=total_docs, total_folders=total_folders, documents_by_type=json.dumps(types_count), documents_by_brand=json.dumps(brands_count), storage_used=storage_used ) session.add(stats) session.commit() except Exception as e: print(f"Error updating statistics: {str(e)}") finally: session.close()