diff --git a/MainWindow.py b/MainWindow.py index bca7ccc..21be034 100644 --- a/MainWindow.py +++ b/MainWindow.py @@ -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(): diff --git a/workers.py b/workers.py index 0a02440..c51a664 100644 --- a/workers.py +++ b/workers.py @@ -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