# Module `Gnumed.business.gmExternalCare`

GNUmed external care classes.

Expand source code

    # -*- coding: utf-8 -*-
    """GNUmed external care classes.
    """
    #============================================================
    __author__ = "K.Hilbert <Karsten.Hilbert@gmx.net>"
    __license__ = "GPL v2 or later"

    # standard libs
    import sys
    import logging

    if __name__ == '__main__':
            sys.path.insert(0, '../../')
            _ = lambda x:x

    from Gnumed.pycommon import gmBusinessDBObject
    from Gnumed.pycommon import gmPG2
    from Gnumed.pycommon import gmTools

    from Gnumed.business import gmOrganization

    _log = logging.getLogger('gm.ext_care')

    #============================================================
    _SQL_get_external_care_items = """SELECT * FROM clin.v_external_care WHERE %s"""

    class cExternalCareItem(gmBusinessDBObject.cBusinessDBObject):
            """Represents an external care item.

            Note: Upon saving .issue being (non-empty AND not None) will
            override .fk_health_issue (IOW, if your code wants to set
            .fk_health_issue to something other than NULL it needs to
            unset .issue explicitly (to u'' or None)).
            """
            _cmd_fetch_payload = _SQL_get_external_care_items % "pk_external_care = %s"
            _cmds_store_payload = [
                    """UPDATE clin.external_care SET
                                    comment = gm.nullify_empty_string(%(comment)s),
                                    fk_encounter = %(pk_encounter)s,
                                    issue = gm.nullify_empty_string(%(issue)s),
                                    provider = gm.nullify_empty_string(%(provider)s),
                                    fk_org_unit = %(pk_org_unit)s,
                                    inactive = %(inactive)s,
                                    fk_health_issue = (
                                            CASE
                                                    WHEN gm.is_null_or_blank_string(%(issue)s) IS TRUE THEN %(pk_health_issue)s
                                                    ELSE NULL
                                            END
                                    )::integer
                            WHERE
                                    pk = %(pk_external_care)s
                                            AND
                                    xmin = %(xmin_external_care)s
                            RETURNING
                                    xmin AS xmin_external_care
                    """,
                    _SQL_get_external_care_items % "pk_external_care = %(pk_external_care)s"
            ]
            _updatable_fields = [
                    'pk_encounter',
                    'pk_health_issue',
                    'pk_org_unit',
                    'issue',
                    'provider',
                    'comment',
                    'inactive'
            ]
            #--------------------------------------------------------
            def format(self, with_health_issue=True, with_address=False, with_comms=False):
                    lines = []
                    lines.append(_('External care%s             #%s') % (
                            gmTools.bool2subst (
                                    self._payload[self._idx['inactive']],
                                    ' (%s)' % _('inactive'),
                                    '',
                                    ' [ERROR: .inactive is NULL]'
                            ),
                            self._payload[self._idx['pk_external_care']]
                    ))
                    if with_health_issue:
                            if self._payload[self._idx['pk_health_issue']] is None:
                                    lines.append(' ' + _('Issue: %s') % self._payload[self._idx['issue']])
                            else:
                                    lines.append(' ' + _('Health issue: %s') % self._payload[self._idx['issue']])
                                    lines.append('  (' + _('also treated here') + ')')
                    if self._payload[self._idx['provider']] is not None:
                            lines.append(' ' + _('Provider: %s') % self._payload[self._idx['provider']])
                    lines.append(' ' + _('Location: %s@%s') % (self._payload[self._idx['unit']], self._payload[self._idx['organization']]))
                    unit = self.org_unit
                    if with_address:
                            adr = unit.address
                            if adr is not None:
                                    lines.extend(adr.format())
                    if with_comms:
                            for comm in unit.comm_channels:
                                    lines.append('  %s: %s%s' % (
                                            comm['l10n_comm_type'],
                                            comm['url'],
                                            gmTools.bool2subst(comm['is_confidential'], _(' (confidential)'), '', '')
                                    ))
                    if self._payload[self._idx['comment']] is not None:
                            lines.append('')
                            lines.append(' ' + self._payload[self._idx['comment']])

                    return lines
            #--------------------------------------------------------
            def _get_org_unit(self):
                    return gmOrganization.cOrgUnit(self._payload[self._idx['pk_org_unit']])

            org_unit = property(_get_org_unit, lambda x:x)

    #------------------------------------------------------------
    def get_external_care_items(order_by=None, pk_identity=None, pk_health_issue=None, exclude_inactive=False, return_pks=False):

            args = {
                    'pk_pat': pk_identity,
                    'pk_issue': pk_health_issue
            }
            where_parts = []
            if pk_identity is not None:
                    where_parts.append('pk_identity = %(pk_pat)s')
            if pk_health_issue is not None:
                    where_parts.append('pk_health_issue = %(pk_issue)s')
            if exclude_inactive is True:
                    where_parts.append('inactive IS FALSE')

            if len(where_parts) == 0:
                    where = 'TRUE'
            else:
                    where = ' AND '.join(where_parts)

            if order_by is not None:
                    where = '%s ORDER BY %s' % (
                            where,
                            order_by
                    )

            cmd = _SQL_get_external_care_items % where
            rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}], get_col_idx = True)
            if return_pks:
                    return [ r['pk_external_care'] for r in rows ]
            return [ cExternalCareItem(row = {'data': r, 'idx': idx, 'pk_field': 'pk_external_care'}) for r in rows ]

    #------------------------------------------------------------
    def create_external_care_item(pk_health_issue=None, issue=None, pk_org_unit=None, pk_encounter=None):
            args = {
                    'pk_health_issue': pk_health_issue,
                    'issue': issue,
                    'pk_org_unit': pk_org_unit,
                    'enc': pk_encounter
            }
            cmd = """
                    INSERT INTO clin.external_care (
                            issue,
                            fk_health_issue,
                            fk_encounter,
                            fk_org_unit
                    ) VALUES (
                            gm.nullify_empty_string(%(issue)s),
                            (CASE
                                    WHEN gm.is_null_or_blank_string(%(issue)s) IS TRUE THEN %(pk_health_issue)s
                                    ELSE NULL
                            END)::integer,
                            %(enc)s,
                            %(pk_org_unit)s
                    )
                    RETURNING pk"""
            rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True, get_col_idx = False)

            return cExternalCareItem(aPK_obj = rows[0]['pk'])

    #------------------------------------------------------------
    def delete_external_care_item(pk_external_care=None):
            args = {'pk': pk_external_care}
            cmd = "DELETE FROM clin.external_care WHERE pk = %(pk)s"
            gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}])
            return True

    #============================================================
    # main
    #------------------------------------------------------------
    if __name__ == "__main__":

            if len(sys.argv) == 1:
                    sys.exit()

            if sys.argv[1] != 'test':
                    sys.exit()

            #from Gnumed.pycommon import gmLog2
            #-----------------------------------------
            def test_get_care_items():
                    for item in get_external_care_items(pk_identity = 12, order_by = 'provider'):
                            print(item.format())

            #-----------------------------------------
            test_get_care_items()

## Functions

`def create_external_care_item(pk_health_issue=None, issue=None, pk_org_unit=None, pk_encounter=None)`
  Expand source code

      def create_external_care_item(pk_health_issue=None, issue=None, pk_org_unit=None, pk_encounter=None):
              args = {
                      'pk_health_issue': pk_health_issue,
                      'issue': issue,
                      'pk_org_unit': pk_org_unit,
                      'enc': pk_encounter
              }
              cmd = """
                      INSERT INTO clin.external_care (
                              issue,
                              fk_health_issue,
                              fk_encounter,
                              fk_org_unit
                      ) VALUES (
                              gm.nullify_empty_string(%(issue)s),
                              (CASE
                                      WHEN gm.is_null_or_blank_string(%(issue)s) IS TRUE THEN %(pk_health_issue)s
                                      ELSE NULL
                              END)::integer,
                              %(enc)s,
                              %(pk_org_unit)s
                      )
                      RETURNING pk"""
              rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True, get_col_idx = False)

              return cExternalCareItem(aPK_obj = rows[0]['pk'])

`def delete_external_care_item(pk_external_care=None)`
  Expand source code

      def delete_external_care_item(pk_external_care=None):
              args = {'pk': pk_external_care}
              cmd = "DELETE FROM clin.external_care WHERE pk = %(pk)s"
              gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}])
              return True

`def get_external_care_items(order_by=None, pk_identity=None, pk_health_issue=None, exclude_inactive=False, return_pks=False)`
  Expand source code

      def get_external_care_items(order_by=None, pk_identity=None, pk_health_issue=None, exclude_inactive=False, return_pks=False):

              args = {
                      'pk_pat': pk_identity,
                      'pk_issue': pk_health_issue
              }
              where_parts = []
              if pk_identity is not None:
                      where_parts.append('pk_identity = %(pk_pat)s')
              if pk_health_issue is not None:
                      where_parts.append('pk_health_issue = %(pk_issue)s')
              if exclude_inactive is True:
                      where_parts.append('inactive IS FALSE')

              if len(where_parts) == 0:
                      where = 'TRUE'
              else:
                      where = ' AND '.join(where_parts)

              if order_by is not None:
                      where = '%s ORDER BY %s' % (
                              where,
                              order_by
                      )

              cmd = _SQL_get_external_care_items % where
              rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}], get_col_idx = True)
              if return_pks:
                      return [ r['pk_external_care'] for r in rows ]
              return [ cExternalCareItem(row = {'data': r, 'idx': idx, 'pk_field': 'pk_external_care'}) for r in rows ]

## Classes

`class cExternalCareItem (aPK_obj=None, row: dict = None, link_obj=None)`

  Represents an external care item.

  Note: Upon saving .issue being (non-empty AND not None) will override .fk_health_issue (IOW, if your code wants to set .fk_health_issue to something other than NULL it needs to unset .issue explicitly (to u'' or None)).

  Init business object.

  Call from child classes like so:

          super().__init__(aPK_obj = aPK_obj, row = row, link_obj = link_obj)

  ## Args

  `aPK_obj`
    retrieve data from backend * a simple value the primary key WHERE condition must be a simple column * a dictionary of values the primary key WHERE condition must be a subselect consuming the dict and producing the single-value primary key
  `row`
    must hold the fields * idx: a dict mapping field names to position * data: the field values in a list (as returned by cursor.fetchone() in the DB-API) * pk_field: the name of the primary key field OR * pk_obj: a dictionary suitable for passed to cursor.execute and holding the primary key values, used for composite PKs

  ## Examples

  row = { 'data': rows[0], 'idx': idx, 'pk_field': 'pk_XXX (the PK column name)', 'pk_obj': {'pk_col1': pk_col1_val, 'pk_col2': pk_col2_val} } rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}], get_col_idx = True) objects = [ cChildClass(row = {'data': r, 'idx': idx, 'pk_field': 'the PK column name'}) for r in rows ]

  Expand source code

      class cExternalCareItem(gmBusinessDBObject.cBusinessDBObject):
              """Represents an external care item.

              Note: Upon saving .issue being (non-empty AND not None) will
              override .fk_health_issue (IOW, if your code wants to set
              .fk_health_issue to something other than NULL it needs to
              unset .issue explicitly (to u'' or None)).
              """
              _cmd_fetch_payload = _SQL_get_external_care_items % "pk_external_care = %s"
              _cmds_store_payload = [
                      """UPDATE clin.external_care SET
                                      comment = gm.nullify_empty_string(%(comment)s),
                                      fk_encounter = %(pk_encounter)s,
                                      issue = gm.nullify_empty_string(%(issue)s),
                                      provider = gm.nullify_empty_string(%(provider)s),
                                      fk_org_unit = %(pk_org_unit)s,
                                      inactive = %(inactive)s,
                                      fk_health_issue = (
                                              CASE
                                                      WHEN gm.is_null_or_blank_string(%(issue)s) IS TRUE THEN %(pk_health_issue)s
                                                      ELSE NULL
                                              END
                                      )::integer
                              WHERE
                                      pk = %(pk_external_care)s
                                              AND
                                      xmin = %(xmin_external_care)s
                              RETURNING
                                      xmin AS xmin_external_care
                      """,
                      _SQL_get_external_care_items % "pk_external_care = %(pk_external_care)s"
              ]
              _updatable_fields = [
                      'pk_encounter',
                      'pk_health_issue',
                      'pk_org_unit',
                      'issue',
                      'provider',
                      'comment',
                      'inactive'
              ]
              #--------------------------------------------------------
              def format(self, with_health_issue=True, with_address=False, with_comms=False):
                      lines = []
                      lines.append(_('External care%s             #%s') % (
                              gmTools.bool2subst (
                                      self._payload[self._idx['inactive']],
                                      ' (%s)' % _('inactive'),
                                      '',
                                      ' [ERROR: .inactive is NULL]'
                              ),
                              self._payload[self._idx['pk_external_care']]
                      ))
                      if with_health_issue:
                              if self._payload[self._idx['pk_health_issue']] is None:
                                      lines.append(' ' + _('Issue: %s') % self._payload[self._idx['issue']])
                              else:
                                      lines.append(' ' + _('Health issue: %s') % self._payload[self._idx['issue']])
                                      lines.append('  (' + _('also treated here') + ')')
                      if self._payload[self._idx['provider']] is not None:
                              lines.append(' ' + _('Provider: %s') % self._payload[self._idx['provider']])
                      lines.append(' ' + _('Location: %s@%s') % (self._payload[self._idx['unit']], self._payload[self._idx['organization']]))
                      unit = self.org_unit
                      if with_address:
                              adr = unit.address
                              if adr is not None:
                                      lines.extend(adr.format())
                      if with_comms:
                              for comm in unit.comm_channels:
                                      lines.append('  %s: %s%s' % (
                                              comm['l10n_comm_type'],
                                              comm['url'],
                                              gmTools.bool2subst(comm['is_confidential'], _(' (confidential)'), '', '')
                                      ))
                      if self._payload[self._idx['comment']] is not None:
                              lines.append('')
                              lines.append(' ' + self._payload[self._idx['comment']])

                      return lines
              #--------------------------------------------------------
              def _get_org_unit(self):
                      return gmOrganization.cOrgUnit(self._payload[self._idx['pk_org_unit']])

              org_unit = property(_get_org_unit, lambda x:x)

  ### Ancestors

  - cBusinessDBObject

  ### Instance variables

  `var org_unit`
    Expand source code

        def _get_org_unit(self):
                return gmOrganization.cOrgUnit(self._payload[self._idx['pk_org_unit']])

  ### Inherited members

  - `cBusinessDBObject`:
    - `fields_as_dict`
    - `format`
    - `get_fields`
    - `get_patient`
    - `get_updatable_fields`
    - `is_modified`
    - `patient_pk`
    - `refetch_payload`
    - `same_payload`
    - `save`
    - `save_payload`
    - `staff_id`