start making the partition form usable in other views
This commit is contained in:
parent
923044be7e
commit
4a54ca9e50
|
@ -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)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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)
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue