Heine

  • home
  • drupal
  • drupal core commits
  • about
Home › Drupal Core Commits

Commit 232808 by dries

- Patch #474072 by jrchamp, Berdir: use taxonomy API functions in blog API.

--- modules/blogapi/blogapi.module      2009/06/30 11:32:08     1.156
+++ modules/blogapi/blogapi.module      2009/07/02 20:23:28     1.157
@@ -582,12 +582,10 @@
     $found_terms = array();
     if (!empty($node->taxonomy)) {
       $term_list = array_unique($node->taxonomy);
-      $params = $term_list;
-      $params[] = $node->type;
-      $result = db_query(db_rewrite_sql("SELECT t.tid, t.vid FROM {taxonomy_term_data} t INNER JOIN {taxonomy_vocabulary_node_type} n ON t.vid = n.vid WHERE t.tid IN (" . db_placeholders($term_list) . ") AND n.type = '%s'", 't', 'tid'), $params);
+      $terms = taxonomy_term_load_multiple($term_list, array('type' => $node->type));
       $found_terms = array();
       $found_count = 0;
-      while ($term = db_fetch_object($result)) {
+      foreach ($terms as $term) {
         $found_terms[$term->vid][$term->tid] = $term->tid;
         $found_count++;
       }
@@ -597,9 +595,9 @@
       }
     }
     // Look up all the vocabularies for this node type.
-    $result2 = db_query(db_rewrite_sql("SELECT v.vid, v.name, v.required, v.multiple FROM {taxonomy_vocabulary} v INNER JOIN {taxonomy_vocabulary_node_type} n ON v.vid = n.vid WHERE n.type = '%s'", 'v', 'vid'), $node->type);
+    $vocabularies = taxonomy_vocabulary_load_multiple(array(), array('type' => $node->type));
     // Check each vocabulary associated with this node type.
-    while ($vocabulary = db_fetch_object($result2)) {
+    foreach ($vocabularies as $vocabulary) {
       // Required vocabularies must have at least one term.
       if ($vocabulary->required && empty($found_terms[$vocabulary->vid])) {
         return blogapi_error(t('A category from the @vocabulary_name vocabulary is required.', array('@vocabulary_name' => $vocabulary->name)));

--- modules/blogapi/blogapi.test        2009/06/30 11:32:08     1.13
+++ modules/blogapi/blogapi.test        2009/07/02 20:23:28     1.14
@@ -22,15 +22,14 @@
    */
   function testBlogAPI() {
     global $base_url;
+    // Create user.
+    $web_user = $this->drupalCreateUser(array('create blog content', 'delete own blog content', 'edit own blog content', 'administer content with blog api'));
     // Create admin user and taxonomy for later use.
     $admin_user = $this->drupalCreateUser(array('administer taxonomy'));
     $this->drupalLogin($admin_user);
     $vid = $this->addVocabulary('simpletest_vocab');
-    $term = $this->addTerm($vid, 'simpletest_term1');
-    $this->drupalLogout();
-
-    // Create user.
-    $web_user = $this->drupalCreateUser(array('create blog content', 'delete own blog content', 'edit own blog content', 'administer content with blog api'));
+    $term_1 = $this->addTerm($vid, 'simpletest_term1');
+    $term_2 = $this->addTerm($vid, 'simpletest_term2');
 
     // Init common variables.
     $local = url($base_url . '/xmlrpc.php', array('external' => TRUE));
@@ -60,8 +59,9 @@
     if ($result !== FALSE && array_key_exists('title', $result[0])) {
       $this->assertEqual($content, $result[0]['title'], t('Post found.'));
     }
-    else
-      $this->assertTrue(false, 'Post found.');
+    else {
+      $this->fail(t('Post found.'));
+    }
 
     // Edit post.
     $content_new = $this->randomName(10);
@@ -85,7 +85,7 @@
     $this->assertEqual($this->drupalGetContent(), $file_contents, t('Uploaded contents verified.'));
 
     // Set post categories.
-    $categories = array(array('categoryId' => $term));
+    $categories = array(array('categoryId' => $term_1));
     $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, $categories);
     $this->assertTrue($result, t('Post categories set.'));
 
@@ -93,10 +93,40 @@
     $result = xmlrpc($local, 'mt.getPostCategories', $nid, $web_user->name, $web_user->pass_raw);
     $this->assertTrue($result, t('Category list successfully retrieved.'));
 
-    if ($result !== FALSE && array_key_exists('categoryId', $result[0])) {
-      $this->assertEqual($term, $result[0]['categoryId'], t('Category list verified.'));
+    if ($result !== FALSE && isset($result[0]['categoryId'])) {
+      $this->assertEqual($term_1, $result[0]['categoryId'], t('Category list verified.'));
     }
 
+    // Test validation of category assignment.
+    // Set post categories.
+    $categories[] = array('categoryId' => $term_2);
+    $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, $categories);
+    $this->assertFalse($result, t('Post categories fail validation (attempt to post two when one is allowed).'));
+
+    // Change to required.
+    $this->updateVocabulary($vid, 'simpletest_vocab1', FALSE, TRUE);
+    $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, array());
+    $this->assertFalse($result, t("Post categories fail validation (none posted when it's required)."));
+
+    // Change to allowing multiple, not required.
+    $this->updateVocabulary($vid, 'simpletest_vocab1', TRUE, FALSE);
+    $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, $categories);
+    $this->assertTrue($result, t('Post categories pass validation (multiple allowed).'));
+    $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, array());
+    $this->assertTrue($result, t('Post categories pass validation (multiple allowed, none posted).'));
+
+    // Change to multiple, but required.
+    $this->updateVocabulary($vid, 'simpletest_vocab1', TRUE, TRUE);
+    $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, $categories);
+    $this->assertTrue($result, t('Post categories pass validation (multiple allowed).'));
+    $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, array());
+    $this->assertFalse($result, t("Post categories fail validation (none posted when it's required)."));
+
+    // Try to add a non-existent term.
+    $categories[] = array('categoryId' => $term_2 + 1);
+    $result = xmlrpc($local, 'mt.setPostCategories', $nid, $web_user->name, $web_user->pass_raw, $categories);
+    $this->assertFalse($result, t('Post categories fail validation (unknown term).'));
+
     // Delete post.
     $result = xmlrpc($local, 'blogger.deletePost', $appid, $nid, $web_user->name, $web_user->pass_raw, TRUE);
     $this->assertTrue($result, t('Post successfully deleted.'));
@@ -123,6 +153,22 @@
 
     return $vocabulary->vid;
   }
+  /**
+   * Update a taxonomy vocabulary.
+   *
+   * @param  $vocab
+   *   Vocabulary name.
+   * @return integer
+   *   The vocab ID.
+   */
+  function updateVocabulary($vid, $vocab, $multiple = FALSE, $required = FALSE) {
+    $vocabulary = taxonomy_vocabulary_load($vid);
+    $vocabulary->name = $vocab;
+    $vocabulary->nodes = array('blog' => 'blog');
+    $vocabulary->multiple = $multiple;
+    $vocabulary->required = $required;
+    taxonomy_vocabulary_save($vocabulary);
+  }
 
   /**
    * Add a taxonomy term to vocabulary.

--- modules/taxonomy/taxonomy.module    2009/07/02 04:27:23     1.482
+++ modules/taxonomy/taxonomy.module    2009/07/02 20:23:28     1.483
@@ -1251,10 +1251,11 @@
     $query
       ->fields('v')
       ->orderBy('v.weight')
-      ->orderBy('v.name');
+      ->orderBy('v.name')
+      ->addTag('vocabulary_access');
 
     if (!empty($type)) {
-      $query->leftJoin('taxonomy_vocabulary_node_type', 'n', 'v.vid = n.vid AND n.type  = :type', array(':type' => $type));
+      $query->join('taxonomy_vocabulary_node_type', 'n', 'v.vid = n.vid AND n.type = :type', array(':type' => $type));
     }
     else {
       $query->leftJoin('taxonomy_vocabulary_node_type', 'n', 'v.vid = n.vid');
@@ -1358,6 +1359,13 @@
 function taxonomy_term_load_multiple($tids = array(), $conditions = array()) {
   $term_cache = &drupal_static(__FUNCTION__, array());
 
+  // Node type associations are not stored in the taxonomy_term_data table, so
+  // remove this from conditions into it's own variable.
+  if (isset($conditions['type'])) {
+    $type = $conditions['type'];
+    unset($conditions['type']);
+  }
+
   $terms = array();
 
   // Create a new variable which is either a prepared version of the $tids
@@ -1402,14 +1410,20 @@
     $query = db_select('taxonomy_term_data', 't');
     $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid');
     $taxonomy_term_data = drupal_schema_fields_sql('taxonomy_term_data');
-    $query->fields('t', $taxonomy_term_data);
     $query->addField('v', 'machine_name', 'vocabulary_machine_name');
+    $query
+      ->fields('t', $taxonomy_term_data)
+      ->addTag('term_access');
 
     // If the $tids array is populated, add those to the query.
     if ($tids) {
       $query->condition('t.tid', $tids, 'IN');
     }
 
+    if (!empty($type)) {
+      $query->join('taxonomy_vocabulary_node_type', 'n', 't.vid = n.vid AND n.type = :type', array(':type' => $type));
+    }
+
     // If the conditions array is populated, add those to the query.
     if ($conditions) {
       // When name is passed as a condition use LIKE.

No votes yet
  • Drupal Core
  • Download patch

Recent posts

  • The Joomlafication of the Dutch-speaking community
  • Upgraded from 6.14 to 6.15, but Drupal still thinks it's 6.14?
  • Google Friendconnect Drupal module not recommended (yet)
  • The OpenID 2.0 Compliance Crusade - Part I
  • Using <embed> for XSS
more

Security reviews

  • Afraid custom code makes your site vulnerable?
  • You don't really trust that module you just downloaded from Drupal.org?

Sleep better after a security review.

Tags

Captcha CSRF DOH! Drupal embed Input Format modx OpenID Performance Planet Drupal Security Varnish
more tags
  • home
  • drupal
  • drupal core commits
  • about

Copyright © 2010 by Heine Deelstra. All rights reserved.