Source code for lib_openmolar.client.qt4.patient_records.pages.page_treatment
#! /usr/bin/env python
# -*- coding: utf-8 -*-
###############################################################################
## ##
## Copyright 2010-2012, Neil Wallace <neil@openmolar.com> ##
## ##
## This program is free software: you can redistribute it and/or modify ##
## it under the terms of the GNU General Public License as published by ##
## the Free Software Foundation, either version 3 of the License, or ##
## (at your option) any later version. ##
## ##
## This program is distributed in the hope that it will be useful, ##
## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
## GNU General Public License for more details. ##
## ##
## You should have received a copy of the GNU General Public License ##
## along with this program. If not, see <http://www.gnu.org/licenses/>. ##
## ##
###############################################################################
from PyQt4 import QtCore, QtGui
from lib_openmolar.common.db_orm import InsertableRecord
from lib_openmolar.common.db_orm import TreatmentItem
from lib_openmolar.client.qt4.dialogs import TreatmentItemFinaliseDialog
[docs]class TreatmentPage(QtGui.QWidget):
[docs] def __init__(self, parent = None):
QtGui.QWidget.__init__(self, parent)
self.patient = None
self.label = QtGui.QLabel()
self.label.setWordWrap(True)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.tree_view = QtGui.QTreeView()
self.tree_view.setAlternatingRowColors(True)
self.tree_view.setModel(SETTINGS.treatment_model.tree_model)
self.show_fee_widget_button = QtGui.QPushButton(_("Procedure Codes"))
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.label)
layout.addWidget(self.tree_view)
layout.addWidget(self.show_fee_widget_button)
self.treatment_item_finalise_dialog = TreatmentItemFinaliseDialog(self)
self.clear()
self.connect_signals()
[docs] def sizeHint(self):
return QtCore.QSize(400,400)
[docs] def minimumSizeHint(self):
return QtCore.QSize(300,300)
[docs] def Advise(self, *args):
if __name__ == "__main__":
print args
self.emit(QtCore.SIGNAL("Advise"), *args)
[docs] def connect_signals(self, connect=True):
self.show_fee_widget_button.clicked.connect(self._call_fee_widget)
self.tree_view.clicked.connect(self.treatment_item_selected)
def _call_fee_widget(self):
'''
the "procedure codes" button has been pressed, emit a signal
'''
self.emit(QtCore.SIGNAL("Show Fee Widget"))
[docs] def treatment_item_selected(self, index):
item = self.tree_view.model().data(index, QtCore.Qt.UserRole)
if not item:
return
action1 = QtGui.QAction(_("&Complete"), self)
action2 = QtGui.QAction(_("&Undo"), self)
action3 = QtGui.QAction(_("&Delete"), self)
menu = QtGui.QMenu(self)
if not item.is_completed:
menu.addAction(action1)
else:
menu.addAction(action2)
menu.addAction(action3)
menu.addSeparator()
menu.addAction(_("Cancel"))
pos = self.tree_view.visualRect(index).bottomRight()
result = menu.exec_(self.tree_view.mapToGlobal(pos))
if not result:
return
if result == action1:
self.complete_treatment_item(item)
elif result == action2:
self.complete_treatment_item(item, completed=False)
elif result == action3:
self.remove_treatment_item(item)
[docs] def add_treatment_item(self, treatment_item):
'''
adds a treatment item
'''
patient = SETTINGS.current_patient
if patient is None:
self.Advise(_("No Patient Loaded"))
return
if treatment_item.is_completed:
treatment_item.set_cmp_date()
if SETTINGS.current_practitioner:
treatment_item.set_tx_clinician(
SETTINGS.current_practitioner.id)
while not patient.treatment_model.add_treatment_item(
treatment_item):
dl = self.treatment_item_finalise_dialog
dl.set_known_teeth(patient.dent_key)
if not dl.get_info(treatment_item):
return
self.expand_all()
self.Advise(u"%s %s"%(_("added to treatment plan"),
treatment_item.description))
[docs] def remove_treatment_item(self, treatment_item):
'''
removes a treatment item
'''
patient = SETTINGS.current_patient
if patient is None:
self.Advise(_("No Patient Loaded"))
return
patient.treatment_model.remove_treatment_item(treatment_item)
self.expand_all()
[docs] def complete_treatment_item(self, treatment_item, completed=True):
'''
completes a treatment item
'''
patient = SETTINGS.current_patient
if patient is None:
self.Advise(_("No Patient Loaded"))
return
while not patient.treatment_model.complete_treatment_item(
treatment_item, completed):
dl = self.treatment_item_finalise_dialog
if self.patient:
dl.set_known_teeth(self.patient.dent_key)
if not dl.get_info(treatment_item, completing=True):
return
self.expand_all()
[docs] def proc_code_selected(self, proc_code):
'''
a raw procedure code has been selected
(from the :doc:`ProcCodeWidget`)
convert to a :doc:`TreatmentItem`, validate and pass to
:func:`add_treatment_item`
'''
treatment_item = TreatmentItem(proc_code)
self.add_treatment_item(treatment_item)
[docs] def chart_treatment_added(self, tooth_data, plan_or_cmp):
'''
treatment has been added using the charts page
if this is not understood, the following signal is emitted
QtCore.SIGNAL("garbage chart tx")
'''
proc_code = tooth_data.proc_code
if proc_code == None:
proc_code = SETTINGS.PROCEDURE_CODES.convert_user_shortcut(
tooth_data.tx_input)
if proc_code == None:
self.emit(QtCore.SIGNAL("garbage chart tx"))
return
treatment_item = TreatmentItem(proc_code)
treatment_item.set_teeth([tooth_data.tooth_id])
treatment_item.set_surfaces(tooth_data.surfaces)
if plan_or_cmp == "Completed":
treatment_item.set_completed(True)
treatment_item.set_cmp_date(QtCore.QDate.currentDate())
self.add_treatment_item(treatment_item)
self.emit(QtCore.SIGNAL("valid chart tx"))
[docs] def clear(self):
self.patient = None
self.label.setText("no patient loaded")
SETTINGS.treatment_model.clear()
[docs] def load_patient(self):
patient = SETTINGS.current_patient
self.patient = patient
if patient:
self.label.setText(u"Treatments for %s"% patient.full_name)
else:
self.clear()
self.expand_all()
[docs] def expand_all(self):
patient = SETTINGS.current_patient
if patient:
self.tree_view.expandAll()
for i in range(patient.treatment_model.tree_model.columnCount()):
self.tree_view.resizeColumnToContents(i)
class _TestDialog(QtGui.QDialog):
def __init__(self, parent=None):
super(_TestDialog, self).__init__(parent)
self.proc_code_dock_widget = None
self.page = TreatmentPage(self)
toolbar = QtGui.QToolBar(self)
test_all = QtGui.QAction("Add all txs", self)
test_all.triggered.connect(self.test_all)
toolbar.addAction(test_all)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.page)
layout.addWidget(toolbar)
self.connect_signals()
self.page.load_patient()
def connect_signals(self):
self.connect(self.page, QtCore.SIGNAL("Show Fee Widget"),
self.call_fee_widget)
def call_fee_widget(self):
if self.proc_code_dock_widget != None:
state = self.proc_code_dock_widget.isVisible()
self.proc_code_dock_widget.setVisible(not state)
return
from lib_openmolar.client.qt4.widgets.procedures.proc_code_widget \
import ProcCodeDockWidget
self.proc_code_dock_widget = ProcCodeDockWidget(self)
self.connect(self.proc_code_dock_widget,
QtCore.SIGNAL("Code Selected"), self.page.proc_code_selected)
self.proc_code_dock_widget.show()
self.proc_code_dock_widget.setFloating(True)
def test_all(self):
'''
iterate over the procedure codes, and show them all
'''
for code in SETTINGS.PROCEDURE_CODES:
self.page.proc_code_selected(code)
if __name__ == "__main__":
app = QtGui.QApplication([])
from lib_openmolar.client.connect import DemoClientConnection
from lib_openmolar.client.db_orm import PatientModel
cc = DemoClientConnection()
cc.connect()
pt = PatientModel(1)
SETTINGS.set_current_patient(pt)
pt.treatment_model.update_views()
dl = _TestDialog()
dl.exec_()