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:
@@ -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,7 +119,8 @@ 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
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> 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():
|
||||||
|
|||||||
68
workers.py
68
workers.py
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user