Exemple #1
0
    def __init__(self, *args):
        QtGui.QWidget.__init__(self,None)
        self.ui = Ui_ManualPartWidget()
        self.ui.setupUi(self)
        self.storage = ctx.storage
        self.intf = ctx.interface

        # New Device Popup Menu
        self.setupMenu()

        #self.connect(self.ui.newButton, SIGNAL("clicked()"),self.createDevice)
        self.connect(self.ui.editButton, SIGNAL("clicked()"),self.editDevice)
        self.connect(self.ui.deleteButton, SIGNAL("clicked()"),self.deleteDevice)
        self.connect(self.ui.resetButton, SIGNAL("clicked()"),self.reset)
        self.connect(self.ui.deviceTree, SIGNAL("itemClicked(QTreeWidgetItem *, int)"), self.activateButtons)
        self.connect(self.menu, SIGNAL("triggered(QAction*)"), self.createDevice)

        # self.ui.deviceTree.hide()
        self._active_device = None

        self.ui.GGdeviceTree = BlockGroup(self, _("Hard Drives"))
        self.ui.verticalLayout.addWidget(self.ui.GGdeviceTree)

        self.ui.GGVdeviceTree = BlockGroup(self, _("Volume Groups"))
        self.ui.verticalLayout.addWidget(self.ui.GGVdeviceTree)

        self.ui.GGRdeviceTree = BlockGroup(self, _("Raid Arrays"))
        self.ui.verticalLayout.addWidget(self.ui.GGRdeviceTree)
Exemple #2
0
    def __init__(self):
        QWidget.__init__(self)
        self.ui = Ui_ManualPartWidget()
        self.ui.setupUi(self)
        self.storage = ctx.storage
        self.intf = ctx.interface

        # New Device Popup Menu
        self.setupMenu()

        #self.connect(self.ui.newButton, SIGNAL("clicked()"),self.createDevice)
        self.connect(self.ui.editButton, SIGNAL("clicked()"),self.editDevice)
        self.connect(self.ui.deleteButton, SIGNAL("clicked()"),self.deleteDevice)
        self.connect(self.ui.resetButton, SIGNAL("clicked()"),self.reset)
        self.connect(self.ui.deviceTree, SIGNAL("itemClicked(QTreeWidgetItem *, int)"), self.activateButtons)
        self.connect(self.menu, SIGNAL("triggered(QAction*)"), self.createDevice)
    def __init__(self):
        QWidget.__init__(self)
        self.ui = Ui_ManualPartWidget()
        self.ui.setupUi(self)
        self.storage = ctx.storage
        self.intf = ctx.interface

        # New Device Popup Menu
        self.setupMenu()

        #self.ui.newButtonclicked.connect(self.createDevice)
        self.ui.editButton.clicked.connect(self.editDevice)
        self.ui.deleteButton.clicked.connect(self.deleteDevice)
        self.ui.resetButton.clicked.connect(self.reset)
        self.ui.deviceTree.itemClicked[QTreeWidgetItem,
                                       int].connect(self.activateButtons)
        self.menu.triggered[QAction].connect(self.createDevice)
Exemple #4
0
    def __init__(self, *args):
        QtGui.QWidget.__init__(self,None)
        self.ui = Ui_ManualPartWidget()
        self.ui.setupUi(self)
        self.storage = ctx.storage
        self.intf = ctx.interface

        # New Device Popup Menu
        self.setupMenu()

        #self.connect(self.ui.newButton, SIGNAL("clicked()"),self.createDevice)
        self.connect(self.ui.editButton, SIGNAL("clicked()"),self.editDevice)
        self.connect(self.ui.deleteButton, SIGNAL("clicked()"),self.deleteDevice)
        self.connect(self.ui.resetButton, SIGNAL("clicked()"),self.reset)
        self.connect(self.ui.deviceTree, SIGNAL("itemClicked(QTreeWidgetItem *, int)"), self.activateButtons)
        self.connect(self.menu, SIGNAL("triggered(QAction*)"), self.createDevice)
    def __init__(self):
        QWidget.__init__(self)
        self.ui = Ui_ManualPartWidget()
        self.ui.setupUi(self)
        self.storage = ctx.storage
        self.intf = ctx.interface

        # New Device Popup Menu
        self.setupMenu()

        #self.ui.newButtonclicked.connect(self.createDevice)
        self.ui.editButton.clicked.connect(self.editDevice)
        self.ui.deleteButton.clicked.connect(self.deleteDevice)
        self.ui.resetButton.clicked.connect(self.reset)
        self.ui.deviceTree.itemClicked[QTreeWidgetItem , int].connect(self.activateButtons)
        self.menu.triggered[QAction].connect(self.createDevice)
Exemple #6
0
class Widget(QtGui.QWidget, ScreenWidget):
    title = _('Manual Partitioning')
    desc = _('You can easily configure your partitions...')
    icon = "iconPartition"
    helpSummary = _("Partition manual summary")
    help = _('''
<p>
In this screen, you can manually partition your disk. You can select 
existing partitions and resize or delete them. You can create new 
partition(s) in the empty parts, make Pardus use them for system files, 
users' home directories, swap space or general use. The changes that you 
make will not be applied until you go on with the installation, 
which means you can revert if you make any unwanted changes or change your configuration.
</p>
<p>
Please refer to Pardus Installing and Using Guide for more information
about disk partitioning.
</font>
''')


    def __init__(self, *args):
        QtGui.QWidget.__init__(self,None)
        self.ui = Ui_ManualPartWidget()
        self.ui.setupUi(self)
        self.storage = ctx.storage
        self.intf = ctx.interface

        # New Device Popup Menu
        self.setupMenu()

        #self.connect(self.ui.newButton, SIGNAL("clicked()"),self.createDevice)
        self.connect(self.ui.editButton, SIGNAL("clicked()"),self.editDevice)
        self.connect(self.ui.deleteButton, SIGNAL("clicked()"),self.deleteDevice)
        self.connect(self.ui.resetButton, SIGNAL("clicked()"),self.reset)
        self.connect(self.ui.deviceTree, SIGNAL("itemClicked(QTreeWidgetItem *, int)"), self.activateButtons)
        self.connect(self.menu, SIGNAL("triggered(QAction*)"), self.createDevice)

    def shown(self):
        checkForSwapNoMatch(self.intf, self.storage)
        self.populate()
        (errors, warnings) =  self.storage.sanityCheck()
        if errors or warnings:
            ctx.mainScreen.disableNext()
        else:
            ctx.mainScreen.enableNext()

    def execute(self):
        ctx.logger.info("Manual Partitioning selected...")
        ctx.mainScreen.processEvents()
        check = self.nextCheck()
        if not check:
            ctx.mainScreen.enableBack()
        elif check is None:
            ctx.mainScreen.enableNext()
        return check

    def update(self):
        if self.storage.storageset.rootDevice:
            ctx.mainScreen.enableNext()
        else:
            ctx.mainScreen.disableNext()
        self.updateMenus()

    def activateButtons(self, item, index):
        if item:
            if isinstance(item.device, Device) and not isinstance(item.device, parted.partition.Partition):
                self.ui.editButton.setEnabled(True)
                self.ui.deleteButton.setEnabled(True)
            else:
                self.ui.editButton.setEnabled(False)
                self.ui.deleteButton.setEnabled(False)

    def nextCheck(self):
        (errors, warnings) = self.storage.sanityCheck()
        if errors:
            detailed =  _("The partitioning scheme you requested\n"
                          "caused the following critical errors.\n"
                          "You must correct these errors before\n"
                          "you continue your installation of %s." %
                          yali.util.product_name())

            comments = "\n\n".join(errors)
            self.intf.detailedMessageWindow(_("Partitioning Errors"),
                                             detailed, comments, type="ok")
            return False

        if warnings:
            detailed = _("The partitioning scheme you requested generated the \n"
                         "following warnings. Would you like to continue with \n"
                         "your requested partitioning "
                         "scheme?")

            comments = "\n\n".join(warnings)
            rc = self.intf.detailedMessageWindow(_("Partitioning Warnings"),
                                                  detailed, comments, type="custom",
                                                  customButtons=[_("Ok"), _("Cancel")], default=1)
            if rc == 1:
                return False

        formatWarnings = getPreExistFormatWarnings(self.storage)
        if formatWarnings:
            detailed = _("The following pre-existing devices have\n"
                         "been selected to be formatted, destroying\n"
                         "all data.")

            comments = ""
            for (device, type, mountpoint) in formatWarnings:
                comments = comments + "%s         %s         %s\n" % (device, type, mountpoint)

            rc = self.intf.detailedMessageWindow(_("Format Warnings"),
                                                  detailed, comments, type="custom",
                                                  customButtons=[_("Format"), _("Cancel")], default=1)
            if rc:
                return False

        return True


    def backCheck(self):
        rc = self.intf.messageWindow(_("Warning"), _("All Changes that you made will be removed"),
                                      type="custom", customIcon="question",
                                      customButtons=[_("Ok"), _("Cancel")], default=1)
        if not rc:
            self.storage.reset()
            return True
        return False

    def setupMenu(self):
        self.menu = QtGui.QMenu("New")
        self.standardDevices = self.menu.addMenu(_("Standard"))
        self.lvmDevices = self.menu.addMenu(_("LVM"))
        self.raidDevices = self.menu.addMenu(_("RAID"))

        self.createPartition = self.standardDevices.addAction(_("Partition"))
        self.createPartition.setWhatsThis(_("General purpose of partition creation"))
        self.createPartition.setVisible(False)
        self.createPhysicalVolume = self.lvmDevices.addAction(_("Physical Volume"))
        self.createPhysicalVolume.setWhatsThis(_("Create LVM formatted partition"))
        self.createPhysicalVolume.setVisible(False)
        self.createVolumeGroup = self.lvmDevices.addAction(_("Volume Group"))
        self.createVolumeGroup.setWhatsThis(_("Requires at least 1 free LVM formatted partition"))
        self.createVolumeGroup.setVisible(False)
        self.createLogicalVolume = self.lvmDevices.addAction(_("Logical Volume"))
        self.createLogicalVolume.setWhatsThis(_("Create Logical Volume on selected Volume Group"))
        self.createLogicalVolume.setVisible(False)
        self.createRaidMember = self.raidDevices.addAction(_("Member"))
        self.createRaidMember.setWhatsThis(_("Create Raid formatted partition"))
        self.createRaidMember.setVisible(False)
        self.createRaidArray= self.raidDevices.addAction(_("Array"))
        self.createRaidArray.setWhatsThis(_("Requires at least 2 free Raid formatted partition"))
        self.createRaidArray.setVisible(False)

        self.ui.newButton.setMenu(self.menu)

    def addDevice(self, device, item):
        if device.format.hidden:
            return

        format = device.format

        if not format.exists:
            formatIcon = QtGui.QIcon(":/images/tick.png")
        else:
            formatIcon = QtGui.QIcon(":/images/dialog-error.png")

        # mount point string
        if format.type == "lvmpv":
            vg = None
            for _vg in self.storage.vgs:
                if _vg.dependsOn(device):
                    vg = _vg
                    break
            mountpoint = getattr(vg, "name", "")
        elif format.type == "mdmember":
            array = None
            for _array in self.storage.raidArrays:
                if _array.dependsOn(device):
                    array = _array
                    break

            mountpoint = getattr(array, "name", "")
        else:
            mountpoint = getattr(format, "mountpoint", "")
            if mountpoint is None:
                mountpoint = ""

        # device name
        name = getattr(device, "lvname", device.name)

        # label
        label = getattr(format, "label", "")
        if label is None:
            label = ""

        item.setDevice(device)
        item.setName(name)
        item.setMountpoint(mountpoint)
        item.setLabel(label)
        item.setType(format.name)
        item.setSize("%Ld" % device.size)
        item.setFormat(formatIcon)

    def populate(self):
        # Clear device tree
        self.ui.deviceTree.clear()

        # first do LVM
        vgs = self.storage.vgs
        if vgs:
            volumeGroupsItem = DeviceTreeItem(self.ui.deviceTree)
            volumeGroupsItem.setName(_("Volume Groups"))
            for vg in vgs:
                volumeGroupItem = DeviceTreeItem(volumeGroupsItem)
                self.addDevice(vg, volumeGroupItem)
                volumeGroupItem.setType("")
                for lv in vg.lvs:
                    logicalVolumeItem = DeviceTreeItem(volumeGroupItem)
                    self.addDevice(lv, logicalVolumeItem)

                # We add a row for the VG free space.
                if vg.freeSpace > 0:
                    freeLogicalVolumeItem = DeviceTreeItem(volumeGroupItem)
                    freeLogicalVolumeItem.setName(_("Free"))
                    freeLogicalVolumeItem.setSize("%Ld" % vg.freeSpace)
                    freeLogicalVolumeItem.setDevice(None)
                    freeLogicalVolumeItem.setMountpoint("")

        # handle RAID next
        raidarrays = self.storage.raidArrays
        if raidarrays:
            raidArraysItem = DeviceTreeItem(self.ui.deviceTree)
            raidArraysItem.setName(_("Raid Arrays"))
            for array in raidarrays:
                raidArrayItem = DeviceTreeItem(raidArraysItem)
                self.addDevice(array, raidArrayItem)

        # now normal partitions
        disks = self.storage.partitioned
        # also include unpartitioned disks that aren't mpath or biosraid
        whole = filter(lambda d: not d.partitioned and not d.format.hidden,
                       self.storage.disks)
        disks.extend(whole)
        disks.sort(key=lambda d: d.name)
        # Disk&Partitions
        drivesItem = DeviceTreeItem(self.ui.deviceTree)
        drivesItem.setName(_("Hard Drives"))
        for disk in disks:
            diskItem = DeviceTreeItem(drivesItem)
            diskItem.setName("%s - %s" % (disk.model, disk.name))
            #self.ui.deviceTree.expandItem(diskItem)
            if disk.partitioned:
                partition = disk.format.firstPartition
                extendedItem = None
                while partition:
                    if partition.type & parted.PARTITION_METADATA:
                        partition = partition.nextPartition()
                        continue

                    partName = devicePathToName(partition.getDeviceNodeName())
                    device = self.storage.devicetree.getDeviceByName(partName)

                    if not device and not partition.type & parted.PARTITION_FREESPACE:
                        ctx.logger.debug("can't find partition %s in device tree" % partName)

                    # Force partitions tree item not to be less than 12 MB
                    if partition.getSize(unit="MB") <= 12.0:
                        if not partition.active or not partition.getFlag(parted.PARTITION_BOOT):
                            partition = partition.nextPartition()
                            continue

                    if device and device.isExtended:
                        if extendedItem:
                            raise RuntimeError, _("Can't handle more than "
                                                 "one extended partition per disk")
                        extendedItem = partItem = DeviceTreeItem(diskItem)
                        partitionItem = extendedItem

                    elif device and device.isLogical:
                        if not extendedItem:
                            raise RuntimeError, _("Crossed logical partition before extended")
                        partitionItem = DeviceTreeItem(extendedItem)

                    else:
                        # Free space item
                        if partition.type & parted.PARTITION_LOGICAL:
                            partitionItem = DeviceTreeItem(extendedItem)
                        else:
                            partitionItem = DeviceTreeItem(diskItem)


                    if device and not device.isExtended:
                        self.addDevice(device, partitionItem)
                    else:
                        # either extended or freespace
                        if partition.type & parted.PARTITION_FREESPACE:
                            deviceName = _("Free")
                            device = partition
                            deviceType = ""
                        else:
                            deviceName = device.name
                            deviceType = _("Extended")

                        partitionItem.setName(deviceName)
                        partitionItem.setType(deviceType)
                        size = partition.getSize(unit="MB")
                        if size < 1.0:
                            size = "< 1"
                        else:
                            size = "%Ld" % (size)
                        partitionItem.setSize(size)
                        partitionItem.setDevice(device)

                    partition = partition.nextPartition()
            else:
                self.addDevice(disk, diskItem)

        #Expands all item in selected device tree item
        for index in range(self.ui.deviceTree.topLevelItemCount()):
            self.ui.deviceTree.topLevelItem(index).setExpanded(True)
            childItem = self.ui.deviceTree.topLevelItem(index)
            for childIndex in range(childItem.childCount()):
                childItem.child(childIndex).setExpanded(True)

    def refresh(self, justRedraw=None):
        ctx.logger.debug("refresh: justRedraw=%s" % justRedraw)
        self.ui.deviceTree.clear()
        if justRedraw:
            rc = 0
        else:
            try:
                doPartitioning(self.storage)
                rc = 0
            except PartitioningError, msg:
                self.intf.messageWindow(_("Error Partitioning"), 
                                        _("Could not allocate requested partitions: %s." % msg),
                                        customIcon="error")
                rc = -1
            except PartitioningWarning, msg:
                rc = self.intf.messageWindow(_("Warning Partitioning"),
                                             _("Warning: %s." % msg),
                                             customButtons=[_("Modify Partition"), _("Continue")],
                                             customIcon="warning")
                if rc == 1:
                    rc = -1
                else:
                    rc = 0
                    all_devices = self.storage.devicetree.devices
                    bootDevs = [d for d in all_devices if d.bootable]
class Widget(QWidget, ScreenWidget):
    name = "manualPartitioning"

    def __init__(self):
        QWidget.__init__(self)
        self.ui = Ui_ManualPartWidget()
        self.ui.setupUi(self)
        self.storage = ctx.storage
        self.intf = ctx.interface

        # New Device Popup Menu
        self.setupMenu()

        #self.ui.newButtonclicked.connect(self.createDevice)
        self.ui.editButton.clicked.connect(self.editDevice)
        self.ui.deleteButton.clicked.connect(self.deleteDevice)
        self.ui.resetButton.clicked.connect(self.reset)
        self.ui.deviceTree.itemClicked[QTreeWidgetItem,
                                       int].connect(self.activateButtons)
        self.menu.triggered[QAction].connect(self.createDevice)

    def shown(self):
        checkForSwapNoMatch(self.intf, self.storage)
        self.populate()
        (errors, warnings) = self.storage.sanityCheck()
        if errors or warnings:
            ctx.mainScreen.disableNext()
        else:
            ctx.mainScreen.enableNext()
        self.update()

    def execute(self):
        ctx.logger.info("Manual Partitioning selected...")
        ctx.mainScreen.processEvents()
        check = self.nextCheck()
        if not check:
            ctx.mainScreen.enableBack()
        elif check is None:
            ctx.mainScreen.enableNext()
        return check

    def update(self):
        if self.storage.storageset.rootDevice:
            ctx.mainScreen.enableNext()
        else:
            ctx.mainScreen.disableNext()
        self.updateMenus()

    def activateButtons(self, item, index):
        if item:
            if isinstance(item.device, Device) and not isinstance(
                    item.device, parted.partition.Partition):
                self.ui.editButton.setEnabled(True)
                self.ui.deleteButton.setEnabled(True)
            else:
                self.ui.editButton.setEnabled(False)
                self.ui.deleteButton.setEnabled(False)

    def nextCheck(self):
        (errors, warnings) = self.storage.sanityCheck()
        if errors:
            detailed =  _("The partitioning scheme you requested "
                          "caused the following critical errors."
                          "You must correct these errors before "
                          "you continue your installation of %s.") \
                         % yali.util.product_name()

            comments = "\n\n".join(errors)
            self.intf.detailedMessageWindow(_("Partitioning Errors"),
                                            detailed,
                                            comments,
                                            type="error")
            return False

        if warnings:
            detailed = _("The partitioning scheme you requested generated the "
                         "following warnings. Would you like to continue with "
                         "your requested partitioning "
                         "scheme?")

            comments = "\n\n".join(warnings)
            rc = self.intf.detailedMessageWindow(
                _("Partitioning Warnings"),
                detailed,
                comments,
                type="custom",
                customIcon="warning",
                customButtons=[_("Ok"), _("Cancel")],
                default=1)
            if rc:
                return False

        formatWarnings = getPreExistFormatWarnings(self.storage)
        if formatWarnings:
            detailed = _("The following pre-existing devices have "
                         "been selected to be formatted, destroying "
                         "all data.")

            comments = ""
            for (device, type, mountpoint) in formatWarnings:
                comments = comments + "%s         %s         %s\n" % (
                    device, type, mountpoint)

            rc = self.intf.detailedMessageWindow(
                _("Format Warnings"),
                detailed,
                comments,
                type="custom",
                customIcon="warning",
                customButtons=[_("Format"), _("Cancel")],
                default=1)
            if rc:
                return False

        return True

    def backCheck(self):
        rc = self.intf.messageWindow(
            _("Warning"),
            _("All Changes that you made will be removed"),
            type="custom",
            customIcon="warning",
            customButtons=[_("Ok"), _("Cancel")],
            default=1)
        if not rc:
            self.storage.reset()
            return True
        return False

    def setupMenu(self):
        self.menu = QMenu("New")
        self.standardDevices = self.menu.addMenu(_("Standard"))
        self.lvmDevices = self.menu.addMenu(_("LVM"))
        self.raidDevices = self.menu.addMenu(_("RAID"))

        self.createPartition = self.standardDevices.addAction(_("Partition"))
        self.createPartition.setWhatsThis(
            _("General purpose of partition creation"))
        self.createPartition.setVisible(False)
        self.createPhysicalVolume = self.lvmDevices.addAction(
            _("Physical Volume"))
        self.createPhysicalVolume.setWhatsThis(
            _("Create LVM formatted partition"))
        self.createPhysicalVolume.setVisible(False)
        self.createVolumeGroup = self.lvmDevices.addAction(_("Volume Group"))
        self.createVolumeGroup.setWhatsThis(
            _("Requires at least 1 free LVM formatted partition"))
        self.createVolumeGroup.setVisible(False)
        self.createLogicalVolume = self.lvmDevices.addAction(
            _("Logical Volume"))
        self.createLogicalVolume.setWhatsThis(
            _("Create Logical Volume on selected Volume Group"))
        self.createLogicalVolume.setVisible(False)
        self.createRaidMember = self.raidDevices.addAction(_("Member"))
        self.createRaidMember.setWhatsThis(
            _("Create Raid formatted partition"))
        self.createRaidMember.setVisible(False)
        self.createRaidArray = self.raidDevices.addAction(_("Array"))
        self.createRaidArray.setWhatsThis(
            _("Requires at least 2 free Raid formatted partition"))
        self.createRaidArray.setVisible(False)

        self.ui.newButton.setMenu(self.menu)

    def addDevice(self, device, item):
        if device.format.hidden:
            return

        format = device.format

        if not format.exists:
            formatIcon = QIcon(":/gui/pics/tick.png")
        else:
            #formatIcon = QIcon(":/gui/pics/dialog-error.png")
            formatIcon = QIcon("")

        # mount point string
        if format.type == "lvmpv":
            vg = None
            for _vg in self.storage.vgs:
                if _vg.dependsOn(device):
                    vg = _vg
                    break
            mountpoint = getattr(vg, "name", "")
        elif format.type == "mdmember":
            array = None
            for _array in self.storage.raidArrays:
                if _array.dependsOn(device):
                    array = _array
                    break

            mountpoint = getattr(array, "name", "")
        else:
            mountpoint = getattr(format, "mountpoint", "")
            if mountpoint is None:
                mountpoint = ""

        # device name
        name = getattr(device, "lvname", device.name)

        # label
        label = getattr(format, "label", "")
        if label is None:
            label = ""

        item.setDevice(device)
        item.setName(name)
        item.setMountpoint(mountpoint)
        item.setLabel(label)
        item.setType(format.name)
        item.setSize("%Ld" % device.size)
        item.setFormat(formatIcon)
        item.setExpanded(True)

    def populate(self):
        # Clear device tree
        self.ui.deviceTree.clear()

        # first do LVM
        vgs = self.storage.vgs
        if vgs:
            volumeGroupsItem = DeviceTreeItem(self.ui.deviceTree)
            volumeGroupsItem.setName(_("Volume Groups"))
            volumeGroupsItem.setExpanded(True)
            for vg in vgs:
                volumeGroupItem = DeviceTreeItem(volumeGroupsItem)
                self.addDevice(vg, volumeGroupItem)
                volumeGroupItem.setType("")
                for lv in vg.lvs:
                    logicalVolumeItem = DeviceTreeItem(volumeGroupItem)
                    self.addDevice(lv, logicalVolumeItem)

                # We add a row for the VG free space.
                if vg.freeSpace > 0:
                    freeLogicalVolumeItem = DeviceTreeItem(volumeGroupItem)
                    freeLogicalVolumeItem.setName(_("Free"))
                    freeLogicalVolumeItem.setSize("%Ld" % vg.freeSpace)
                    freeLogicalVolumeItem.setDevice(None)
                    freeLogicalVolumeItem.setMountpoint("")

        # handle RAID next
        raidarrays = self.storage.raidArrays
        if raidarrays:
            raidArraysItem = DeviceTreeItem(self.ui.deviceTree)
            raidArraysItem.setName(_("Raid Arrays"))
            raidArraysItem.setExpanded(True)
            for array in raidarrays:
                raidArrayItem = DeviceTreeItem(raidArraysItem)
                self.addDevice(array, raidArrayItem)

        # now normal partitions
        disks = self.storage.partitioned
        # also include unpartitioned disks that aren't mpath or biosraid
        whole = filter(lambda d: not d.partitioned and not d.format.hidden,
                       self.storage.disks)
        disks.extend(whole)
        disks.sort(key=lambda d: d.name)
        # Disk&Partitions
        drivesItem = DeviceTreeItem(self.ui.deviceTree)
        drivesItem.setName(_("Hard Drives"))
        drivesItem.setExpanded(True)
        for disk in disks:
            diskItem = DeviceTreeItem(drivesItem)
            diskItem.setExpanded(True)
            diskItem.setName("%s - %s" % (disk.model, disk.name))
            #self.ui.deviceTree.expandItem(diskItem)
            if disk.partitioned:
                partition = disk.format.firstPartition
                extendedItem = None
                while partition:
                    if partition.type & parted.PARTITION_METADATA:
                        partition = partition.nextPartition()
                        continue

                    partName = devicePathToName(partition.getDeviceNodeName())
                    device = self.storage.devicetree.getDeviceByName(partName)

                    if not device and not partition.type & parted.PARTITION_FREESPACE:
                        ctx.logger.debug(
                            "can't find partition %s in device tree" %
                            partName)

                    # Force partitions tree item not to be less than 12 MB
                    if partition.getSize(unit="MB") <= 12.0:
                        if not partition.active or not partition.getFlag(
                                parted.PARTITION_BOOT):
                            partition = partition.nextPartition()
                            continue

                    if device and device.isExtended:
                        if extendedItem:
                            raise RuntimeError, _(
                                "Can't handle more than "
                                "one extended partition per disk")
                        extendedItem = partItem = DeviceTreeItem(diskItem)
                        partitionItem = extendedItem

                    elif device and device.isLogical:
                        if not extendedItem:
                            raise RuntimeError, _(
                                "Crossed logical partition before extended")
                        partitionItem = DeviceTreeItem(extendedItem)

                    else:
                        # Free space item
                        if partition.type & parted.PARTITION_LOGICAL:
                            partitionItem = DeviceTreeItem(extendedItem)
                        else:
                            partitionItem = DeviceTreeItem(diskItem)

                    if device and not device.isExtended:
                        self.addDevice(device, partitionItem)
                    else:
                        # either extended or freespace
                        if partition.type & parted.PARTITION_FREESPACE:
                            deviceName = _("Free")
                            device = partition
                            deviceType = ""
                        else:
                            deviceName = device.name
                            deviceType = _("Extended")

                        partitionItem.setName(deviceName)
                        partitionItem.setType(deviceType)
                        size = partition.getSize(unit="MB")
                        if size < 1.0:
                            size = "< 1"
                        else:
                            size = "%Ld" % (size)
                        partitionItem.setSize(size)
                        partitionItem.setDevice(device)

                    partition = partition.nextPartition()
            else:
                self.addDevice(disk, diskItem)

    def refresh(self, justRedraw=None):
        ctx.logger.debug("refresh: justRedraw=%s" % justRedraw)
        self.ui.deviceTree.clear()
        if justRedraw:
            rc = 0
        else:
            try:
                doPartitioning(self.storage)
                rc = 0
            except PartitioningError, msg:
                self.intf.messageWindow(
                    _("Error Partitioning"),
                    _("Could not allocate requested partitions: %s.") % msg,
                    customIcon="error")
                rc = -1
            except PartitioningWarning, msg:
                rc = self.intf.messageWindow(
                    _("Warning Partitioning"),
                    _("Warning: %s.") % msg,
                    customButtons=[_("Modify Partition"),
                                   _("Continue")],
                    customIcon="warning")
                if rc == 1:
                    rc = -1
                else:
                    rc = 0
                    all_devices = self.storage.devicetree.devices
                    bootDevs = [d for d in all_devices if d.bootable]