r1952 + implement tag roller
authorDenis Ovsienko <infrastation@yandex.ru>
Fri, 6 Jun 2008 18:49:09 +0000 (18:49 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Fri, 6 Jun 2008 18:49:09 +0000 (18:49 +0000)
+ introduce addTagForEntity() and fix saveEntityTags() to stop calling useInsertBlade() directly

ChangeLog
inc/database.php
inc/interface.php
inc/navigation.php
inc/ophandlers.php

index 90ea802..fd6de3d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5 @@
+0.15.2
+       new feature: tag roller
 0.15.1 2008-06-05
        bugfix: fix auth headers in upgrade script (broken in 0.15.0)
        new feature: fetch switch serial number via SNMP (by killsystem)
index dad584d..9d165a7 100644 (file)
@@ -2651,4 +2651,18 @@ function deleteTagsForEntity ($entity_realm, $entity_id)
                return TRUE;
 }
 
+function addTagForEntity ($realm, $entity_id, $tag_id)
+{
+       return useInsertBlade
+       (
+               'TagStorage',
+               array
+               (
+                       'target_realm' => "'${realm}'",
+                       'target_id' => $entity_id,
+                       'tag_id' => $tag_id,
+               )
+       );
+}
+
 ?>
index 19a2031..b6d6a88 100644 (file)
@@ -4965,9 +4965,26 @@ function renderTagSelect ()
        echo '</select><br>';
 }
 
-function renderTagRollerForRow ()
+function renderTagRollerForRow ($row_id)
 {
-       dragon();
+       global $root, $pageno, $tabno;
+       $a = rand (1, 20);
+       $b = rand (1, 20);
+       $sum = $a + $b;
+       showMessageOrError();
+       echo "<form method=post action='${root}process.php?page=${pageno}&tab=${tabno}&op=rollTags'>";
+       echo "<input type=hidden name=row_id value='${row_id}'>";
+       echo "<input type=hidden name=realsum value='${sum}'>";
+       echo "<table border=1 align=center>";
+       echo "<tr><td colspan=2>This special tool allows assigning tags to physical contents (racks <s>and contained objects</s>) of the current ";
+       echo "rack row.<br>The tag(s) selected below will be ";
+       echo "appended to already assigned tag(s) of each particular entity. </td></tr>";
+       echo "<tr><th>Tags</th><td>";
+       renderTagSelect();
+       echo "</td></tr>";
+       echo "<tr><th>Control question: the sum of ${a} and ${b}</th><td><input type=text name=sum></td></tr>";
+       echo "<tr><td colspan=2 align=center><input type=submit value='Go!'></td></tr>";
+       echo "</table>";
 }
 
 function renderObjectSLB ()
index 34de28f..02b0442 100644 (file)
@@ -38,10 +38,11 @@ $page['row']['bypass_type'] = 'uint';
 $page['row']['parent'] = 'rackspace';
 $tab['row']['default'] = 'View';
 $tab['row']['newrack'] = 'Add new rack';
-$tab['row']['tagroller'] = '[Tag roller]';
+$tab['row']['tagroller'] = 'Tag roller';
 $tabhandler['row']['default'] = 'renderRow';
 $tabhandler['row']['newrack'] = 'renderNewRackForm';
 $tabhandler['row']['tagroller'] = 'renderTagRollerForRow';
+$ophandler['row']['tagroller']['rollTags'] = 'rollTags';
 
 $page['rack']['title_handler'] = 'dynamic_title_rack';
 $page['rack']['bypass'] = 'rack_id';
index b605012..5f1a6b9 100644 (file)
@@ -1284,12 +1284,10 @@ function saveEntityTags ($realm, $bypass)
        $newtrail = getExplicitTagsOnly (buildTrailFromIds ($taglist));
        $n_succeeds = $n_errors = 0;
        foreach ($newtrail as $taginfo)
-       {
-               if (useInsertBlade ('TagStorage', array ('target_realm' => "'${realm}'", 'target_id' => $entity_id, 'tag_id' => $taginfo['id'])))
+               if (addTagForEntity ($realm, $entity_id, $taginfo['id']))
                        $n_succeeds++;
                else
                        $n_errors++;
-       }
        if ($n_errors)
                return "${root}?page=${pageno}&tab=${tabno}&${bypass}=${entity_id}&error=" . urlencode ("Replaced trail with ${n_succeeds} tags, but experienced ${n_errors} errors.");
        else
@@ -1360,4 +1358,30 @@ function updateTag ()
                return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ("Could not update tag '${tagname}' because of error '${ret}'");
 }
 
+function rollTags ()
+{
+       global $root, $pageno, $tabno;
+       assertUIntArg ('row_id', __FUNCTION__);
+       assertStringArg ('sum', __FUNCTION__, TRUE);
+       assertUIntArg ('realsum', __FUNCTION__);
+       $row_id = $_REQUEST['row_id'];
+       if ($_REQUEST['sum'] != $_REQUEST['realsum'])
+               return "${root}?page=${pageno}&tab=${tabno}&row_id=${row_id}&error=" . urlencode ("test failed");
+       $racks = getRacksForRow ($row_id);
+       // Each time addTagForEntity() fails we assume it was just because of already existing record in its way.
+       $newtags = isset ($_REQUEST['taglist']) ? $_REQUEST['taglist'] : array();
+       $tagstack = getExplicitTagsOnly (buildTrailFromIds ($newtags));
+       $ndupes = $nnew = 0;
+       foreach ($tagstack as $taginfo)
+               foreach ($racks as $rackInfo)
+               {
+                       if (addTagForEntity ('rack', $rackInfo['id'], $taginfo['id']))
+                               $nnew++;
+                       else
+                               $ndupes++;
+                       // FIXME: do something likewise for all object inside current rack
+               }
+       return "${root}?page=${pageno}&tab=${tabno}&row_id=${row_id}&message=" . urlencode ("${nnew} new records done, ${ndupes} already existed");
+}
+
 ?>