r4054 Merge most of the code from Ernest Shaffer's objectlog plugin:
authorDenis Ovsienko <infrastation@yandex.ru>
Sun, 19 Dec 2010 15:07:16 +0000 (15:07 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Sun, 19 Dec 2010 15:07:16 +0000 (15:07 +0000)
SQL schema: add ObjectLog table
navigation: add extra top-level page and a tab for object page
deleteObjectLog(): new handler function
addObjectlog(): ditto
renderRackObject(): add "log records" portlet
renderObjectLogEditor(): new function for editor tab
allObjectLogs(): new function, table viewer
renderGlobalLogEditor(): new function, placeholder
getLogRecordsForObject(): new function, table reader
getLogRecords(): idem

inc/database.php
inc/interface.php
inc/navigation.php
inc/ophandlers.php
install/init-structure.sql
upgrade.php

index a6cea6d..cf5c548 100644 (file)
@@ -4414,4 +4414,21 @@ function getChapterAttributes($chapter_id)
        return is_array($rows) ? $rows : array();
 }
 
+function getLogRecordsForObject ($object_id)
+{
+       $result = usePreparedSelectBlade ('SELECT id, content, date, user FROM ObjectLog WHERE object_id = ? ORDER BY date DESC', array ($object_id));
+       return $result->fetchAll (PDO::FETCH_ASSOC);
+}
+
+function getLogRecords()
+{
+       $result = usePreparedSelectBlade
+       (
+               'SELECT o.id as logid, r.name, o.content, o.date, o.user, r.id as object_id ' .
+               'FROM ObjectLog o Left JOIN RackObject r ON o.object_id = r.id ' .
+               'ORDER BY o.date DESC'
+       );
+       return $result->fetchAll (PDO::FETCH_ASSOC);
+}
+
 ?>
index abd4e82..6955fca 100644 (file)
@@ -109,6 +109,9 @@ $image['reports']['height'] = 200;
 $image['8021q']['path'] = 'pix/8021q.png';
 $image['8021q']['width'] = 218;
 $image['8021q']['height'] = 200;
+$image['objectlog']['path'] = 'pix/crystal-mimetypes-shellscript-218x200.png';
+$image['objectlog']['width'] = 218;
+$image['objectlog']['height'] = 200;
 $image['download']['path'] = 'pix/download.png';
 $image['download']['width'] = 16;
 $image['download']['height'] = 16;
@@ -988,6 +991,23 @@ function renderRackObject ($object_id)
                finishPortlet ();
        }
 
+       if (count ($logrecords = getLogRecordsForObject ($_REQUEST['object_id'])))
+       {
+               startPortlet ('log records');
+               echo "<table cellspacing=0 cellpadding=5 align=center class=widetable width='100%'>";
+               $order = 'odd';
+               foreach (getLogRecordsForObject ($_REQUEST['object_id']) as $row)
+               {
+                       echo "<tr class=row_${order} valign=top>";
+                       echo '<td class=tdleft>' . $row['date'] . '<br>' . $row['user'] . '</td>';
+                       echo '<td class="slbconf rsvtext">' . string_insert_hrefs ($row['content']) . '</td>';
+                       echo '</tr>';
+                       $order = $nextorder[$order];
+               }
+               echo '</table>';
+               finishPortlet();
+       }
+
        renderFilesPortlet ('object', $object_id);
 
        if (count ($info['ports']))
@@ -8991,4 +9011,70 @@ function getAutoScrollScript ($ancor_name)
 END;
 }
 
+//
+// Display object level logs
+//
+function renderObjectLogEditor ()
+{
+       global $nextorder;
+
+       echo '<center><h3>log records for this object (<a href=?page=objectlog>complete list</a>)</h3></center>';
+
+       printOpFormIntro ('add');
+       echo "<table with=80% align=center border=0 cellpadding=5 cellspacing=0 align=center class=cooltable><tr valign=top class=row_odd>";
+       echo '<td class=tdcenter>' . getImageHREF ('CREATE', 'add record', TRUE, 101) . '</td>';
+       echo '<td><textarea name=logentry rows=10 cols=80 tabindex=100></textarea></td>';
+       echo '<td class=tdcenter>' . getImageHREF ('CREATE', 'add record', TRUE, 101) . '</td>' ;
+       echo '</tr></form>';
+
+       $order = 'even';
+       foreach (getLogRecordsForObject ($_REQUEST['object_id']) as $row)
+       {
+               echo "<tr class=row_${order} valign=top>";
+               echo '<td class=tdleft>' . $row['date'] . '<br>' . $row['user'] . '</td>';
+               echo '<td class="slbconf rsvtext">' . string_insert_hrefs ($row['content']) . '</td>';
+               echo "<td class=tdleft><a href=\"".makeHrefProcess(array('op'=>'del', 'logid'=>$row['id'], 'object_id'=>$_REQUEST['object_id']))."\">";
+               echo getImageHREF ('DESTROY', 'Delete log entry') . '</a></td>';
+               echo '</tr>';
+               $order = $nextorder[$order];
+       }
+       echo '</table>';
+}
+
+//
+// Display form and All log entries
+//
+function allObjectLogs ()
+{
+       global $nextorder;
+
+       echo "<br><table width='80%' align=center border=0 cellpadding=5 cellspacing=0 align=center class=cooltable>";
+       echo '<tr valign=top><th class=tdleft>Object</th><th class=tdleft>Date/user</th>';
+       echo '<th class=tdcenter>' . getImageHREF ('text') . '</th></tr>';
+
+       $order = 'odd';
+       foreach (getLogRecords() as $row)
+       {
+               echo "<tr class=row_${order} valign=top>";
+               echo "<td align=left><a href='".makeHref(array('page'=>'object', 'tab'=>'log', 'object_id'=>$row['object_id']))."'>${row['name']}</a></td>";
+               echo '<td class=tdleft>' . $row['date'] . '<br>' . $row['user'] . '</td>';
+               echo '<td class="slbconf rsvtext">' . string_insert_hrefs ($row['content']) . '</td>';
+               echo '</tr>';
+               $order = $nextorder[$order];
+       }
+       echo '</table>';
+}
+
+function renderGlobalLogEditor()
+{
+       echo "<table with='80%' align=center border=0 cellpadding=5 cellspacing=0 align=center class=cooltable><tr valign=top>";
+       printOpFormIntro ('add');
+       echo '<th align=left>Name: ' . getSelect (getNarrowObjectList(), array ('name' => 'object_id')) . '</th>';
+       echo "<tr><td align=left><table with=100% border=0 cellpadding=0 cellspacing=0><tr><td colspan=2><textarea name=logentry rows=3 cols=80></textarea></td></tr>";
+       echo '<tr><td align=left></td><td align=right>' . getImageHREF ('CREATE', 'add record', TRUE) . '</td>';
+       echo '</tr></table></td></tr>';
+       echo '</form>';
+       echo '</table>';
+}
+
 ?>
index f5888be..e4a2154 100644 (file)
@@ -16,7 +16,7 @@ $indexlayout = array
 (
        array ('rackspace', 'depot', 'ipv4space', 'ipv6space'),
        array ('files', 'reports', 'ipv4slb', '8021q'),
-       array ('config'),
+       array ('config', 'objectlog'),
 );
 
 $page['index']['title'] = 'Main page';
@@ -87,6 +87,7 @@ $page['object']['bypass_tabs'] = array ('hl_port_id');
 $page['object']['parent'] = 'depot';
 $tab['object']['default'] = 'View';
 $tab['object']['edit'] = 'Properties';
+$tab['object']['log'] = 'Log';
 $tab['object']['rackspace'] = 'Rackspace';
 $tab['object']['ports'] = 'Ports';
 $tab['object']['ipv4'] = 'IPv4';
@@ -107,6 +108,7 @@ $tab['object']['8021qports'] = '802.1Q ports';
 $tab['object']['8021qsync'] = '802.1Q sync';
 $tabhandler['object']['default'] = 'renderRackObject';
 $tabhandler['object']['edit'] = 'renderEditObjectForm';
+$tabhandler['object']['log'] = 'renderObjectLogEditor';
 $tabhandler['object']['rackspace'] = 'renderRackSpaceForObject';
 $tabhandler['object']['ports'] = 'renderPortsForObject';
 $tabhandler['object']['ipv4'] = 'renderIPv4ForObject';
@@ -159,6 +161,8 @@ $ophandler['object']['ipv6']['delIPv6Allocation'] = 'delIPv6Allocation';
 $ophandler['object']['edit']['clearSticker'] = 'clearSticker';
 $ophandler['object']['edit']['update'] = 'updateObject';
 $ophandler['object']['edit']['resetObject'] = 'resetObject';
+$ophandler['object']['log']['add'] = 'addObjectlog';
+$ophandler['object']['log']['del'] = 'deleteObjectLog';
 $ophandler['object']['nat4']['addNATv4Rule'] = 'addPortForwarding';
 $ophandler['object']['nat4']['delNATv4Rule'] = 'delPortForwarding';
 $ophandler['object']['nat4']['updNATv4Rule'] = 'updPortForwarding';
@@ -614,4 +618,11 @@ $page['dqueue']['bypass_type'] = 'string';
 $tab['dqueue']['default'] = 'View';
 $tabhandler['dqueue']['default'] = 'renderDeployQueue';
 
+$page['objectlog']['title'] = 'Log records';
+$page['objectlog']['parent'] = 'index';
+$tab['objectlog']['default'] = 'View';
+#$tab['objectlog']['add'] = 'Add'; // FIXME: finish, then enable
+$tabhandler['objectlog']['default'] = 'allObjectLogs';
+#$tabhandler['objectlog']['add'] = 'renderGlobalLogEditor';
+
 ?>
index 1d8f0c6..adac640 100644 (file)
@@ -2839,4 +2839,24 @@ function importDPData()
        return buildRedirectURL (__FUNCTION__, 'OK', array ($nignored, $ndone));
 }
 
+$msgcode['deleteObjectLog']['OK'] = 77;
+function deleteObjectLog ()
+{
+       assertUIntArg ('logid');
+       usePreparedDeleteBlade ('ObjectLog', array ('id' => $_REQUEST['logid']));
+       return buildRedirectURL (__FUNCTION__, 'OK', array ('log entry'));
+}
+
+$msgcode['addObjectlog']['OK'] = 0;
+function addObjectlog ()
+{
+       assertUIntArg ('object_id');
+       assertStringArg ('logentry');
+       global $remote_username, $sic;
+       $oi = spotEntity ('object', $sic['object_id']);
+       usePreparedExecuteBlade ('INSERT INTO ObjectLog SET object_id=?, user=?, date=NOW(), content=?', array ($sic['object_id'], $remote_username, $sic['logentry']));
+       $ob_url = makeHref (array ('page' => 'object', 'tab' => 'objectlog', 'object_id' => $sic['object_id']));
+       return buildRedirectURL (__FUNCTION__, 'OK', array ("Log entry for <a href=" . ${ob_url} . ">${oi['dname']}</a> added by ${remote_username}"));
+}
+
 ?>
index 4b5e680..5313046 100644 (file)
@@ -268,6 +268,18 @@ CREATE TABLE `MountOperation` (
   CONSTRAINT `MountOperation-FK-object_id` FOREIGN KEY (`object_id`) REFERENCES `RackObject` (`id`) ON DELETE CASCADE
 ) ENGINE=InnoDB;
 
+CREATE TABLE `ObjectLog` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `object_id` int(10) unsigned NOT NULL,
+  `user` char(64) NOT NULL,
+  `date` datetime NOT NULL,
+  `content` text NOT NULL,
+  PRIMARY KEY (`id`),
+  KEY `object_id` (`object_id`),
+  KEY `date` (`date`),
+  CONSTRAINT `ObjectLog-FK-object_id` FOREIGN KEY (`object_id`) REFERENCES `RackObject` (`id`)
+) ENGINE=InnoDB;
+
 CREATE TABLE `Port` (
   `id` int(10) unsigned NOT NULL auto_increment,
   `object_id` int(10) unsigned NOT NULL default '0',
index 83fc18f..2d6c481 100644 (file)
@@ -797,6 +797,19 @@ CREATE TABLE `VLANIPv6` (
   CONSTRAINT `VLANIPv6-FK-compound` FOREIGN KEY (`domain_id`, `vlan_id`) REFERENCES `VLANDescription` (`domain_id`, `vlan_id`) ON DELETE CASCADE,
   CONSTRAINT `VLANIPv6-FK-ipv6net_id` FOREIGN KEY (`ipv6net_id`) REFERENCES `IPv6Network` (`id`) ON DELETE CASCADE
 ) ENGINE=InnoDB
+";
+                       $query[] = "
+CREATE TABLE `ObjectLog` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `object_id` int(10) unsigned NOT NULL,
+  `user` char(64) NOT NULL,
+  `date` datetime NOT NULL,
+  `content` text NOT NULL,
+  PRIMARY KEY (`id`),
+  KEY `object_id` (`object_id`),
+  KEY `date` (`date`),
+  CONSTRAINT `ObjectLog-FK-object_id` FOREIGN KEY (`object_id`) REFERENCES `RackObject` (`id`)
+) ENGINE=InnoDB
 ";
                        $query[] = "ALTER TABLE `TagStorage` CHANGE COLUMN `entity_realm` `entity_realm` ENUM('file','ipv4net','ipv4vs','ipv4rspool','object','rack','user','ipv6net') NOT NULL DEFAULT 'object' FIRST";
                        $query[] = "ALTER TABLE `FileLink` CHANGE COLUMN `entity_type` `entity_type` ENUM('ipv4net','ipv4rspool','ipv4vs','object','rack','user','ipv6net') NOT NULL DEFAULT 'object' AFTER `file_id`";