first cut at snaplist view
This commit is contained in:
parent
e2ec77d475
commit
f4f5d58026
|
@ -22,4 +22,5 @@ from .installprogress import InstallProgressController # NOQA
|
||||||
from .filesystem import FilesystemController # NOQA
|
from .filesystem import FilesystemController # NOQA
|
||||||
from .keyboard import KeyboardController # NOQA
|
from .keyboard import KeyboardController # NOQA
|
||||||
from .proxy import ProxyController # NOQA
|
from .proxy import ProxyController # NOQA
|
||||||
|
from .snaplist import SnapListController
|
||||||
from .welcome import WelcomeController # NOQA
|
from .welcome import WelcomeController # NOQA
|
||||||
|
|
|
@ -17,7 +17,7 @@ import logging
|
||||||
|
|
||||||
from subiquitycore.controller import BaseController
|
from subiquitycore.controller import BaseController
|
||||||
|
|
||||||
from subiquity.ui.views import SnapListView
|
from subiquity.ui.views.snaplist import SnapListView
|
||||||
|
|
||||||
log = logging.getLogger('subiquity.controllers.snaplist')
|
log = logging.getLogger('subiquity.controllers.snaplist')
|
||||||
|
|
||||||
|
@ -26,8 +26,17 @@ class SnapListController(BaseController):
|
||||||
|
|
||||||
def __init__(self, common):
|
def __init__(self, common):
|
||||||
super().__init__(common)
|
super().__init__(common)
|
||||||
self.model = self.all_model.SnapList
|
self.model = self.base_model.snaplist
|
||||||
|
|
||||||
def default(self):
|
def default(self):
|
||||||
|
self.ui.set_header(
|
||||||
|
_("Featured Server Snaps"),
|
||||||
|
_("These are popular snaps in server environments. Select or deselect with SPACE, press ENTER to see more details of the package, publisher and versions available."),
|
||||||
|
)
|
||||||
self.ui.set_body(SnapListView(self.model, self))
|
self.ui.set_body(SnapListView(self.model, self))
|
||||||
|
|
||||||
|
def done(self, snaps_to_install):
|
||||||
|
self.signal.emit_signal("next-screen")
|
||||||
|
|
||||||
|
def cancel(self, sender=None):
|
||||||
|
self.signal.emit_signal("prev-screen")
|
||||||
|
|
|
@ -38,6 +38,7 @@ class Subiquity(Application):
|
||||||
"Proxy",
|
"Proxy",
|
||||||
"Filesystem",
|
"Filesystem",
|
||||||
"Identity",
|
"Identity",
|
||||||
|
"SnapList",
|
||||||
"InstallProgress",
|
"InstallProgress",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
import attr
|
import attr
|
||||||
|
|
||||||
@attr.s(cmp=False)
|
@attr.s(cmp=False)
|
||||||
|
@ -40,10 +43,21 @@ class SnapListModel:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def get_snap_list(self):
|
def get_snap_list(self):
|
||||||
return [
|
opd = os.path.dirname
|
||||||
Snap("etcd", "Resilient key-value store by CoreOS", "tvansteenburgh", "Etcd is a high availability key-value store, implementing the RAFT algorithm to deal with failover within the etcd cluster. Popular in the Docker community as a shared store of small but important data in a distributed application."),
|
opj = os.path.join
|
||||||
]
|
snap_data_dir = opj(opd(opd(opd(__file__))), 'examples', 'snaps')
|
||||||
|
snap_find_output = opj(snap_data_dir, 'find-output.json')
|
||||||
|
with open(snap_find_output) as fp:
|
||||||
|
data = json.load(fp)
|
||||||
|
r = []
|
||||||
|
for s in data['result']:
|
||||||
|
kw = {}
|
||||||
|
kw['name'] = s['name']
|
||||||
|
kw['summary'] = s['summary']
|
||||||
|
kw['publisher'] = s['developer']
|
||||||
|
kw['description'] = s['description']
|
||||||
|
r.append(SnapInfo(**kw))
|
||||||
|
return r
|
||||||
|
|
||||||
def set_installed_list(self, to_install):
|
def set_installed_list(self, to_install):
|
||||||
self.to_install = to_install
|
self.to_install = to_install
|
||||||
|
|
|
@ -26,6 +26,7 @@ from .installpath import InstallpathModel
|
||||||
from .keyboard import KeyboardModel
|
from .keyboard import KeyboardModel
|
||||||
from .locale import LocaleModel
|
from .locale import LocaleModel
|
||||||
from .proxy import ProxyModel
|
from .proxy import ProxyModel
|
||||||
|
from .snaplist import SnapListModel
|
||||||
|
|
||||||
|
|
||||||
def setup_yaml():
|
def setup_yaml():
|
||||||
|
@ -50,6 +51,7 @@ class SubiquityModel:
|
||||||
self.filesystem = FilesystemModel(common['prober'])
|
self.filesystem = FilesystemModel(common['prober'])
|
||||||
self.identity = IdentityModel()
|
self.identity = IdentityModel()
|
||||||
self.proxy = ProxyModel()
|
self.proxy = ProxyModel()
|
||||||
|
self.snaplist = SnapListModel(common)
|
||||||
|
|
||||||
def _cloud_init_config(self):
|
def _cloud_init_config(self):
|
||||||
user = self.identity.user
|
user = self.identity.user
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
# Copyright 2015 Canonical, Ltd.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from urwid import (
|
||||||
|
CheckBox,
|
||||||
|
Text,
|
||||||
|
)
|
||||||
|
|
||||||
|
from subiquitycore.ui.buttons import ok_btn, cancel_btn
|
||||||
|
from subiquitycore.ui.container import Columns
|
||||||
|
from subiquitycore.ui.utils import button_pile, Color, screen
|
||||||
|
from subiquitycore.view import BaseView
|
||||||
|
|
||||||
|
|
||||||
|
log = logging.getLogger("subiquity.views.welcome")
|
||||||
|
|
||||||
|
|
||||||
|
class SnapListView(BaseView):
|
||||||
|
|
||||||
|
def __init__(self, model, controller):
|
||||||
|
self.model = model
|
||||||
|
self.controller = controller
|
||||||
|
self.to_install = []
|
||||||
|
body = []
|
||||||
|
snaps = self.model.get_snap_list()
|
||||||
|
name_len = max([len(snap.name) for snap in snaps])
|
||||||
|
for snap in snaps:
|
||||||
|
body.append(Color.menu_button(Columns([
|
||||||
|
(name_len+4, CheckBox(snap.name)),
|
||||||
|
Text(snap.summary, wrap='clip'),
|
||||||
|
], dividechars=1)))
|
||||||
|
ok = ok_btn(label=_("OK"), on_press=self.done)
|
||||||
|
cancel = cancel_btn(label=_("Cancel"), on_press=self.done)
|
||||||
|
super().__init__(screen(body, button_pile([ok, cancel])))
|
||||||
|
|
||||||
|
def done(self, sender=None):
|
||||||
|
self.controller.done(self.to_install)
|
||||||
|
|
||||||
|
def cancel(self, sender=None):
|
||||||
|
self.controller.cancel()
|
Loading…
Reference in New Issue