Source code for lib_openmolar.client.db_orm.treatment_model
#! /usr/bin/env python
# -*- coding: utf-8 -*-
###############################################################################
## ##
## Copyright 2010, Neil Wallace <rowinggolfer@googlemail.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/>. ##
## ##
###############################################################################
'''
Provides the TreatmentModel Class
'''
import logging
from PyQt4 import QtCore, QtSql
from lib_openmolar.common.datatypes import OMType
from lib_openmolar.common import common_db_orm
from lib_openmolar.client.qt4.widgets import ChartDataModel
from lib_openmolar.client.qt4.widgets import ToothData
from lib_openmolar.client.qt4.widgets import TreatmentTreeModel
[docs]class TreatmentModel(object):
[docs] def __init__(self):
'''
instanciates with no params
'''
self.tree_model = TreatmentTreeModel()
#:a pointer to the treatment plan :doc:`ChartDataModel`
self.plan_tx_chartmodel = ChartDataModel()
#:a pointer to the treatment completed :doc:`ChartDataModel`
self.cmp_tx_chartmodel = ChartDataModel()
self._treatment_items = []
self._deleted_items = []
[docs] def load_patient(self, patient_id):
'''
:param patient_id: integer
'''
#:
self.patient_id = patient_id
self.clear()
self.get_records()
[docs] def clear(self):
'''
reset this model
'''
LOGGER.debug("clearing treatment_model")
self._treatment_items = []
self._deleted_items = []
self.plan_tx_chartmodel.clear()
self.cmp_tx_chartmodel.clear()
self.tree_model.update_treatments()
[docs] def get_records(self):
'''
pulls all treatment items in the database
(for the patient with the id specified at class initiation)
'''
## long query - only time will tell if this is a performance hit
if not self.patient_id:
return
query = '''select
treatments.ix, patient_id, parent_id, om_code, description,
completed, comment, px_clinician, tx_clinician, tx_date, added_by
from treatments
left join procedure_codes on procedure_codes.code = treatments.om_code
where patient_id = ?'''
q_query = QtSql.QSqlQuery(SETTINGS.psql_conn)
q_query.prepare(query)
q_query.addBindValue(self.patient_id)
q_query.exec_()
while q_query.next():
record = q_query.record()
treatment_item = common_db_orm.TreatmentItem(record)
self.add_treatment_item(treatment_item)
@property
[docs] def treatment_items(self):
'''
returns a list of all :doc:`TreatmentItem` in the model
'''
return self._treatment_items
@property
[docs] def deleted_items(self):
'''
returns a list of all :doc:`TreatmentItem` which have been deleted
'''
return self._deleted_items
@property
[docs] def is_dirty(self):
'''
will return True if the model differs from that in the database
'''
if self.deleted_items != []:
return True
dirty = False
for treatment_item in self.treatment_items:
dirty = dirty or not treatment_item.in_database
return dirty
[docs] def add_treatment_item(self, treatment_item):
'''
add a :doc:`TreatmentItem` Object
returns True if the TreatmentItem is valid, else False
'''
if treatment_item.is_valid:
self._treatment_items.append(treatment_item)
if treatment_item.is_chartable:
self.add_to_chart_model(treatment_item)
self.tree_model.update_treatments()
return True
LOGGER.debug(treatment_item.errors)
if treatment_item.in_database:
raise IOError, "invalid treatment in database treatments id=%s"% (
treatment_item.id.toInt()[0])
return False
[docs] def add_to_chart_model(self, treatment_item):
'''
represent the treatment_item on the charts page somehow.
'''
if treatment_item.is_completed:
chartmodel = self.cmp_tx_chartmodel
else:
chartmodel = self.plan_tx_chartmodel
for data in treatment_item.metadata:
tooth_data = ToothData(data.tooth)
tooth_data.from_treatment_item_metadata(data)
chartmodel.add_property(tooth_data)
chartmodel.endResetModel()
[docs] def remove_treatment_item(self, treatment_item):
'''
removes a :doc:`TreatmentItem` Object
'''
self._treatment_items.remove(treatment_item)
self._deleted_items.append(treatment_item)
if treatment_item.is_chartable:
self.update_chart_models()
self.tree_model.update_treatments()
[docs] def complete_treatment_item(self, treatment_item, completed=True):
'''
:param: treatment_item (:doc:`TreatmentItem`)
:kword: completed=bool (default True)
toggles the state of a :doc:`TreatmentItem` to completed
'''
orig_value = treatment_item.is_completed
treatment_item.set_completed(completed)
treatment_item.set_cmp_date()
if not treatment_item.is_valid:
treatment_item.set_completed(orig_value)
return False
if treatment_item.is_chartable:
self.update_chart_models()
self.tree_model.update_treatments()
return True
[docs] def update_chart_models(self):
'''
completely reloads the chart models.
'''
self.cmp_tx_chartmodel.clear()
self.plan_tx_chartmodel.clear()
for treatment_item in self.treatment_items:
if treatment_item.is_completed:
chartmodel = self.cmp_tx_chartmodel
else:
chartmodel = self.plan_tx_chartmodel
for data in treatment_item.metadata:
tooth_data = ToothData(data.tooth)
tooth_data.from_treatment_item_metadata(data)
chartmodel.add_property(tooth_data)
self.cmp_tx_chartmodel.endResetModel()
self.plan_tx_chartmodel.endResetModel()
[docs] def update_views(self):
'''
this should be called after adding to the model
update all submodels (treeview, charts etc.)
'''
self.tree_model.update_treatments()
self.cmp_tx_chartmodel.endResetModel()
self.plan_tx_chartmodel.endResetModel()
[docs] def commit_changes(self):
'''
push all changes to the database
'''
if not self.is_dirty:
return
result = True
for item in self.treatment_items:
if not item.in_database:
result = result and self.commit_item(item)
for item in self.deleted_items:
#sliently drop any items which never got committed
if item.in_database:
print "remove", item, "from database"
return result
[docs] def commit_item(self, item):
'''
Commit the item to the database
'''
return item.commit_to_db(SETTINGS.psql_conn)
if __name__ == "__main__":
logging.basicConfig(level = logging.DEBUG)
from lib_openmolar.client.connect import DemoClientConnection
from lib_openmolar.client.db_orm import PatientModel
cc = DemoClientConnection()
cc.connect()
pt = PatientModel(1)
obj = pt.treatment_model
for record in obj.treatment_items:
print record
print record.metadata