Package Gnumed :: Package business :: Module gmExternalCare |
[frames] | no frames]

# Source Code for Module Gnumed.business.gmExternalCare

      1  # -*- coding: utf-8 -*-
      2  """GNUmed external care classes.
      3  """
      4  #============================================================
      5  __author__ = "K.Hilbert <Karsten.Hilbert@gmx.net>"
      6  __license__ = "GPL v2 or later"
      7
      8  # standard libs
      9  import sys
     10  import logging
     11
     12
     13  if __name__ == '__main__':
     14          sys.path.insert(0, '../../')
     15
     16  from Gnumed.pycommon import gmBusinessDBObject
     17  from Gnumed.pycommon import gmPG2
     18  from Gnumed.pycommon import gmI18N
     19
     20  from Gnumed.business import gmOrganization
     21
     22  if __name__ == '__main__':
     23          gmI18N.activate_locale()
     24          gmI18N.install_domain()
     25
     26  from Gnumed.pycommon import gmTools
     27
     28  _log = logging.getLogger('gm.ext_care')
     29
     30  #============================================================
     31  _SQL_get_external_care_items = """SELECT * FROM clin.v_external_care WHERE %s"""
     32
     33 -class cExternalCareItem(gmBusinessDBObject.cBusinessDBObject):
     34          """Represents an external care item.
     35
     36          Note: Upon saving .issue being (non-empty AND not None) will
     37          override .fk_health_issue (IOW, if your code wants to set
     38          .fk_health_issue to something other than NULL it needs to
     39          unset .issue explicitly (to u'' or None)).
     40          """
     41          _cmd_fetch_payload = _SQL_get_external_care_items % "pk_external_care = %s"
     42          _cmds_store_payload = [
     43                  """UPDATE clin.external_care SET
     44                                  comment = gm.nullify_empty_string(%(comment)s),
     45                                  fk_encounter = %(pk_encounter)s,
     46                                  issue = gm.nullify_empty_string(%(issue)s),
     47                                  provider = gm.nullify_empty_string(%(provider)s),
     48                                  fk_org_unit = %(pk_org_unit)s,
     49                                  inactive = %(inactive)s,
     50                                  fk_health_issue = (
     51                                          CASE
     52                                                  WHEN gm.is_null_or_blank_string(%(issue)s) IS TRUE THEN %(pk_health_issue)s
     53                                                  ELSE NULL
     54                                          END
     55                                  )::integer
     56                          WHERE
     57                                  pk = %(pk_external_care)s
     58                                          AND
     59                                  xmin = %(xmin_external_care)s
     60                          RETURNING
     61                                  xmin AS xmin_external_care
     62                  """,
     63                  _SQL_get_external_care_items % "pk_external_care = %(pk_external_care)s"
     64          ]
     65          _updatable_fields = [
     66                  'pk_encounter',
     67                  'pk_health_issue',
     68                  'pk_org_unit',
     69                  'issue',
     70                  'provider',
     71                  'comment',
     72                  'inactive'
     73          ]
     74          #--------------------------------------------------------
     75 -        def format(self, with_health_issue=True, with_address=False, with_comms=False):
     76                  lines = []
     77                  lines.append(_('External care%s             #%s') % (
     78                          gmTools.bool2subst (
     79                                  self._payload[self._idx['inactive']],
     80                                  ' (%s)' % _('inactive'),
     81                                  '',
     82                                  ' [ERROR: .inactive is NULL]'
     83                          ),
     84                          self._payload[self._idx['pk_external_care']]
     85                  ))
     86                  if with_health_issue:
     87                          if self._payload[self._idx['pk_health_issue']] is None:
     88                                  lines.append(' ' + _('Issue: %s') % self._payload[self._idx['issue']])
     89                          else:
     90                                  lines.append(' ' + _('Health issue: %s') % self._payload[self._idx['issue']])
     91                                  lines.append('  (' + _('also treated here') + ')')
     92                  if self._payload[self._idx['provider']] is not None:
     93                          lines.append(' ' + _('Provider: %s') % self._payload[self._idx['provider']])
     94                  lines.append(' ' + _('Location: %s@%s') % (self._payload[self._idx['unit']], self._payload[self._idx['organization']]))
     95                  unit = self.org_unit
     96                  if with_address:
     97                          adr = unit.address
     98                          if adr is not None:
     99                                  lines.extend(adr.format())
    100                  if with_comms:
    101                          for comm in unit.comm_channels:
    102                                  lines.append('  %s: %s%s' % (
    103                                          comm['l10n_comm_type'],
    104                                          comm['url'],
    105                                          gmTools.bool2subst(comm['is_confidential'], _(' (confidential)'), '', '')
    106                                  ))
    107                  if self._payload[self._idx['comment']] is not None:
    108                          lines.append('')
    109                          lines.append(' ' + self._payload[self._idx['comment']])
    110
    111                  return lines
    112          #--------------------------------------------------------
    113 -        def _get_org_unit(self):
    114                  return gmOrganization.cOrgUnit(self._payload[self._idx['pk_org_unit']])
    115
    116          org_unit = property(_get_org_unit, lambda x:x)
    117
    118  #------------------------------------------------------------
    119 -def get_external_care_items(order_by=None, pk_identity=None, pk_health_issue=None, exclude_inactive=False, return_pks=False):
    120
    121          args = {
    122                  'pk_pat': pk_identity,
    123                  'pk_issue': pk_health_issue
    124          }
    125          where_parts = []
    126          if pk_identity is not None:
    127                  where_parts.append('pk_identity = %(pk_pat)s')
    128          if pk_health_issue is not None:
    129                  where_parts.append('pk_health_issue = %(pk_issue)s')
    130          if exclude_inactive is True:
    131                  where_parts.append('inactive IS FALSE')
    132
    133          if len(where_parts) == 0:
    134                  where = 'TRUE'
    135          else:
    136                  where = ' AND '.join(where_parts)
    137
    138          if order_by is not None:
    139                  where = '%s ORDER BY %s' % (
    140                          where,
    141                          order_by
    142                  )
    143
    144          cmd = _SQL_get_external_care_items % where
    145          rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}], get_col_idx = True)
    146          if return_pks:
    147                  return [ r['pk_external_care'] for r in rows ]
    148          return [ cExternalCareItem(row = {'data': r, 'idx': idx, 'pk_field': 'pk_external_care'}) for r in rows ]
    149
    150  #------------------------------------------------------------
    151 -def create_external_care_item(pk_health_issue=None, issue=None, pk_org_unit=None, pk_encounter=None):
    152          args = {
    153                  'pk_health_issue': pk_health_issue,
    154                  'issue': issue,
    155                  'pk_org_unit': pk_org_unit,
    156                  'enc': pk_encounter
    157          }
    158          cmd = """
    159                  INSERT INTO clin.external_care (
    160                          issue,
    161                          fk_health_issue,
    162                          fk_encounter,
    163                          fk_org_unit
    164                  ) VALUES (
    165                          gm.nullify_empty_string(%(issue)s),
    166                          (CASE
    167                                  WHEN gm.is_null_or_blank_string(%(issue)s) IS TRUE THEN %(pk_health_issue)s
    168                                  ELSE NULL
    169                          END)::integer,
    170                          %(enc)s,
    171                          %(pk_org_unit)s
    172                  )
    173                  RETURNING pk"""
    174          rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True, get_col_idx = False)
    175
    176          return cExternalCareItem(aPK_obj = rows[0]['pk'])
    177
    178  #------------------------------------------------------------
    179 -def delete_external_care_item(pk_external_care=None):
    180          args = {'pk': pk_external_care}
    181          cmd = "DELETE FROM clin.external_care WHERE pk = %(pk)s"
    182          gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}])
    183          return True
    184
    185  #============================================================
    186  # main
    187  #------------------------------------------------------------
    188  if __name__ == "__main__":
    189
    190          if len(sys.argv) == 1:
    191                  sys.exit()
    192
    193          if sys.argv[1] != 'test':
    194                  sys.exit()
    195
    196          #from Gnumed.pycommon import gmLog2
    197          #-----------------------------------------
    198 -        def test_get_care_items():
    199                  for item in get_external_care_items(pk_identity = 12, order_by = 'provider'):
    200                          print(item.format())
    201
    202          #-----------------------------------------
    203          test_get_care_items()
    204