Carregar ficheiros para "/"
This commit is contained in:
130
statistics_view.py
Normal file
130
statistics_view.py
Normal file
@ -0,0 +1,130 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user