From 8dc13440ee150aa8beab24364f45c263dade1539 Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Sun, 18 Dec 2016 23:28:15 +0100 Subject: [PATCH] Fix boolean params. Not passing 0, None, False or off works for setting them to False Thanks to chrisjshull for pointing out how to fix this in the web UI. Fixes #19 --- boxes/__init__.py | 16 ++++++++++++++-- boxes/generators/box2.py | 2 +- boxes/generators/trafficlight.py | 2 +- scripts/boxesserver | 5 +---- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/boxes/__init__.py b/boxes/__init__.py index d9f5516..ba6754b 100755 --- a/boxes/__init__.py +++ b/boxes/__init__.py @@ -178,6 +178,18 @@ class ArgparseEdgeType: e, self.names.get(e, "")) for e in self.edges)) return """\n""" % (name, options) +class BoolArg: + def __call__(self, arg): + if not arg or arg in ("None", "0", "off", "False"): + return False + return True + + def html(self, name, default): + return """ +""" % \ + (name, name, ' checked="checked"' if default else "") + +boolarg = BoolArg() ############################################################################## ### Main class @@ -207,7 +219,7 @@ class Boxes: choices=self.formats.getFormats(), help="format of resulting file") defaultgroup.add_argument( - "--debug", action="store", type=bool, default=False, + "--debug", action="store", type=boolarg, default=False, help="print surrounding boxes for some structures") defaultgroup.add_argument( "--reference", action="store", type=float, default=100, @@ -288,7 +300,7 @@ class Boxes: default="e", help="edge type for top edge") elif arg == "outside": self.argparser.add_argument( - "--outside", action="store", type=bool, default=False, + "--outside", action="store", type=boolarg, default=True, help="treat sizes as outside measurements that include the walls") else: raise ValueError("No default for argument", arg) diff --git a/boxes/generators/box2.py b/boxes/generators/box2.py index 6a548eb..a43537a 100755 --- a/boxes/generators/box2.py +++ b/boxes/generators/box2.py @@ -31,7 +31,7 @@ class Box2(Boxes): self.addSettingsArgs(edges.FlexSettings) self.buildArgParser("top_edge", "bottom_edge", "x", "y", "h") self.argparser.add_argument( - "--chestlid", action="store", type=bool, default=False, + "--chestlid", action="store", type=boolarg, default=False, help="add chest lid (needs hinges)") self.angle = 0 diff --git a/boxes/generators/trafficlight.py b/boxes/generators/trafficlight.py index 0a3f3e5..6cfb012 100644 --- a/boxes/generators/trafficlight.py +++ b/boxes/generators/trafficlight.py @@ -56,7 +56,7 @@ class TrafficLight(Boxes): # change class name here and below "--n", action="store", type=int, default=3, help="number of lights") self.argparser.add_argument( - "--upright", action="store", type=bool, default=False, + "--upright", action="store", type=boolarg, default=True, help="stack lights upright (or side by side)") def backCB(self): diff --git a/scripts/boxesserver b/scripts/boxesserver index 0e3e3b5..00e615e 100755 --- a/scripts/boxesserver +++ b/scripts/boxesserver @@ -86,15 +86,12 @@ class BServer: row = """%s%%s%s\n""" % \ (viewname, a.help or "") if (isinstance(a, argparse._StoreAction) and - isinstance(a.type, boxes.ArgparseEdgeType)): + hasattr(a.type, "html")): input = a.type.html(name, a.default) elif a.dest == "layout": val = a.default.split("\n") input = """""" % \ (name, max((len(l) for l in val))+10, len(val)+1, a.default) - elif a.type is bool: - input = """""" % \ - (name, ' checked="checked"' if a.default else "") elif a.choices: options = "\n".join( ("""""" %