Package Gnumed :: Package pycommon :: Module gmBusinessDBObject :: Class cBusinessDBObject |
[frames] | no frames]

# 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 ***********

Instance Methods
__del__(self) | source code
__getitem__(self, attribute) | source code
__init__(self, aPK_obj=None, row=None) Init business object. | source code
__setitem__(self, attribute, value) | source code
__str__(self) str(x) | source code
__unicode__(self) | source code
fields_as_dict(self, date_format=`'``%Y %b %d %H:%M``'`, none_string=`u'````'`, escape_style=None, bool_strings=None) | source code
format(self) | source code
get_fields(self) | source code
get_patient(self) | source code
get_updatable_fields(self) | source code
is_modified(self) | source code
refetch_payload(self, ignore_changes=False) Fetch field values from backend. | source code
same_payload(self, another_object=None) | source code
save(self, conn=None) | source code
save_payload(self, conn=None) Store updated values (if any) in database. | source code
Inherited from `object`: `__delattr__`, `__format__`, `__getattribute__`, `__hash__`, `__new__`, `__reduce__`, `__reduce_ex__`, `__repr__`, `__setattr__`, `__sizeof__`, `__subclasshook__`

Properties
Inherited from `object`: `__class__`

Method Details

### __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)

### save_payload(self, conn=None) | source code
    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()