Revision 3c33e68a image_creator/dialog_wizard.py
b/image_creator/dialog_wizard.py | ||
---|---|---|
35 | 35 |
|
36 | 36 |
import dialog |
37 | 37 |
|
38 |
class WizardPage: |
|
39 |
NEXT = 1 |
|
40 |
PREV = -1 |
|
38 |
from image_creator.kamaki_wrapper import Kamaki |
|
41 | 39 |
|
42 |
def __init__(self, session, title): |
|
43 |
self.session = session |
|
44 |
self.title = title |
|
40 |
PAGE_WIDTH = 70 |
|
45 | 41 |
|
46 |
def run(self): |
|
47 |
raise NotImplementedError |
|
48 | 42 |
|
43 |
class Wizard: |
|
44 |
def __init__(self, session): |
|
45 |
self.session = session |
|
46 |
self.pages = [] |
|
47 |
self.session['wizard'] = {} |
|
48 |
|
|
49 |
def add_page(self, page): |
|
50 |
self.pages.append(page) |
|
49 | 51 |
|
50 |
class ImageName(WizardPage): |
|
51 | 52 |
def run(self): |
52 |
d = self.session['dialog'] |
|
53 |
w = self.session['wizard'] |
|
54 |
|
|
55 |
init = w['ImageName'] if 'ImageName' in w else "" |
|
56 |
while 1: |
|
57 |
(code, answer) = d.inputbox("Please provide a name for the image:", |
|
58 |
init=init, width=INPUTBOX_WIDTH, |
|
59 |
ok_label="Next", cancel="Back", |
|
60 |
title=self.title) |
|
53 |
idx = 0 |
|
54 |
while True: |
|
55 |
idx += self.pages[idx].run(self.session, idx, len(self.pages)) |
|
61 | 56 |
|
62 |
if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
|
|
63 |
return self.PREV
|
|
57 |
if idx >= len(self.pages):
|
|
58 |
break
|
|
64 | 59 |
|
65 |
name = answer.strip() |
|
66 |
if len(name) == 0: |
|
67 |
d.msgbox("Image name cannot be empty", width=MSGBOX_WIDTH) |
|
68 |
continue |
|
69 |
w['ImageName'] = name |
|
70 |
break |
|
60 |
if idx < 0: |
|
61 |
return False |
|
62 |
return True |
|
71 | 63 |
|
72 |
return self.NEXT |
|
73 | 64 |
|
65 |
class WizardPage: |
|
66 |
NEXT = 1 |
|
67 |
PREV = -1 |
|
74 | 68 |
|
75 |
class ImageDescription(WizardPage): |
|
76 |
def run(self): |
|
77 |
d = self.session['dialog'] |
|
78 |
w = self.session['wizard'] |
|
69 |
def __init__(self, name, message, **kargs): |
|
70 |
self.name = name |
|
71 |
self.message = message |
|
72 |
self.title = kargs['title'] if 'title' in kargs else '' |
|
73 |
self.init_value = kargs['init'] if 'init' in kargs else '' |
|
74 |
self.allow_empty = kargs['empty'] if 'empty' in kargs else False |
|
79 | 75 |
|
80 |
init = w['ImageDescription'] if 'ImageDescription' in w else "" |
|
76 |
def run(self, session, index, total): |
|
77 |
d = session['dialog'] |
|
78 |
w = session['wizard'] |
|
81 | 79 |
|
82 |
while 1: |
|
83 |
(code, answer) = d.inputbox( |
|
84 |
"Please provide a description for the image:", |
|
85 |
init=init, width=INPUTBOX_WIDTH, |
|
86 |
ok_label="Next", cancel="Back", |
|
87 |
title=self.title) |
|
80 |
init = w[self.name] if self.name in w else self.init_value |
|
81 |
while True: |
|
82 |
(code, answer) = d.inputbox(self.message, init=init, |
|
83 |
width=PAGE_WIDTH, ok_label="Next", cancel="Back", |
|
84 |
title="(%d/%d) %s" % (index + 1, total, self.title)) |
|
88 | 85 |
|
89 | 86 |
if code in (d.DIALOG_CANCEL, d.DIALOG_ESC): |
90 | 87 |
return self.PREV |
91 | 88 |
|
92 |
name = answer.strip() |
|
93 |
if len(filename) == 0: |
|
94 |
# Description is allowed to be empty |
|
95 |
del w['ImageDescription'] |
|
96 |
else: |
|
97 |
w['ImageDescription'] = name |
|
89 |
value = answer.strip() |
|
90 |
if len(value) == 0 and self.allow_empty is False: |
|
91 |
d.msgbox("The value cannot be empty!", width=PAGE_WIDTH) |
|
92 |
continue |
|
93 |
w[self.name] = value |
|
98 | 94 |
break |
99 | 95 |
|
100 | 96 |
return self.NEXT |
101 | 97 |
|
102 | 98 |
|
103 | 99 |
def wizard(session): |
104 |
session['wizard'] = {} |
|
105 |
|
|
106 |
steps = [] |
|
107 |
steps.append(ImageName(session, "(1/5) Image Name")) |
|
108 |
steps.append(ImageDescription(session, "(2/5) Image Description")) |
|
109 |
|
|
110 |
return True |
|
111 | 100 |
|
101 |
name = WizardPage("ImageName", "Please provide a name for the image:", |
|
102 |
title="Image Name", init=session['device'].distro) |
|
103 |
descr = WizardPage("ImageDescription", |
|
104 |
"Please provide a description for the image:", |
|
105 |
title="Image Description", empty=True, |
|
106 |
init=session['metadata']['DESCRIPTION'] if 'DESCRIPTION' in |
|
107 |
session['metadata'] else '') |
|
108 |
account = WizardPage("account", |
|
109 |
"Please provide your ~okeanos account e-mail:", |
|
110 |
title="~okeanos account information", init=Kamaki.get_account()) |
|
111 |
token = WizardPage("token", |
|
112 |
"Please provide your ~okeanos account token:", |
|
113 |
title="~okeanos account token", init=Kamaki.get_token()) |
|
114 |
|
|
115 |
w = Wizard(session) |
|
116 |
w.add_page(name) |
|
117 |
w.add_page(descr) |
|
118 |
w.add_page(account) |
|
119 |
w.add_page(token) |
|
120 |
|
|
121 |
return w.run() |
|
112 | 122 |
|
113 | 123 |
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai : |
Also available in: Unified diff