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 typing import Any, cast
from PySide6.QtCore import ( from PySide6.QtCore import (
QByteArray,
QDate, QDate,
QModelIndex, QModelIndex,
QPersistentModelIndex, QPersistentModelIndex,
QPoint, QPoint,
QSettings,
Qt, Qt,
Signal, Signal,
Slot, Slot,
@@ -15,19 +13,25 @@ from PySide6.QtGui import (
QCloseEvent, QCloseEvent,
QColor, QColor,
) )
from PySide6.QtSql import QSqlTableModel from PySide6.QtSql import QSqlQuery, QSqlTableModel
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QAbstractItemView, QAbstractItemView,
QHBoxLayout,
QHeaderView, QHeaderView,
QLabel,
QMainWindow, QMainWindow,
QProgressBar,
QPushButton,
QSizePolicy,
QStyledItemDelegate, QStyledItemDelegate,
QStyleOptionViewItem, QStyleOptionViewItem,
QWidget,
) )
from docketModel import docketModel 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 ui.MainWindow import Ui_MainWindow
from workers import updateThread from workers import loadCases, updateThread
class dateDelegate(QStyledItemDelegate): class dateDelegate(QStyledItemDelegate):
@@ -115,6 +119,7 @@ class casesModel(QSqlTableModel):
class MainWindow(QMainWindow, Ui_MainWindow): class MainWindow(QMainWindow, Ui_MainWindow):
show_entries = Signal(int) show_entries = Signal(int)
update_status = Signal()
loadThread = None loadThread = None
@@ -169,6 +174,28 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.docketView.horizontalHeader().setSectionResizeMode( self.docketView.horizontalHeader().setSectionResizeMode(
1, QHeaderView.ResizeMode.Stretch 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 return
def closeEvent(self, event: QCloseEvent) -> None: def closeEvent(self, event: QCloseEvent) -> None:
@@ -176,6 +203,48 @@ class MainWindow(QMainWindow, Ui_MainWindow):
super().closeEvent(event) super().closeEvent(event)
return 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 @Slot(QModelIndex) # type: ignore
def rowClicked(self, index: QModelIndex) -> None: def rowClicked(self, index: QModelIndex) -> None:
if not index.isValid(): if not index.isValid():

View File

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