Issue #1621046 by mikran: Added owners for relation revisions.
authorMikko Rantanen
Wed, 25 Jul 2012 17:54:02 +0000 (20:54 +0300)
committerMikko Rantanen
Wed, 25 Jul 2012 17:54:02 +0000 (20:54 +0300)
relation.module
tests/relation.test

index 3dce4ba..b74085d 100644 (file)
@@ -19,7 +19,7 @@ function relation_entity_info() {
     'base table' => 'relation',
     'revision table' => 'relation_revision',
     'fieldable' => TRUE,
-    'controller class' => 'DrupalDefaultEntityController',
+    'controller class' => 'RelationController',
     'save callback' => 'relation_save',
     'creation callback' => 'relation_rules_create',
     'deletion callback' => 'relation_delete',
@@ -620,7 +620,11 @@ function relation_create($type, $endpoints, $account = NULL) {
  * @return
  *   The new relation id.
  */
-function relation_save($relation) {
+function relation_save($relation, $account = NULL) {
+  if (!isset($account)) {
+    $account = $GLOBALS['user'];
+  }
+  global $user;
   try {
     field_attach_validate('relation', $relation);
   }
@@ -649,7 +653,10 @@ function relation_save($relation) {
   field_attach_presave('relation', $relation);
   module_invoke_all('entity_presave', $relation, 'relation');
   unset($relation->vid);
+  $temp_uid = $relation->uid;
+  $relation->uid = $account->uid;
   drupal_write_record('relation_revision', $relation);
+  $relation->uid = $temp_uid;
   drupal_write_record('relation', $relation, $keys);
   if ($relation->is_new) {
     db_update('relation_revision')
@@ -930,3 +937,24 @@ function relation_get_type_label($relation, $reverse = FALSE) {
     return $type->label;
   }
 }
+
+/**
+ * Controller class for relation.
+ *
+ * This extends the DrupalDefaultEntityController class, adding required
+ * special handling for relation revisions, very similar to what's being done
+ * with nodes.
+ */
+class RelationController extends DrupalDefaultEntityController {
+
+  protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
+    // Ensure that uid is taken from the {relation} table
+    $query = parent::buildQuery($ids, $conditions, $revision_id);
+    $fields =& $query->getFields();
+    $fields['uid']['table'] = 'base';
+    $query->addField('revision', 'uid', 'revision_uid');
+    $fields['changed']['table'] = 'base';
+    $query->addField('revision', 'changed', 'changed');
+    return $query;
+  }
+}
index 088b5f0..b09ee74 100644 (file)
@@ -364,4 +364,29 @@ class RelationAPITestCase extends RelationTestCase {
       $this->assertTrue(array_key_exists($rid, $revision), 'Relation revision created.');
     }
   }
+
+  /**
+   * Tests relation revisions.
+   */
+  function testRelationRevision() {
+    $first_user = $this->drupalCreateUser(array('edit relations'));
+    $second_user = $this->drupalCreateUser(array('edit relations'));
+
+    $this->drupalLogin($first_user);
+    $relation = relation_create($this->relation_type_octopus, $this->endpoints_4, $first_user);
+    $rid = relation_save($relation, $first_user);
+    $this->assertEqual($relation->uid, $first_user->uid);
+    $vid = $relation->vid;
+
+    // Relation should still be owned by the first user
+    $this->drupalLogin($second_user);
+    $relation = relation_load($rid);
+    relation_save($relation, $second_user);
+    $this->assertEqual($relation->uid, $first_user->uid);
+
+    // Relation revision authors should not be identical though.
+    $first_revision = relation_load($rid, $vid);
+    $second_revision = relation_load($rid, $relation->vid);
+    $this->assertNotIdentical($first_revision->revision_uid, $second_revision->revision_uid, 'Each revision has a distinct user.');
+  }
 }