Package Gnumed :: Package wxpython :: Module gmDataPackWidgets |
[frames] | no frames]

# Source Code for Module Gnumed.wxpython.gmDataPackWidgets

      1  """GNUmed data pack related widgets."""
      2  #================================================================
      3  __author__ = 'karsten.hilbert@gmx.net'
      4  __license__ = 'GPL v2 or later (details at http://www.gnu.org)'
      5
      6  # stdlib
      7  import logging
      8  import sys
      9
     10
     11  # 3rd party
     12  import wx
     13
     14
     15  # GNUmed
     16  if __name__ == '__main__':
     17          sys.path.insert(0, '../../')
     18
     19  from Gnumed.pycommon import gmCfg2
     20  from Gnumed.pycommon import gmCfg
     21  from Gnumed.pycommon import gmTools
     22  from Gnumed.pycommon import gmNetworkTools
     23  from Gnumed.pycommon import gmPG2
     24  from Gnumed.business import gmPraxis
     25  from Gnumed.wxpython import gmListWidgets
     26  from Gnumed.wxpython import gmGuiHelpers
     27  from Gnumed.wxpython import gmAuthWidgets
     28  from Gnumed.wxpython import gmCfgWidgets
     29
     30
     31  _log = logging.getLogger('gm.ui')
     32  _cfg = gmCfg2.gmCfgData()
     33
     34
     35  default_dpl_url = 'http://www.gnumed.de/downloads/data/data-packs.conf'
     36  dpl_url_option = 'horstspace.data_packs.url'
     37  #================================================================
     38 -def install_data_pack(data_pack=None):
     39
     40          if data_pack is None:
     41                  return False
     42
     43          _log.info('attempting installation of data pack: %s', data_pack['name'])
     44
     45          msg = _(
     46                  'Note that GNUmed data packs are provided\n'
     47                  '\n'
     48                  'WITHOUT ANY GUARANTEE WHATSOEVER\n'
     49                  '\n'
     50                  'regarding their content.\n'
     51                  '\n'
     52                  'Despite data packs having been prepared with the\n'
     53                  'utmost care you must still vigilantly apply caution,\n'
     54                  'common sense, and due diligence to make sure you\n'
     55                  'render appropriate care to your patients.\n'
     56                  '\n'
     57                  'Press [Yes] to declare agreement with this precaution.\n'
     58                  '\n'
     59                  'Press [No] to abort installation of the data pack.\n'
     60          )
     61          go_ahead = gmGuiHelpers.gm_show_question(msg, _('Terms of Data Pack Use'))
     62          if not go_ahead:
     63                  _log.info('user did not agree to terms of data pack use')
     64                  return True
     65
     66          gm_dbo_conn = gmAuthWidgets.get_dbowner_connection(procedure = _('installing data pack'))
     67          if gm_dbo_conn is None:
     68                  msg = _('Lacking permissions to install data pack.')
     69                  gmGuiHelpers.gm_show_error(msg, _('Installing data pack'))
     70                  return False
     71
     72          wx.BeginBusyCursor()
     73          verified, data = gmNetworkTools.download_data_pack (
     74                  data_pack['pack_url'],
     75                  md5_url = data_pack['md5_url']
     76          )
     77          wx.EndBusyCursor()
     78          if not verified:
     79                  _log.error('cannot download and verify data pack: %s', data_pack['name'])
     80                  md5_expected, md5_calculated = data
     81                  msg = _(
     82                          'Cannot validate data pack.\n'
     83                          '\n'
     84                          '  name: %s\n'
     85                          '  URL: %s\n'
     86                          '\n'
     87                          '  MD5\n'
     88                          '   calculated: %s\n'
     89                          '   expected: %s\n'
     90                          '   source: %s\n'
     91                          '\n'
     92                          'You may want to try downloading again or you\n'
     93                          'may need to contact your administrator.'
     94                  ) % (
     95                          data_pack['name'],
     96                          data_pack['pack_url'],
     97                          md5_calculated,
     98                          md5_expected,
     99                          data_pack['md5_url']
    100                  )
    101                  gmGuiHelpers.gm_show_error(msg, _('Verifying data pack'))
    102                  return False
    103
    104          data_pack['local_archive'] = data
    105
    106          wx.BeginBusyCursor()
    107          unzip_dir = gmNetworkTools.unzip_data_pack(filename = data)
    108          wx.EndBusyCursor()
    109          if unzip_dir is None:
    110                  msg = _(
    111                          'Cannot unpack data pack.\n'
    112                          '\n'
    113                          '  name: %s\n'
    114                          '  URL: %s\n'
    115                          '  local: %s\n'
    116                          '\n'
    117                          'You may want to try downloading again or you\n'
    118                          'may need to contact your administrator.'
    119                  ) % (
    120                          data_pack['name'],
    121                          data_pack['pack_url'],
    122                          data_pack['local_archive']
    123                  )
    124                  gmGuiHelpers.gm_show_error(msg, _('Unpacking data pack'))
    125                  return False
    126
    127          data_pack['unzip_dir'] = unzip_dir
    128
    129          wx.BeginBusyCursor()
    130          try:
    131                  installed = gmNetworkTools.install_data_pack(data_pack, gm_dbo_conn)
    132          finally:
    133                  wx.EndBusyCursor()
    134
    135          # check schema hash
    136          db_version = gmPG2.map_client_branch2required_db_version[_cfg.get(option = 'client_branch')]
    137          if not gmPG2.database_schema_compatible(version = db_version):
    138                  if db_version != 0:
    139                          msg = _(
    140                                  'Installation of data pack failed because\n'
    141                                  'it attempted to modify the database layout.\n'
    142                                  '\n'
    143                                  '  name: %s\n'
    144                                  '  URL: %s\n'
    145                                  '  local: %s\n'
    146                                  '\n'
    147                                  'You will need to contact your administrator.'
    148                          ) % (
    149                                  data_pack['name'],
    150                                  data_pack['pack_url'],
    151                                  data_pack['local_archive']
    152                          )
    153                          gmGuiHelpers.gm_show_error(msg, _('Installing data pack'))
    154                          return False
    155
    156          if not installed:
    157                  msg = _(
    158                          'Installation of data pack failed.\n'
    159                          '\n'
    160                          '  name: %s\n'
    161                          '  URL: %s\n'
    162                          '  local: %s\n'
    163                          '\n'
    164                          'You may want to try downloading again or you\n'
    165                          'may need to contact your administrator.'
    166                  ) % (
    167                          data_pack['name'],
    168                          data_pack['pack_url'],
    169                          data_pack['local_archive']
    170                  )
    171                  gmGuiHelpers.gm_show_error(msg, _('Installing data pack'))
    172                  return False
    173
    174          msg = _(
    175                  'Successfully installed data pack.\n'
    176                  '\n'
    177                  '  name: %s\n'
    178                  '  URL: %s\n'
    179          ) % (
    180                  data_pack['name'],
    181                  data_pack['pack_url']
    182          )
    183          gmGuiHelpers.gm_show_info(msg, _('Installing data pack'))
    184
    185          return True
    186
    187  #----------------------------------------------------------------
    188 -def load_data_packs_list():
    189
    190          dbcfg = gmCfg.cCfgSQL()
    191          dpl_url = dbcfg.get2 (
    192                  option = dpl_url_option,
    193                  workplace = gmPraxis.gmCurrentPraxisBranch().active_workplace,
    194                  bias = 'workplace',
    195                  default = default_dpl_url
    196          )
    197
    198          items = []
    199          data = []
    200
    201          dpl_fname = gmNetworkTools.download_data_packs_list(dpl_url)
    202          if dpl_fname is None:
    203                  return (items, data)
    204          try:
    205                  _cfg.add_file_source(source = 'data-packs', file = dpl_fname)
    206          except (UnicodeDecodeError):
    207                  _log.exception("cannot read data pack list from [%s]", dpl_fname)
    208                  return (items, data)
    209
    210          packs = _cfg.get('data packs', 'data packs', source_order = [('data-packs', 'return')])
    211          if packs is None:
    212                  _log.info('no data packs listed in data packs list file')
    213                  _cfg.remove_source('data-packs')
    214                  return (items, data)
    215
    216          for pack in packs:
    217                  _log.debug('reading pack [%s] metadata', pack)
    218                  pack_group = 'pack %s' % pack
    219                  name = _cfg.get(pack_group, 'name', source_order = [('data-packs', 'return')])
    220                  pack_url = _cfg.get(pack_group, 'URL', source_order = [('data-packs', 'return')])
    221                  md5_url = pack_url + '.md5'
    222                  db_min = _cfg.get(pack_group, 'minimum database version', source_order = [('data-packs', 'return')])
    223                  converted, db_min = gmTools.input2int (
    224                          db_min,
    225                          # here we introduced data packs:
    226                          #16,
    227                          0,
    228                          # no use looking at data packs requiring a database > the current database:
    229                          _cfg.get(option = 'database_version')
    230                  )
    231                  if not converted:
    232                          _log.error('cannot convert minimum database version [%s]', db_min)
    233                          continue
    234
    235                  db_max = _cfg.get(pack_group, 'maximum database version', source_order = [('data-packs', 'return')])
    236                  if db_max is None:
    237                          db_max = sys.maxsize
    238                  converted, db_max = gmTools.input2int (
    239                          db_max,
    240                          db_min          # max version must be at least db_min
    241                  )
    242                  if not converted:
    243                          _log.error('cannot convert maximum database version [%s]', db_max)
    244                          continue
    245
    246                  if _cfg.get(option = 'database_version') < db_min:
    247                          _log.error('ignoring data pack: current database version (%s) < minimum required database version (%s)', _cfg.get(option = 'database_version'), db_min)
    248                          continue
    249
    250                  if _cfg.get(option = 'database_version') > db_max:
    251                          _log.error('ignoring data pack: current database version (%s) > maximum allowable database version (%s)', _cfg.get(option = 'database_version'), db_max)
    252                          continue
    253
    254                  items.append([name, 'v%s' % db_min, 'v%s' % db_max, pack_url])
    255                  data.append ({
    256                          'name': name,
    257                          'pack_url': pack_url,
    258                          'md5_url': md5_url,
    259                          'db_min': db_min,
    260                          'db_max': db_max
    261                  })
    262
    263          _cfg.remove_source('data-packs')
    264          return (items, data)
    265  #----------------------------------------------------------------
    266 -def manage_data_packs(parent=None):
    267
    268          if parent is None:
    269                  parent = wx.GetApp().GetTopWindow()
    270
    271          #--------------------------------------------
    272          def validate_url(url):
    273                  return True, url
    274          #--------------------------------------------
    275          def configure_dpl_url(item):
    276                  gmCfgWidgets.configure_string_option (
    277                          parent = parent,
    278                          message = _(
    279                                  'Please enter the URL under which to load\n'
    280                                  'the list of available data packs.\n'
    281                                  '\n'
    282                                  'The default URL is:\n'
    283                                  '\n'
    284                                  ' [%s]\n'
    285                          ) % default_dpl_url,
    286                          option = dpl_url_option,
    287                          bias = 'workplace',
    288                          default_value = default_dpl_url,
    289                          validator = validate_url
    290                  )
    291                  return True
    292          #--------------------------------------------
    293          def refresh(lctrl):
    294                  items, data = load_data_packs_list()
    295                  lctrl.set_string_items(items)
    296                  lctrl.set_data(data)
    297          #--------------------------------------------
    298          lb_tt = _(
    299                  'Install the selected data pack.\n'
    300                  '\n'
    301                  'This can take quite a while depending on\n'
    302                  'the amount of data to be installed.\n'
    303                  '\n'
    304                  'GNUmed will block until installation is\n'
    305                  'complete and eventually inform you of\n'
    306                  'success or failure.'
    307          )
    308          gmListWidgets.get_choices_from_list (
    309                  parent = parent,
    310                  msg = _(
    311                          'Data packs available for installation into this v%s database.\n'
    312                  ) % (
    313                          _cfg.get(option = 'database_version')
    314                  ),
    315                  caption = _('Showing data packs.'),
    316                  columns = [ _('Data pack'), _('min DB'), _('max DB'), _('Source') ],
    317                  single_selection = True,
    318                  can_return_empty = False,
    319                  ignore_OK_button = True,
    320                  refresh_callback = refresh,
    321                  left_extra_button = (
    322                          _('&Install'),
    323                          lb_tt,
    324                          install_data_pack
    325                  ),
    326  #               middle_extra_button=None,
    327                  right_extra_button = (
    328                          _('&Configure'),
    329                          _('Configure the data packs list source'),
    330                          configure_dpl_url
    331                  )
    332          )
    333
    334  #================================================================
    335  # main
    336  #----------------------------------------------------------------
    337  if __name__ == '__main__':
    338
    339          if len(sys.argv) < 2:
    340                  sys.exit()
    341
    342          if sys.argv[1] != 'test':
    343                  sys.exit()
    344
    345          from Gnumed.pycommon import gmI18N
    346          gmI18N.activate_locale()
    347          gmI18N.install_domain()
    348  #       from Gnumed.pycommon import gmPG2
    349
    350          #--------------------------------------------------------
    351  #       def test_generic_codes_prw():
    352  #               gmPG2.get_connection()
    353  #               app = wx.PyWidgetTester(size = (500, 40))
    354  #               pw = cGenericCodesPhraseWheel(app.frame, -1)
    355  #               #pw.set_context(context = u'zip', val = u'04318')
    356  #               app.frame.Show(True)
    357  #               app.MainLoop()
    358  #       #--------------------------------------------------------
    359  #       test_generic_codes_prw()
    360
    361  #================================================================
    362