Files
Inf_Tec_Auto/version_control.py
2024-12-19 09:04:47 -08:00

189 lines
6.8 KiB
Python

from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QPushButton,
QTableWidget, QTableWidgetItem, QHeaderView,
QMessageBox, QInputDialog, QFileDialog)
from PySide6.QtCore import Qt
from database import get_session
from models import Document, DocumentVersion
import os
import shutil
from datetime import datetime
class VersionControl(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.current_document = None
self.setup_ui()
def setup_ui(self):
layout = QVBoxLayout(self)
# Buttons
button_layout = QHBoxLayout()
self.new_version_btn = QPushButton("Nova Versão")
self.new_version_btn.clicked.connect(self.create_new_version)
self.restore_btn = QPushButton("Restaurar Versão")
self.restore_btn.clicked.connect(self.restore_version)
button_layout.addWidget(self.new_version_btn)
button_layout.addWidget(self.restore_btn)
layout.addLayout(button_layout)
# Versions table
self.versions_table = QTableWidget()
self.versions_table.setColumnCount(4)
self.versions_table.setHorizontalHeaderLabels([
"Versão", "Data de Criação", "Alterações", "Caminho"
])
header = self.versions_table.horizontalHeader()
header.setSectionResizeMode(QHeaderView.Stretch)
layout.addWidget(self.versions_table)
def load_document(self, doc_id):
session = get_session()
self.current_document = session.query(Document).get(doc_id)
self.refresh_versions()
session.close()
def refresh_versions(self):
if not self.current_document:
return
session = get_session()
versions = session.query(DocumentVersion)\
.filter(DocumentVersion.document_id == self.current_document.id)\
.order_by(DocumentVersion.version_number.desc())\
.all()
self.versions_table.setRowCount(len(versions))
for row, version in enumerate(versions):
self.versions_table.setItem(row, 0,
QTableWidgetItem(str(version.version_number)))
self.versions_table.setItem(row, 1,
QTableWidgetItem(version.created_at.strftime("%Y-%m-%d %H:%M:%S")))
self.versions_table.setItem(row, 2,
QTableWidgetItem(version.changes or ""))
self.versions_table.setItem(row, 3,
QTableWidgetItem(version.file_path))
session.close()
def create_new_version(self):
if not self.current_document:
return
# Get new file
file_path, _ = QFileDialog.getOpenFileName(
self,
"Selecionar Nova Versão",
"",
"Todos os Arquivos (*)"
)
if not file_path:
return
# Get change description
changes, ok = QInputDialog.getMultiLineText(
self,
"Descrição das Alterações",
"Descreva as alterações feitas nesta versão:"
)
if not ok:
return
try:
session = get_session()
# Get next version number
latest_version = session.query(DocumentVersion)\
.filter(DocumentVersion.document_id == self.current_document.id)\
.order_by(DocumentVersion.version_number.desc())\
.first()
next_version = 1 if not latest_version else latest_version.version_number + 1
# Create version directory if it doesn't exist
doc_dir = os.path.dirname(self.current_document.file_path)
versions_dir = os.path.join(doc_dir, "versions")
os.makedirs(versions_dir, exist_ok=True)
# Copy file to versions directory
new_file_name = f"v{next_version}_{os.path.basename(file_path)}"
new_file_path = os.path.join(versions_dir, new_file_name)
shutil.copy2(file_path, new_file_path)
# Create new version record
new_version = DocumentVersion(
document_id=self.current_document.id,
version_number=next_version,
file_path=new_file_path,
changes=changes
)
session.add(new_version)
session.commit()
# Update current document
self.current_document.file_path = file_path
session.commit()
self.refresh_versions()
QMessageBox.information(self, "Sucesso",
"Nova versão criada com sucesso!")
except Exception as e:
QMessageBox.critical(self, "Erro",
f"Erro ao criar nova versão: {str(e)}")
finally:
session.close()
def restore_version(self):
current_row = self.versions_table.currentRow()
if current_row < 0:
QMessageBox.warning(self, "Aviso",
"Selecione uma versão para restaurar.")
return
version_path = self.versions_table.item(current_row, 3).text()
if not os.path.exists(version_path):
QMessageBox.critical(self, "Erro",
"Arquivo da versão não encontrado.")
return
reply = QMessageBox.question(
self,
"Confirmar Restauração",
"Tem certeza que deseja restaurar esta versão? A versão atual será salva como uma nova versão.",
QMessageBox.Yes | QMessageBox.No
)
if reply == QMessageBox.Yes:
try:
session = get_session()
# Create new version from current state
current_version = DocumentVersion(
document_id=self.current_document.id,
version_number=self.current_document.versions[-1].version_number + 1,
file_path=self.current_document.file_path,
changes="Versão automática antes da restauração"
)
session.add(current_version)
# Restore selected version
shutil.copy2(version_path, self.current_document.file_path)
session.commit()
self.refresh_versions()
QMessageBox.information(self, "Sucesso",
"Versão restaurada com sucesso!")
except Exception as e:
QMessageBox.critical(self, "Erro",
f"Erro ao restaurar versão: {str(e)}")
finally:
session.close()