Class cBusinessDBObject
source code
object --+
|
cBusinessDBObject
- Known Subclasses:
-
- business.gmDocuments.cDocument
- , business.gmDocuments.cDocumentPart
- , business.gmDocuments.cDocumentType
- , business.gmKeywordExpansion.cKeywordExpansion
- , business.gmDemographicRecord.cAddress
- , business.gmDemographicRecord.cCommChannel
- , business.gmDemographicRecord.cIdentityTag
- , business.gmDemographicRecord.cOrgCommChannel
- , business.gmDemographicRecord.cPatientAddress
- , business.gmDemographicRecord.cTagImage
- , business.gmClinNarrative.cNarrative
- , business.gmAllergy.cAllergy
- , business.gmAllergy.cAllergyState
- , business.gmStaff.cStaff
- , business.gmBilling.cBill
- , business.gmBilling.cBillItem
- , business.gmBilling.cBillable
- , business.gmProviderInbox.cDynamicHint
- , business.gmProviderInbox.cInboxMessage
- , business.gmFamilyHistory.cFamilyHistory
- , business.gmPraxis.cPraxisBranch
- , business.gmPathLab.cLabRequest
- , business.gmPathLab.cLabResult
- , business.gmPathLab.cMeasurementType
- , business.gmPathLab.cMetaTestType
- , business.gmPathLab.cTestOrg
- , business.gmPathLab.cTestPanel
- , business.gmPathLab.cTestResult
- , business.gmCoding.cGenericCode
- , business.gmCoding.cGenericLinkedCode
- , business.gmEMRStructItems.cEncounter
- , business.gmEMRStructItems.cEpisode
- , business.gmEMRStructItems.cHealthIssue
- , business.gmEMRStructItems.cHospitalStay
- , business.gmEMRStructItems.cPerformedProcedure
- , business.gmEMRStructItems.cProblem
- , business.gmOrganization.cOrg
- , business.gmOrganization.cOrgUnit
Represents business objects in the database.
Rules:
- instances ARE ASSUMED TO EXIST in the database
- PK construction (aPK_obj): DOES verify its existence on instantiation
(fetching data fails)
- Row construction (row): allowed by using a dict of pairs
field name: field value (PERFORMANCE improvement)
- does NOT verify FK target existence
- does NOT create new entries in the database
- does NOT lazy-fetch fields on access
Class scope SQL commands and variables:
<_cmd_fetch_payload>
- must return exactly one row
- where clause argument values are expected
in self.pk_obj (taken from __init__(aPK_obj))
- must return xmin of all rows that _cmds_store_payload
will be updating, so views must support the xmin columns
of their underlying tables
<_cmds_store_payload>
- one or multiple "update ... set ... where xmin_* = ... and pk* = ..."
statements which actually update the database from the data in self._payload,
- the last query must refetch at least the XMIN values needed to detect
concurrent updates, their field names had better be the same as
in _cmd_fetch_payload,
- the last query CAN return other fields which is particularly
useful when those other fields are computed in the backend
and may thus change upon save but will not have been set by
the client code explicitely - this is only really of concern
if the saved subclass is to be reused after saving rather
than re-instantiated
- when subclasses tend to live a while after save_payload() was
called and they support computed fields (say, _(some_column)
you need to return *all* columns (see cEncounter)
<_updatable_fields>
- a list of fields available for update via object['field']
A template for new child classes:
*********** start of template ***********
#------------------------------------------------------------
from Gnumed.pycommon import gmBusinessDBObject
from Gnumed.pycommon import gmPG2
#============================================================
# short description
#------------------------------------------------------------
# search/replace "" " -> 3 "s
#
# use plural form, search-replace get_XXX
_SQL_get_XXX = u"" "
SELECT *, (xmin AS xmin_XXX)
FROM XXX.v_XXX
WHERE %s
"" "
class cXxxXxx(gmBusinessDBObject.cBusinessDBObject):
"" "Represents ..."" "
_cmd_fetch_payload = _SQL_get_XXX % u"pk_XXX = %s"
_cmds_store_payload = [
u"" "
-- typically the underlying table name
UPDATE xxx.xxx SET
-- typically "table_col = %(view_col)s"
xxx = %(xxx)s,
xxx = gm.nullify_empty_string(%(xxx)s)
WHERE
pk = %(pk_XXX)s
AND
xmin = %(xmin_XXX)s
RETURNING
xmin as xmin_XXX
--, ...
--, ...
"" "
]
# view columns that can be updated:
_updatable_fields = [
u'xxx',
u'xxx'
]
#--------------------------------------------------------
# def format(self):
# return u'%s' % self
#------------------------------------------------------------
def get_XXX(order_by=None):
if order_by is None:
order_by = u'true'
else:
order_by = u'true ORDER BY %s' % order_by
cmd = _SQL_get_XXX % order_by
rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd}], get_col_idx = True)
return [ cXxxXxx(row = {'data': r, 'idx': idx, 'pk_field': 'pk_xxx'}) for r in rows ]
#------------------------------------------------------------
def create_xxx(xxx=None, xxx=None):
args = {
u'xxx': xxx,
u'xxx': xxx
}
cmd = u"" "
INSERT INTO xxx.xxx (
xxx,
xxx,
xxx
) VALUES (
%(xxx)s,
%(xxx)s,
gm.nullify_empty_string(%(xxx)s)
)
RETURNING pk
--RETURNING *
"" "
rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True, get_col_idx = False)
#rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True, get_col_idx = True)
return cXxxXxx(aPK_obj = rows[0]['pk'])
#return cXxxXxx(row = {'data': r, 'idx': idx, 'pk_field': 'pk_XXX'})
#------------------------------------------------------------
def delete_xxx(pk_xxx=None):
args = {'pk': pk_xxx}
cmd = u"DELETE FROM xxx.xxx WHERE pk = %(pk)s"
gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}])
return True
#------------------------------------------------------------
*********** end of template ***********
|
|
|
|
|
|
|
|
|
|
|
|
|
fields_as_dict(self,
date_format=' %Y %b %d %H:%M ' ,
none_string=u'
' ,
escape_style=None,
bool_strings=None) |
source code
|
|
|
|
|
|
|
|
|
|
|
|
|
refetch_payload(self,
ignore_changes=False)
Fetch field values from backend. |
source code
|
|
|
|
|
|
|
|
Inherited from object :
__delattr__ ,
__format__ ,
__getattribute__ ,
__hash__ ,
__new__ ,
__reduce__ ,
__reduce_ex__ ,
__repr__ ,
__setattr__ ,
__sizeof__ ,
__subclasshook__
|
Inherited from object :
__class__
|
__init__(self,
aPK_obj=None,
row=None)
(Constructor)
| source code
|
Init business object.
Call from child classes:
super(cChildClass, self).__init__(aPK_obj = aPK_obj, row = row)
- Overrides:
object.__init__
|
__str__(self)
(Informal representation operator)
| source code
|
str(x)
- Overrides:
object.__str__
- (inherited documentation)
|
Store updated values (if any) in database.
Optionally accepts a pre-existing connection
- returns a tuple (<True|False>, <data>)
- True: success
- False: an error occurred
* data is (error, message)
* for error meanings see gmPG2.run_rw_queries()
|