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 :
|