Code

Added list actions
[gosa.git] / gosa-core / plugins / admin / newConfigManagement / class_newConfigManagement.inc
index 3694b9d38faedd3a3738dbaffad3fe238f9b9c5e..f038f01b399189f217070530afeff19b0ce6d364 100644 (file)
@@ -6,60 +6,195 @@ class newConfigManagement extends plugin
     var $plHeadline = "Config management";
     var $plDescription = "Config management";
 
-    var $installationMethods = array();
+    var $selectedContainer;
+    var $selectedItem;
 
+    var $dataModel = NULL;
+    var $listing = NULL;
+
+
+    /*! \brief  Initialize the plugin and finally update the data model.
+     */
     function __construct($config, $dn)
     {
         $this->config = &$config;
+        $this->listing = new ConfigManagementListing($this->config, get_userinfo(), $this);
 
-        $this->listing = new ConfigManagementListing($this->config, get_userinfo());
-        $this->dataModel = new ConfigManagementDataModel();
-
-
-#       $dists = $this->getDistributions();
-#       foreach($dists as $name => $dist){
-#
-#           
-#           $this->dataModel->addItem
-#   
-#           
-#       }
-#        
-#   
-#
-#
-#
-#       // Get installation methods from the backend.
-#       $this->loadInstallationMethods();
+        // Request an update of the data model
+        $this->updateDataModel();
     }
 
-    
-    function getDistributions()
+
+    /*! \brief  Updates all distributions, releases, packages and items in the dataModel
+     *          Load information from the backend.
+     */
+    function updateDataModel()
     {
-        return(
-            array(
-                'debian' => 
-                    array('type' => 'deb', 'install_method' => 'puppet'),
-                'suse' => 
-                    array('type' => 'rpm', 'install_method' => 'muppet')
-            ));
+        // Recreate the data model, to have a clean and fresh instance.
+        $this->dataModel = new ConfigManagementDataModel();
+
+        // Load distributions 
+        $rpc = $this->config->getRpcHandle();
+        $res = $rpc->getDistributions();
+        if(!$rpc->success()){
+            msg_dialog::display(_("Error"), sprintf(_("Failed to load distributions, error was '%s'!"), $rpc->get_error()),ERROR_DIALOG);
+            return(NULL);
+        }
+        foreach($res as $dist){
+            $this->dataModel->addItem('Distribution','/root', $dist['name'], $dist);
+            foreach($dist['releases'] as $release){
+                $distPath = "/root/{$dist['name']}";
+                $this->dataModel->addItem('Release',$distPath, $release['name'], $release);
+
+                foreach($dist['components'] as $component){
+                    $comPath = "{$distPath}/{$release['name']}";
+                    $this->dataModel->addItem('Component',$comPath, $component['name'], $component);
+                }
+            }
+        }
     }
 
 
+    /*! \brief  Keep track of posted values and populate those 
+     *           which are interesting for us.
+     *          Inspects the _POST and _GET values.
+     */
+    function save_object()
+    {
+        // Update the listing class, this is necessary to get post
+        //  actions from it.
+        $this->listing->save_object();
+
+        // Get the selected distribution and release from the listing widget.
+        $this->selectedContainer = $this->listing->getSelectedContainer();
+        $this->selectedItem = $this->listing->getSelectedItem();
+  
+        // Get a list of all available distributions and releases.
+        $distList = $this->getDistList();
+        $releaseList = $this->getItemList();
+
+        // Ensure that we've valid values selected.
+        if(!isset($releaseList[$this->selectedItem])){
+            if(count($releaseList)){
+                $this->selectedItem = key($releaseList);
+            }else{
+                $this->selectedItem = "";
+            }
+        }
 
+        // Update list of items within the selected container. 
+        $this->updateItemList($this->selectedContainer);
 
+        // Transfer checked values back to the listing class.
+        $this->listing->setContainer($this->selectedContainer);
+        $this->listing->setItem($this->selectedItem);
+        $this->listing->setContainers($this->getDistList());
+        $this->listing->setItems($this->getItemList());
+    }
 
 
+    function updateItemList($path)
+    {
+        // Fist get Item and check if it is an release 
+        if($this->dataModel->itemExistsByPath($path)){
+            $data = $this->dataModel->getItemByPath($path);
+
+            // Only releases can contain config-items.
+            if($data['type'] == 'Release' && $data['status'] != "fetched"){
+
+                $rpc = $this->config->getRpcHandle();
+                $res = $rpc->listConfigItems($data['name']);
+                if(!$rpc->success()){
+                    msg_dialog::display(_("Error"), 
+                            sprintf(_("Failed to load distributions, error was '%s'!"), 
+                                $rpc->get_error()),ERROR_DIALOG);
+                }else{
+                    $this->dataModel->setItemStatus($path, 'käse');
+                    $rpc = $this->config->getRpcHandle();
+                    $res = $rpc->getPackages($data['name']);
+
+                    return;
+                    foreach($res as $itemPath => $type){
+                
+                        // Make names dataModel conform
+                        $itemPath = $path.'/'.preg_replace("/^\//","/root", $itemPath);
+                        $name = preg_replace("/^.*\//","",$itemPath);   
+                        $itemPath = preg_replace("/\/[^\/]*$/","", $itemPath);
+                        $this->dataModel->addItem($type, $itemPath, $name); 
+                    }
+                }
+            }
+        }
+    }
 
 
+    /*! \brief  Generate the HTML content for this plugin.
+     *          Actually renders the listing widget..
+     */
+    function execute()
+    {
 
+        // Get the selected release and store it in a session variable
+        //  to allow the configFilter to access it and display the
+        //  packages and items.
+        $path = $this->selectedContainer.$this->selectedItem;
+        $item = $this->dataModel->getItemByPath($path);
+        session::set('CONFIG_ITEM', $item);
+        $this->listing->setListingTypes($this->getListingTypes());
 
+        return($this->listing->execute());
+    }
 
 
+    /*! \brief  Returns a simply list of all releases of the CURRENT distribution.
+     *          This list will then be used to generate the entries of the 
+     *           ItemSelectors in the listing class.
+     */
+    function getItemList()
+    {
+        $data = $this->dataModel->getItemByPath($this->selectedContainer);
+        $res = array(""=>"/");
+        if($data['type'] != 'Release'){
+        }else{
+            $res = array_merge($res,$this->__recurseItem($data, array('Component'),$this->selectedContainer));
+        }
+        return($res);
+    }
+    
+    
+    /*! \brief  Returns a simply list of all distributions.
+     *          This list will then be used to generate the entries of the 
+     *           ItemSelectors in the listing class.
+     */
+    function getDistList()
+    {
+        $data = $this->dataModel->getItemByPath('/root');
+        $res["/root"] = "/";
+        $res = array_merge($res,$this->__recurseItem($data, array('Distribution','Release')));
+        return($res);
+    }
+    
 
+    function __recurseItem($item, $types, $parent = "")
+    {
+        $res = array();
+        if(in_array($item['type'], $types)){
+            $path = preg_replace("/".preg_quote($parent,'/')."/","",$item['path']);
+            $res[$path] = $item['name'];
+        }
+        if(count($item['children'])){
+            foreach($item['children'] as $child){
+                $res = array_merge($res, $this->__recurseItem($child, $types, $parent));
+            }
+        }
+        return($res);
+    }
 
 
 
+    function remove_lock()
+    {
+    }
 
     
     /*! \brief  Intializes this plugin
@@ -87,34 +222,45 @@ class newConfigManagement extends plugin
             $this->initFailed = TRUE;
             return;
         }
+    }
 
 
-        $this->getReleases();
+    function getListingTypes()
+    {
+        $types= array();
+        $types['Distribution']['objectClass'] = 'Distribution';
+        $types['Distribution']['label'] = _('Distribution');
+        $types['Distribution']['image'] = 'images/lists/edit.png';
+        $types['Distribution']['category'] = 'Device';
+        $types['Distribution']['class'] = 'Device';
+
+        $types['Release']['objectClass'] = 'Release';
+        $types['Release']['label'] = _('Release');
+        $types['Release']['image'] = 'images/lists/delete.png';
+        $types['Release']['category'] = 'Device';
+        $types['Release']['class'] = 'Device';
+
+        $types['Component']['objectClass'] = 'Component';
+        $types['Component']['label'] = _('Component');
+        $types['Component']['image'] = 'plugins/users/images/select_user.png';
+        $types['Component']['category'] = 'Device';
+        $types['Component']['class'] = 'Device';
+        return($types);
     }
 
-    
 
-   
-    function getReleases()
+
+    function editEntry($id)
     {
-        $rpc = $this->config->getRpcHandle();
-        $res = $rpc->getReleases();
-        if(!$rpc->success()){
-            $this->rpcError = TRUE;
-            $this->errorMessage = $rpc->get_error();;
-            return(NULL);
-        }
-        return($res);
+        print_a($id);
     }
 
-    function execute()
+
+    function removeEntry($id)
     {
-        return($this->listing->renderList());
+        print_a($id); 
     }
 
-    function remove_lock()
-    {}
 
     public static function plInfo()
     {
@@ -131,8 +277,5 @@ class newConfigManagement extends plugin
                     "plProvidedAcls"=> array()
                     ));
     }
-
 }
-
-
 ?>