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