Mercurial > p > roundup > code
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. |
