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
|
||||
# XXX should probably only do this if the partition is now too big to fit on the disk?
|
||||
log.debug("Adjusting request down:" +
|
||||
"{} - {} = {}".format(spec['bytes'], part.size,
|
||||
spec['bytes'] - part.size))
|
||||
spec['bytes'] -= part.size
|
||||
"{} - {} = {}".format(spec['size'], part.size,
|
||||
spec['size'] - part.size))
|
||||
spec['size'] -= part.size
|
||||
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:
|
||||
fs = self.model.add_filesystem(part, spec['fstype'])
|
||||
if spec['mountpoint']:
|
||||
self.model.add_mount(fs, spec['mountpoint'])
|
||||
fs = self.model.add_filesystem(part, spec['fstype'].label)
|
||||
if spec['mount']:
|
||||
self.model.add_mount(fs, spec['mount'])
|
||||
|
||||
log.info("Successfully added partition")
|
||||
self.partition_disk(disk)
|
||||
|
|
|
@ -147,7 +147,13 @@ class Disk:
|
|||
|
||||
@property
|
||||
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
|
||||
def size(self):
|
||||
|
|
|
@ -49,15 +49,14 @@ class FSTypeField(FormField):
|
|||
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.disk = disk
|
||||
self.size_str = humanize_size(disk.free)
|
||||
super().__init__()
|
||||
self.max_size = max_size
|
||||
self.size_str = humanize_size(max_size)
|
||||
super().__init__(initial)
|
||||
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)
|
||||
|
||||
def select_fstype(self, sender, fs):
|
||||
|
@ -68,25 +67,31 @@ class AddPartitionForm(Form):
|
|||
fstype = FSTypeField("Format")
|
||||
mount = MountField("Mount")
|
||||
|
||||
def validate_size(self):
|
||||
v = self.size.value
|
||||
if not v:
|
||||
return
|
||||
def clean_size(self, val):
|
||||
if not val:
|
||||
return self.max_size
|
||||
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]
|
||||
v += unit
|
||||
self.size.value = v
|
||||
try:
|
||||
sz = dehumanize_size(v)
|
||||
except ValueError as v:
|
||||
return str(v)
|
||||
if sz > self.disk.free:
|
||||
self.size.value = self.size_str
|
||||
val += unit
|
||||
self.size.widget.value = val
|
||||
sz = dehumanize_size(val)
|
||||
if sz > self.max_size:
|
||||
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):
|
||||
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):
|
||||
|
@ -97,7 +102,7 @@ class AddPartitionView(BaseView):
|
|||
self.controller = controller
|
||||
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, 'cancel', self.cancel)
|
||||
|
@ -113,29 +118,6 @@ class AddPartitionView(BaseView):
|
|||
def cancel(self, button=None):
|
||||
self.controller.partition_disk(self.disk)
|
||||
|
||||
def done(self, result):
|
||||
|
||||
fstype = self.form.fstype.value
|
||||
|
||||
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)
|
||||
def done(self, form):
|
||||
log.debug("Add Partition Result: {}".format(form.as_data()))
|
||||
self.controller.add_disk_partition_handler(self.disk, form.as_data())
|
||||
|
|
|
@ -254,7 +254,7 @@ class Form(object, metaclass=MetaForm):
|
|||
|
||||
opts = {}
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, initial={}):
|
||||
self.done_btn = Toggleable(done_btn(), 'button')
|
||||
self.cancel_btn = Toggleable(cancel_btn(), 'button')
|
||||
connect_signal(self.done_btn.base_widget, 'click', self._click_done)
|
||||
|
@ -265,6 +265,8 @@ class Form(object, metaclass=MetaForm):
|
|||
bf = field.bind(self)
|
||||
setattr(self, bf.field.name, bf)
|
||||
self._fields.append(bf)
|
||||
if field.name in initial:
|
||||
bf.value = initial[field.name]
|
||||
|
||||
def _click_done(self, sender):
|
||||
emit_signal(self, 'submit', self)
|
||||
|
@ -304,3 +306,9 @@ class Form(object, metaclass=MetaForm):
|
|||
self.buttons.focus_position = 1
|
||||
else:
|
||||
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