comparison roundup/admin.py @ 7252:9c067ed4568b

add pragma command to roundup-admin Added basic pragma command. Can assign settings, list settings. Most settings are not yet implemented. Only the pragma command respects unhidden pragma settings at this point. Also added tests, doc updates for roundup-admin. CHANGES.txt not updated because currently only pragma references the unhidden settings. Also fixed a couple of long lines.
author John Rouillard <rouilj@ieee.org>
date Wed, 12 Apr 2023 20:49:21 -0400
parents ee972b3073cb
children 393ae88bf7b1
comparison
equal deleted inserted replaced
7251:ab0ea9f03866 7252:9c067ed4568b
100 self.help[k[5:]] = getattr(self, k) 100 self.help[k[5:]] = getattr(self, k)
101 self.tracker_home = '' 101 self.tracker_home = ''
102 self.db = None 102 self.db = None
103 self.db_uncommitted = False 103 self.db_uncommitted = False
104 self.force = None 104 self.force = None
105 self.settings = {
106 'display_protected': False,
107 'indexer_backend': "as set in config.ini",
108 '_reopen_tracker': False,
109 'show_retired': False,
110 'verbose': False,
111 '_inttest': 3,
112 '_floattest': 3.5,
113 }
114 self.settings_help = {
115 'display_protected':
116 _("Have 'display designator' show protected fields: creator. NYI"),
117
118 'indexer_backend':
119 _("Set indexer to use when running 'reindex' NYI"),
120
121 '_reopen_tracker':
122 _("Force reopening of tracker when running each command."),
123
124 'show_retired': _("Show retired items in table, list etc. NYI"),
125 'verbose': _("Enable verbose output: tracing, descriptions..."),
126
127 '_inttest': "Integer valued setting. For testing only.",
128 '_floattest': "Float valued setting. For testing only.",
129 }
105 130
106 def get_class(self, classname): 131 def get_class(self, classname):
107 """Get the class - raise an exception if it doesn't exist. 132 """Get the class - raise an exception if it doesn't exist.
108 """ 133 """
109 try: 134 try:
438 if value != again: 463 if value != again:
439 print(_('Sorry, try again...')) 464 print(_('Sorry, try again...'))
440 if value: 465 if value:
441 props[key] = value 466 props[key] = value
442 else: 467 else:
443 value = self.my_input(_('%(propname)s (%(proptype)s): ') % { 468 value = self.my_input(_(
444 'propname': key.capitalize(), 'proptype': name}) 469 '%(propname)s (%(proptype)s): ') % {
470 'propname': key.capitalize(), 'proptype': name})
445 if value: 471 if value:
446 props[key] = value 472 props[key] = value
447 else: 473 else:
448 props = self.props_from_args(args[1:]) 474 props = self.props_from_args(args[1:])
449 475
795 "from old default of %(old_number)s to new " 821 "from old default of %(old_number)s to new "
796 "default of %(new_number)s.") % { 822 "default of %(new_number)s.") % {
797 "old_number": 823 "old_number":
798 config.PASSWORD_PBKDF2_DEFAULT_ROUNDS, 824 config.PASSWORD_PBKDF2_DEFAULT_ROUNDS,
799 "new_number": default_ppdr 825 "new_number": default_ppdr
800 } 826 })
801 )
802 config.PASSWORD_PBKDF2_DEFAULT_ROUNDS = default_ppdr 827 config.PASSWORD_PBKDF2_DEFAULT_ROUNDS = default_ppdr
803 828
804 if config.PASSWORD_PBKDF2_DEFAULT_ROUNDS < default_ppdr: 829 if config.PASSWORD_PBKDF2_DEFAULT_ROUNDS < default_ppdr:
805 print(_("Update " 830 print(_("Update "
806 "'password_pbkdf2_default_rounds' " 831 "'password_pbkdf2_default_rounds' "
1433 "Hash time: %(time)0.9f seconds, scheme: %(scheme)s, " 1458 "Hash time: %(time)0.9f seconds, scheme: %(scheme)s, "
1434 "rounds: %(rounds)s") % 1459 "rounds: %(rounds)s") %
1435 {"time": toc-tic, "scheme": props['scheme'], 1460 {"time": toc-tic, "scheme": props['scheme'],
1436 "rounds": rounds}) 1461 "rounds": rounds})
1437 1462
1463 def do_pragma(self, args):
1464 ''"""Usage: pragma setting=value | 'list'
1465 Set internal admin settings to a value. E.G.
1466
1467 pragma verbose=True
1468 pragma verbose=yes
1469 pragma verbose=on
1470 pragma verbose=1
1471
1472 will turn on verbose mode for roundup-admin.
1473
1474 pragma list
1475
1476 will show all settings and their current values. If verbose
1477 is enabled hidden settings and descriptions will be shown.
1478 """
1479
1480 if len(args) < 1:
1481 raise UsageError(_('Not enough arguments supplied'))
1482
1483 try:
1484 (setting, value) = args[0].split("=", 1)
1485 except ValueError:
1486 if args[0] != "list":
1487 raise UsageError(_(
1488 'Argument must be setting=value, was given: %s.') %
1489 args[0])
1490 else:
1491 print(_("Current settings and values "
1492 "(NYI - not yet implemented):"))
1493 is_verbose = self.settings['verbose']
1494 for key in sorted(list(self.settings.keys())):
1495 if key.startswith('_') and not is_verbose:
1496 continue
1497 print(" %s=%s" % (key, self.settings[key]))
1498 if is_verbose:
1499 print(" %s" % self.settings_help[key])
1500
1501 return
1502
1503 if setting not in self.settings:
1504 raise UsageError(_('Unknown setting %s.') % setting)
1505 if type(self.settings[setting]) is bool:
1506 value = value.lower()
1507 if value in ("yes", "true", "on", "1"):
1508 value = True
1509 elif value in ("no", "false", "off", "0"):
1510 value = False
1511 else:
1512 raise UsageError(_(
1513 'Incorrect value for boolean setting %(setting)s: '
1514 '%(value)s.') % {"setting": setting, "value": value})
1515 elif type(self.settings[setting]) is int:
1516 try:
1517 _val = int(value)
1518 except ValueError:
1519 raise UsageError(_(
1520 'Incorrect value for integer setting %(setting)s: '
1521 '%(value)s.') % {"setting": setting, "value": value})
1522 value = _val
1523 elif type(self.settings[setting]) is str:
1524 pass
1525 else:
1526 raise UsageError(_('Internal error: pragma can not handle '
1527 'values of type: %s') %
1528 type(self.settings[setting]).__name__)
1529
1530 self.settings[setting] = value
1531
1438 designator_re = re.compile('([A-Za-z]+)([0-9]+)') 1532 designator_re = re.compile('([A-Za-z]+)([0-9]+)')
1439 1533
1440 def do_reindex(self, args, desre=designator_re): 1534 def do_reindex(self, args, desre=designator_re):
1441 ''"""Usage: reindex [classname|designator]* 1535 ''"""Usage: reindex [classname|designator]*
1442 Re-generate a tracker's search indexes. 1536 Re-generate a tracker's search indexes.

Roundup Issue Tracker: http://roundup-tracker.org/