start making the partition form usable in other views

This commit is contained in:
Michael Hudson-Doyle 2017-09-05 11:58:49 +12:00
parent 923044be7e
commit 4a54ca9e50
4 changed files with 52 additions and 56 deletions

View File

@ -150,16 +150,16 @@ class FilesystemController(BaseController):
# the offset and bios/grub partition # the offset and bios/grub partition
# XXX should probably only do this if the partition is now too big to fit on the disk? # XXX should probably only do this if the partition is now too big to fit on the disk?
log.debug("Adjusting request down:" + log.debug("Adjusting request down:" +
"{} - {} = {}".format(spec['bytes'], part.size, "{} - {} = {}".format(spec['size'], part.size,
spec['bytes'] - part.size)) spec['size'] - part.size))
spec['bytes'] -= part.size spec['size'] -= part.size
spec['partnum'] = 2 spec['partnum'] = 2
part = self.model.add_partition(disk=disk, partnum=spec["partnum"], size=spec["bytes"]) part = self.model.add_partition(disk=disk, partnum=spec["partnum"], size=spec["size"])
if spec['fstype'] is not None: if spec['fstype'] is not None:
fs = self.model.add_filesystem(part, spec['fstype']) fs = self.model.add_filesystem(part, spec['fstype'].label)
if spec['mountpoint']: if spec['mount']:
self.model.add_mount(fs, spec['mountpoint']) self.model.add_mount(fs, spec['mount'])
log.info("Successfully added partition") log.info("Successfully added partition")
self.partition_disk(disk) self.partition_disk(disk)

View File

@ -147,7 +147,13 @@ class Disk:
@property @property
def next_partnum(self): def next_partnum(self):
return len(self._partitions) + 1 partnums = set()
for p in self._partitions:
partnums.add(p.number)
i = 1
while i in partnums:
i += 1
return i
@property @property
def size(self): def size(self):

View File

@ -49,15 +49,14 @@ class FSTypeField(FormField):
return Selector(opts=form.model.supported_filesystems) return Selector(opts=form.model.supported_filesystems)
class AddPartitionForm(Form): class PartitionForm(Form):
def __init__(self, model, disk): def __init__(self, model, max_size, initial={}):
self.model = model self.model = model
self.disk = disk self.max_size = max_size
self.size_str = humanize_size(disk.free) self.size_str = humanize_size(max_size)
super().__init__() super().__init__(initial)
self.size.caption = "Size (max {})".format(self.size_str) self.size.caption = "Size (max {})".format(self.size_str)
self.partnum.value = self.disk.next_partnum
connect_signal(self.fstype.widget, 'select', self.select_fstype) connect_signal(self.fstype.widget, 'select', self.select_fstype)
def select_fstype(self, sender, fs): def select_fstype(self, sender, fs):
@ -68,25 +67,31 @@ class AddPartitionForm(Form):
fstype = FSTypeField("Format") fstype = FSTypeField("Format")
mount = MountField("Mount") mount = MountField("Mount")
def validate_size(self): def clean_size(self, val):
v = self.size.value if not val:
if not v: return self.max_size
return
suffixes = ''.join(HUMAN_UNITS) + ''.join(HUMAN_UNITS).lower() suffixes = ''.join(HUMAN_UNITS) + ''.join(HUMAN_UNITS).lower()
if v[-1] not in suffixes: if val[-1] not in suffixes:
unit = self.size_str[-1] unit = self.size_str[-1]
v += unit val += unit
self.size.value = v self.size.widget.value = val
try: sz = dehumanize_size(val)
sz = dehumanize_size(v) if sz > self.max_size:
except ValueError as v:
return str(v)
if sz > self.disk.free:
self.size.value = self.size_str
self.size.show_extra(Color.info_minor(Text("Capped partition size at %s"%(self.size_str,), align="center"))) self.size.show_extra(Color.info_minor(Text("Capped partition size at %s"%(self.size_str,), align="center")))
self.size.widget.value = self.size_str
return self.max_size
return sz
def clean_mount(self, val):
if self.fstype.value.is_mounted:
return val
else:
return None
def validate_mount(self): def validate_mount(self):
return self.model.validate_mount(self.mount.value) mount = self.mount.value
if mount is not None:
return self.model.validate_mount(mount)
class AddPartitionView(BaseView): class AddPartitionView(BaseView):
@ -97,7 +102,7 @@ class AddPartitionView(BaseView):
self.controller = controller self.controller = controller
self.disk = disk self.disk = disk
self.form = AddPartitionForm(model, self.disk) self.form = PartitionForm(model, disk.free, initial={'partnum': disk.next_partnum})
connect_signal(self.form, 'submit', self.done) connect_signal(self.form, 'submit', self.done)
connect_signal(self.form, 'cancel', self.cancel) connect_signal(self.form, 'cancel', self.cancel)
@ -113,29 +118,6 @@ class AddPartitionView(BaseView):
def cancel(self, button=None): def cancel(self, button=None):
self.controller.partition_disk(self.disk) self.controller.partition_disk(self.disk)
def done(self, result): def done(self, form):
log.debug("Add Partition Result: {}".format(form.as_data()))
fstype = self.form.fstype.value self.controller.add_disk_partition_handler(self.disk, form.as_data())
if fstype.is_mounted:
mount = self.form.mount.value
else:
mount = None
if self.form.size.value:
size = dehumanize_size(self.form.size.value)
if size > self.disk.free:
size = self.disk.free
else:
size = self.disk.free
result = {
"partnum": self.form.partnum.value,
"raw_size": self.form.size.value,
"bytes": size,
"fstype": fstype.label,
"mountpoint": mount,
}
log.debug("Add Partition Result: {}".format(result))
self.controller.add_disk_partition_handler(self.disk, result)

View File

@ -254,7 +254,7 @@ class Form(object, metaclass=MetaForm):
opts = {} opts = {}
def __init__(self): def __init__(self, initial={}):
self.done_btn = Toggleable(done_btn(), 'button') self.done_btn = Toggleable(done_btn(), 'button')
self.cancel_btn = Toggleable(cancel_btn(), 'button') self.cancel_btn = Toggleable(cancel_btn(), 'button')
connect_signal(self.done_btn.base_widget, 'click', self._click_done) connect_signal(self.done_btn.base_widget, 'click', self._click_done)
@ -265,6 +265,8 @@ class Form(object, metaclass=MetaForm):
bf = field.bind(self) bf = field.bind(self)
setattr(self, bf.field.name, bf) setattr(self, bf.field.name, bf)
self._fields.append(bf) self._fields.append(bf)
if field.name in initial:
bf.value = initial[field.name]
def _click_done(self, sender): def _click_done(self, sender):
emit_signal(self, 'submit', self) emit_signal(self, 'submit', self)
@ -304,3 +306,9 @@ class Form(object, metaclass=MetaForm):
self.buttons.focus_position = 1 self.buttons.focus_position = 1
else: else:
self.buttons.contents[0][0].enable() self.buttons.contents[0][0].enable()
def as_data(self):
data = {}
for field in self._fields:
data[field.field.name] = field.value
return data