Add StatusBar information

Updated workers.py to hold "current" values.
Status bar is three widgets, status label, progressbar and load button.

Fixes: #8, #9
This commit is contained in:
Christopher T. Johnson
2025-02-25 15:24:34 -05:00
parent dd9f08aa5e
commit 7a02bbb262
2 changed files with 120 additions and 29 deletions

View File

@@ -1,12 +1,10 @@
from typing import Any, cast
from PySide6.QtCore import (
QByteArray,
QDate,
QModelIndex,
QPersistentModelIndex,
QPoint,
QSettings,
Qt,
Signal,
Slot,
@@ -15,19 +13,25 @@ from PySide6.QtGui import (
QCloseEvent,
QColor,
)
from PySide6.QtSql import QSqlTableModel
from PySide6.QtSql import QSqlQuery, QSqlTableModel
from PySide6.QtWidgets import (
QAbstractItemView,
QHBoxLayout,
QHeaderView,
QLabel,
QMainWindow,
QProgressBar,
QPushButton,
QSizePolicy,
QStyledItemDelegate,
QStyleOptionViewItem,
QWidget,
)
from docketModel import docketModel
from lib.utils import QStyleOptionViewItemInit, readGeometry, writeGeometry
from lib.utils import QStyleOptionViewItemInit, query_error, readGeometry, writeGeometry
from ui.MainWindow import Ui_MainWindow
from workers import updateThread
from workers import loadCases, updateThread
class dateDelegate(QStyledItemDelegate):
@@ -115,7 +119,8 @@ class casesModel(QSqlTableModel):
class MainWindow(QMainWindow, Ui_MainWindow):
show_entries = Signal(int)
update_status = Signal()
loadThread = None
def __init__(self) -> None:
@@ -169,6 +174,28 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.docketView.horizontalHeader().setSectionResizeMode(
1, QHeaderView.ResizeMode.Stretch
)
widget = QWidget()
layout = QHBoxLayout(widget)
self.status = QLabel("Status")
layout.addWidget(self.status)
layout.addStretch()
self.progress = QProgressBar()
self.progress.setRange(0,100)
self.progress.setValue(0)
self.progress.setMinimumWidth(150)
self.progress.setMaximumWidth(150)
self.progress.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Preferred)
layout.addWidget(self.progress)
self.loadButton = QPushButton()
self.loadButton.setObjectName("loadButton")
self.loadButton.setText("Load Cases")
layout.addWidget(self.loadButton)
self.statusbar.addWidget(widget,10)
self.loadButton.clicked.connect(self.loadCases)
self.update_status.connect(self.statusBarUpdate)
self.update_status.emit()
return
def closeEvent(self, event: QCloseEvent) -> None:
@@ -176,6 +203,48 @@ class MainWindow(QMainWindow, Ui_MainWindow):
super().closeEvent(event)
return
@Slot()
def loadCases(self) -> None:
if self.loadThread is None:
self.loadThread = loadCases()
self.loadThread.caseLoaded.connect(self.progress.setValue)
self.loadThread.finished.connect(self.loadCasesDone)
self.loadButton.setEnabled(False)
self.loadThread.start()
return
@Slot()
def loadCasesDone(self) -> None:
self.loadButton.setEnabled(True)
self.update_status.emit()
return
@Slot()
def statusBarUpdate(self) -> None:
if self.loadThread is None:
year = ''
max = 'unknown'
else:
year = self.loadThread.year
max = self.loadThread.number
query = QSqlQuery()
query.prepare("SELECT COUNT(*) AS number_active FROM cases WHERE active=1")
if not query.exec():
query_error(query)
if query.next():
active = query.value('number_active')
query.prepare("select SUBSTRING(docket_id,1,2) AS year, "
"SUBSTRING(docket_id,3,1) AS type, "
"MAX(CAST(SUBSTRING(docket_id,4) AS INTEGER)) AS number "
"FROM cases "
"GROUP BY year, type "
"ORDER BY type, year, number"
"LIMIT 2")
#if not query.exec():
# query_error(query)
msg=f"Oldest: {year}, Active: {active}, Max. Case: {max}"
self.status.setText(msg)
return
@Slot(QModelIndex) # type: ignore
def rowClicked(self, index: QModelIndex) -> None:
if not index.isValid():

View File

@@ -4,7 +4,7 @@ import re
import dateparser
import requests
from bs4 import BeautifulSoup, Tag
from PySide6.QtCore import QDateTime, QThread
from PySide6.QtCore import QDateTime, QThread, Signal
from PySide6.QtSql import QSqlDatabase, QSqlQuery
from lib.utils import query_error
@@ -223,9 +223,17 @@ def update_db(case_id: str, db: QSqlDatabase) -> int:
#
# If there is a linked case, we need to get the ID for that case.
if linked is not None:
#
# If this case is on the Emergency Docket and it is linked to
# a case on the regular docket, then this case is no longer active
#
deactivate = False
linked = linked.replace("Linked with ", "")
for did in linked.split(","):
did = did.strip()
if re.match(r"\d+-\d+$", did):
deactivate = True
query.prepare("SELECT * FROM cases WHERE docket_id = :did")
query.bindValue(":did", linked)
if not query.exec():
@@ -255,6 +263,14 @@ def update_db(case_id: str, db: QSqlDatabase) -> int:
query.bindValue(":rhs", linked_id)
if not query.exec():
query_error(query)
if re.match(r"\d+-\d+$", docket_id):
deactivate = False
if deactivate:
query.prepare("UPDATE cases SET active=0 WHERE case_id = :cid")
query.bindValue(":cid", case_id)
if not query.exec():
query_error(query)
#
# XXX - Process lower courts
#
@@ -295,15 +311,19 @@ class updateThread(QThread):
class loadCases(QThread):
caseLoaded = Signal(int)
year = QDateTime.currentDateTime().toString("yy")
number = 0
def run(self) -> None:
db = QSqlDatabase.cloneDatabase("qt_sql_default_connection", "load")
if not db.open():
raise Exception("db.open()")
year = QDateTime.currentDateTime().toString("yy")
query = QSqlQuery(db)
query.prepare("SELECT * FROM history WHERE year = :year")
print(f"year = {year}")
query.bindValue(":year", year)
print(f"year = {self.year}")
query.bindValue(":year", self.year)
if not query.exec():
query_error(query)
@@ -312,48 +332,49 @@ class loadCases(QThread):
"INSERT INTO history (year, edocket, number) "
"VALUES (:year, 0, 1)"
)
query.bindValue(":year", year)
query.bindValue(":year", self.year)
if not query.exec():
query_error(query)
edocket = 0
number = 1
self.number = 1
history_id = query.lastInsertId()
else:
history_id = query.value("history_id")
edocket = query.value("edocket")
number = query.value("number")
self.number = query.value("number")
count = 0
while year > "00" and count < 100:
while self.year > "00" and count < 100:
self.caseLoaded.emit(count)
query.prepare("SELECT * FROM cases WHERE docket_id = :did")
if edocket == 1:
docket_id = f"{year}A{number}"
docket_id = f"{self.year}A{self.number}"
else:
docket_id = f"{year}-{number}"
docket_id = f"{self.year}-{self.number}"
query.bindValue(":did", docket_id)
if not query.exec():
query_error(query)
if query.next():
if query.value("active") == 0:
print("Already exists and is inactive")
number += 1
self.number += 1
continue
result = update_db(docket_id, db)
print(f"result: {result}")
if result < 0:
year = f"{int(year) - 1:02d}"
if number > 1:
self.year = f"{int(self.year) - 1:02d}"
if self.number > 1:
query.prepare(
"UPDATE history set number = :number WHERE history_id=:hid"
)
query.bindValue(":number", number - 1)
query.bindValue(":number", self.number - 1)
query.bindValue(":hid", history_id)
if not query.exec():
query_error(query)
query.prepare("SELECT * FROM history WHERE year = :year")
print(f"year = {year}")
query.bindValue(":year", year)
print(f"year = {self.year}")
query.bindValue(":year", self.year)
if not query.exec():
query_error(query)
@@ -362,29 +383,30 @@ class loadCases(QThread):
"INSERT INTO history (year, edocket, number) "
"VALUES (:year, 0, 1)"
)
query.bindValue(":year", year)
query.bindValue(":year", self.year)
if not query.exec():
query_error(query)
edocket = 0
number = 1
self.number = 1
history_id = query.lastInsertId()
else:
history_id = query.value("history_id")
edocket = query.value("edocket")
number = query.value("number")
self.number = query.value("number")
continue
number += 1
self.number += 1
count += 1
if number > 1:
if self.number > 1:
query.prepare(
"UPDATE history SET number= :number WHERE year = :year"
)
query.bindValue(":number", number)
query.bindValue(":year", year)
query.bindValue(":number", self.number)
query.bindValue(":year", self.year)
if not query.exec():
query_error(query)
db.close()
del db
QSqlDatabase.removeDatabase("load")
self.caseLoaded.emit(0)
return