Een robot in jouw Drupal social intranet - waarom en hoe?

20 Jan 2015

Joris Snoek - Business Dev
+31 (0)20 - 261 14 99

Als je met een team samenwerkt aan projecten, dan zijn er (uiteraard) taken te verdelen. Waarbij ook taken die opgevolgd moeten worden door jouw klanten.

Bijvoorbeeld: het aanleveren van een ontwerp in photoshop/fireworks voor hun nieuwe social intranet.

Nu wil het nog wel eens voorkomen dat iemand zijn taak niet op tijd opvolgt, waardoor je planning in de knoop kan komen. Meestal is het geen onwil, vaak is het hen 'even ontschoten'. 

Zonde van je tijd

Om in de afgesproken planning te blijven, zou je dus elke dag moeten kijken of er geen taken zijn, waar de klant over zijn deadline heen is. 

Zonder teamwork-tool / social intranet is dit niet te doen. En zelf mét zo'n online samenwerkingsomgeving is het alsnog een behoorlijke klus om alle projecten, taken en kalenders af te lopen. En vervolgens handmatige mails te typen, om te vragen hoe het er voor staat.

Zonde van je kostbare tijd.

Besteed dit daarom uit, aan een robot!

Beter projectbeheer door robot

Het beheer van je projecten wordt een stuk aangenamer en consistenter, als je een robot aan het werk zet. Wij deden dit ook in ons drupal social intranet OpenLucius.

Deze robot is een automatisch scriptje dat elke nacht draait. Die checkt of taken over de afgesproken deadline heen zijn. Zo ja, dan krijgt betreffende persoon een notificatie e-mail, waarin gevraagd wordt om een reactie. Tevens wordt dit opgenomen door de robot in een reactie onder betreffende Todo (taak).

Dit geldt niet alleen voor klanten, maar ook deadlines voor leveranciers, of bijvoorbeeld freelancers waar je mee werkt.

Automatisch informeren

Door deze robot in te schakelen, hoef je dus niet zelf door alle projecten en taken heen te akkeren. De robot ploetert voor je en informeert volledig automatisch de juiste personen.

Technische implementatie in Drupal

De technische implementatie is grof gezien tweeledig:

  1. Configuratie pagina 
  2. Een Drupal script, die periodiek (cronjob) draait

1. Configuratie pagina robot

Wij hebben ten eerste een configuratie pagina gemaakt, waarin we volgende kunnen instellen:

  • Is de robot ingeschakeld of niet.
  • Welke Drupal user wil je als robot gebruiken.
  • Bij welke status van de todo moet de robot ingrijpen.
  • Wat is de tekst die de robot moet plaatsen in een reactie, zodra hij ingrijpt.
  • Wat is de maximale tijd dat een todo mag openstaan, voordat de robot ingrijpt.
  • Naar welke status moet de todo gezet worden als de robot ingrijpt.

Een screeenshot van deze configuratie pagina:

 

2. Script tbv de robot

 

/** * Implements hook_cron(). */function openlucius_workflow_cron() {    // Only trigger if the robot is enabled, for safety default to FALSE.  if (variable_get('openlucius_workflow_robot_enabled', FALSE)) {      // Get all the terms that are selected.    $selected = variable_get('openlucius_workflow_robot_from_status');    // Only add them if they are checked.    foreach ($selected as $key => $value) {      if ($key == $value) {        $in[] = $value;      }    }    // Get all the nodes that have the from status.    $query = db_select('node', 'n');    $query->join('comment', 'c', 'n.nid = c.nid');    $query->join('field_data_field_todo_label', 'term', 'n.nid = term.entity_id');    $query->fields('n', array('nid'));    $query->fields('c', array('cid', 'created'));    $query->fields('term', array('field_todo_label_tid'));    $query->condition('field_todo_label_tid', $in, 'IN');    $query->condition('type', 'ol_todo', '=');    $result = $query->execute();    $list = array();    // The results have each comment for the node, filter for the last one.    foreach ($result as $item) {      if (!$list[$item->nid]) {        $list[$item->nid] = $item;      }      else {         // Check if this comment is newer.        if ($item->cid > $list[$item->nid]->cid) {          $list[$item->nid] = $item;        }      }    }      // Defaults.    $expire = strtotime('-' . variable_get('openlucius_workflow_robot_expire', '1 week'));    $new_status = variable_get('openlucius_workflow_robot_to_status');    $uid = variable_get('openlucius_workflow_robot_user');    $subject = variable_get('openlucius_workflow_robot_subject');    $body = variable_get('openlucius_workflow_robot_body');    // Ok, we now have the list of all the latest comments.    foreach ($list as $item) {       // Check if its older then the configured time.      if ($item->created < $expire) {        $node = node_load($item->nid);        // Change the status to the new one.        $node->field_todo_label[LANGUAGE_NONE][0]['tid'] = $new_status;        $node->revision = TRUE;        $old_vid = $node->vid;        node_save($node);        // Create a new comment.        $comment = (object) array(          'nid' => $node->nid,          'cid' => 0,          'pid' => 0,                  // Use the configured user.          'uid' => $uid,          'mail' => '',          'is_anonymous' => 0,          'homepage' => '',          'status' => COMMENT_PUBLISHED,                   // Use the configured subject.          'subject' => $subject,          'language' => LANGUAGE_NONE,          'comment_body' => array(            LANGUAGE_NONE => array(              0 => array (                             // Use the configured body.                'value' => $body,              )            )          ),        );        // Save the comment.        comment_submit($comment);        comment_save($comment);        // Create a new comment alter entry, used for displaying the differences        // when a comment is viewed.        _openlucius_workflow_comment_alter_insert($old_vid, $node->vid, $comment->cid);      }    }  }}

 

Toelichting technische Drupal implementatie

Een grove opsomming wat het script doet:

  1. Check of de robot ingeschakeld staat
  2. Verzamel alle todo's die een bepaalde status hebben (in ons geval: pending input, intern test ready, extern test ready & live ready)
  3. Check de datum van de laatst reacties op betreffende todo's
  4. ==> Nu is er een lijst van todo's verzameld,  die te lang inactief zijn
  5. Plaats een reactie namens de robot
  6. Zet de todo naar gewenste status, in dit geval 'open'

==> Wanneer je nu een Drupal View maakt, die een lijstje geeft van 'open' todo's, dan zie je precies welke todo's te lang inactief zijn.

Module release

We zijn bezig om hier een generieke module van te maken, om de publiceren op http://drupal.org.

Laat me even weten als je hier interesse in hebt of wellicht vragen hebt daarover.

Wrap up

Dus: besteed je werk uit aan een robot, bespaar hierdoor tijd en draai betere projecten. Happy samenwerken!

Bron foto

Comments

Nóg meer
kennis nodig?

Check ons ons blog archief >