move transcript handling to separate class

This commit is contained in:
John Bintz 2009-09-05 16:05:15 -04:00
parent b610a3cae3
commit 712708a996
4 changed files with 210 additions and 468 deletions

View File

@ -0,0 +1,92 @@
<?php
class WDTSTranscriptManager {
var $key = null;
var $post_id = null;
function WDTSTranscriptManager($post_id = null) {
if (is_numeric($post_id)) { $this->post_id = $post_id; }
}
function _get_transcripts_metadata() {
$transcripts = false;
if (!is_null($this->key)) {
$post = get_post($this->post_id);
if (!empty($post)) {
$transcripts = get_post_meta($this->post_id, $this->key, true);
if (!is_array($transcripts)) { $transcripts = array(); }
}
}
return $transcripts;
}
/**
* Save a transcript to a post.
* @param int $post_id The post to attach the transcript to.
* @param string $language The language of the transcript.
* @param string $transcript The transcript content.
* @return bool True if the transcript was saved, false otherwise.
*/
function save_transcript($transcript_info) {
$user = wp_get_current_user();
if (!empty($user)) {
$transcript_info = (array)$transcript_info;
$transcript_info['user_id'] = $user->ID;
if (($transcripts = $this->_get_transcripts_metadata()) !== false) {
$new_transcripts = array();
$was_added = false;
foreach ($transcripts as $transcript) {
if ($transcript['language'] == $transcript_info['language']) {
$was_added = true;
$new_transcripts[] = $transcript_info;
} else {
$new_transcripts[] = $transcript;
}
}
if (!$was_added) { $new_transcripts[] = $transcript_info; }
return update_post_meta($this->post_id, $this->key, $new_transcripts);
}
}
return false;
}
function delete_transcript($language = null) {
if (($transcripts = $this->_get_transcripts_metadata()) !== false) {
$new_transcripts = array();
foreach ($transcripts as $transcript) {
if ($transcript['language'] != $language) { $new_transcripts[] = $transcript; }
}
return update_post_meta($this->post_id, $this->key, $new_transcripts);
}
return false;
}
function get_transcripts() {
return $this->_get_transcripts_metadata();
}
function get_transcripts_for_user($user_id) {
$user_transcripts = array();
if (($transcripts = $this->_get_transcripts_metadata()) !== false) {
foreach ($transcripts as $transcript) {
if ($transcript['user_id'] == $user_id) { $user_transcripts[] = $transcript; }
}
}
return $user_transcripts;
}
function get_languages() {
$languages = array();
if (($transcripts = $this->_get_transcripts_metadata()) !== false) {
foreach ($transcripts as $transcript) {
$languages[$transcript['language']] = true;
}
}
return array_keys($languages);
}
}
?>

View File

@ -6,241 +6,10 @@
* other posts as necessary. * other posts as necessary.
*/ */
class WhatDidTheySay { class WhatDidTheySay {
var $version = "0.1";
/** /**
* Constructor. * Constructor.
*/ */
function WhatDidTheySay() { function WhatDidTheySay() {}
global $wpdb;
$this->table = $wpdb->prefix . "provided_transcripts";
}
/**
* Handle plugin activation.
*/
function install() {
if (get_option('what-did-they-say-version') !== $this->version) {
$sql = "CREATE TABLE %s (
id int NOT NULL AUTO_INCREMENT,
post_id int NOT NULL,
user_id int NOT NULL,
language char(10) NOT NULL,
transcript mediumtext,
UNIQUE KEY id (id)
);";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta(sprintf($sql, $this->table));
update_option('what-did-they-say-version', $this->version);
}
}
/**
* Save a transcript to a post.
* @param int $post_id The post to attach the transcript to.
* @param string $language The language of the transcript.
* @param string $transcript The transcript content.
* @return bool True if the transcript was saved, false otherwise.
*/
function save_transcript($post_id, $language, $transcript) {
if (current_user_can('submit_transcriptions')) {
$post = get_post($post_id);
if (!empty($post)) {
$current_transcripts = get_post_meta($post_id, "provided_transcripts", true);
if (!is_array($current_transcripts)) { $current_transcripts = array(); }
$current_transcripts[$language] = $transcript;
return update_post_meta($post_id, "provided_transcripts", $current_transcripts);
}
return false;
}
}
/**
* Get all transcripts for the indicated post.
* @param int $post_id The post ID to search.
* @return array|false The provided transcripts for the post, or false if no transcripts found.
*/
function get_transcripts($post_id) {
return get_post_meta($post_id, 'provided_transcripts', true);
}
/**
* Get the languages that the approved transcripts for the post are written in.
* @param int $post_id The post ID to check for transcripts.
* @return array|false The languages for the transcripts, or false if none found.
*/
function get_transcript_languages($post_id) {
$current_transcripts = get_post_meta($post_id, "provided_transcripts", true);
if (is_array($current_transcripts)) {
return array_keys($current_transcripts);
}
return false;
}
/**
* Get the queued transcriptions for the provided post.
* @param int $post_id The post to search for transcripts.
* @return array|false The array of transcripts for the post, or false if the post is invalid.
*/
function get_queued_transcriptions_for_post($post_id) {
if (current_user_can('submit_transcriptions')) {
$post = get_post($post_id);
if (!empty($post)) {
$results = get_post_meta($post_id, "queued_transcripts", true);
if (!empty($results)) {
$valid_results = array();
foreach ($results as $result) {
$user = get_userdata($result['user_id']);
if (!empty($user)) {
$valid_results[] = $result;
}
}
return $valid_results;
}
}
}
return false;
}
/**
* Queue a transcription to a post.
* @param int $post_id The post to attach the transcription to.
* @param array $transcript_info The new transcript's info.
*/
function add_queued_transcription_to_post($post_id, $transcript_info) {
if (current_user_can('submit_transcriptions')) {
$post = get_post($post_id);
if (!empty($post)) {
$transcript_info = (array)$transcript_info;
if (!empty($transcript_info)) {
$ok = true;
foreach (array('language', 'transcript') as $field) {
if (empty($transcript_info[$field])) { $ok = false; break; }
}
if ($ok) {
extract($transcript_info);
$user = wp_get_current_user();
if (!empty($user)) {
$current_transcriptions = get_post_meta($post_id, 'queued_transcripts', true);
$transcript_info['user_id'] = $user->ID;
$current_transcriptions[] = $transcript_info;
update_post_meta($post_id, 'queued_transcripts', $current_transcriptions);
return true;
}
}
}
}
}
return false;
}
/**
* Update a queued transcript.
* @param array $update_info The info on the transcript being updated.
* @return boolean True if the transcript was updated.
*/
function update_queued_transcription($update_info) {
global $wpdb;
if (current_user_can('submit_transcriptions')) {
$query = $wpdb->prepare("SELECT * FROM " . $this->table . " WHERE id = %d", $update_info['id']);
$result = $wpdb->get_results($query);
if (is_array($result)) {
if (count($result) == 1) {
$result = $result[0];
foreach (array('language', 'transcript') as $field) {
$result->{$field} = $update_info[$field];
}
$query = $wpdb->prepare(
"UPDATE " . $this->table . " SET language = %s, transcript = %s WHERE id = %d",
$result->language, $result->transcript, $result->id
);
$wpdb->query($query);
return true;
}
}
}
return false;
}
/**
* Delete a queued transcript.
* @param int $transcription_id The transcription to delete.
* @return boolean True if the transcript was deleted.
*/
function delete_queued_transcription($transcription_id) {
global $wpdb;
if (current_user_can('submit_transcriptions')) {
$query = $wpdb->prepare("DELETE FROM " . $this->table . " WHERE id = %d", $transcription_id);
return $wpdb->query($query);
}
return false;
}
/**
* Add a queued transcription to its associated post.
* @param int $transcription_id The transcription ID to approve.
*/
function add_transcription_to_post($transcription_id) {
global $wpdb;
if (current_user_can('approve_transcriptions')) {
$query = $wpdb->prepare("SELECT * from " . $this->table . " WHERE id = %d", $transcription_id);
$result = $wpdb->get_results($query);
if (is_array($result)) {
if (count($result) == 1) {
$result = (object)$result[0];
$post = get_post($result->post_id);
if (!empty($post)) {
$this->save_transcript($result->post_id, $result->language, $result->transcript);
$this->delete_queued_transcription($transcription_id);
}
}
}
}
}
/**
* Get all the queued transcriptions for a particular user and post.
* @param int $user_id The user ID to search for.
* @param int $post_id The post ID to search for.
* @return array|false The queued transcriptions for this user, or false if they don't have permissions to see queued transcriptions.
*/
function get_queued_transcriptions_for_user_and_post($user_id, $post_id) {
global $wpdb;
if (current_user_can('submit_transcriptions')) {
$query = $wpdb->prepare("SELECT * FROM " . $this->table . " WHERE user_id = %d AND post_id = %d", $user_id, $post_id);
return $wpdb->get_results($query);
}
return false;
}
/**
* Delete a transcript for a particular language from a post.
* @param int $post_id The post to search.
* @param string $language The language code to search for.
* @return boolean True if the transcript was deleted.
*/
function delete_transcript($post_id, $language) {
if (current_user_can('approve_transcriptions')) {
$post = get_post($post_id);
if (!empty($post)) {
$current_transcripts = get_post_meta($post_id, "provided_transcripts", true);
unset($current_transcripts[$language]);
update_post_meta($post_id, "provided_transcripts", $current_transcripts);
return true;
}
}
return false;
}
/** /**
* Get the default transcript language for this blog. * Get the default transcript language for this blog.

117
test/WDTSTranscriptTest.php Normal file
View File

@ -0,0 +1,117 @@
<?php
require_once('PHPUnit/Framework.php');
require_once(dirname(__FILE__) . '/../../mockpress/mockpress.php');
require_once(dirname(__FILE__) . '/../classes/WDTSTranscript.php');
class WDTSTranscriptTest extends PHPUnit_Framework_TestCase {
function setUp() {
_reset_wp();
wp_insert_user(array('ID' => 1));
wp_set_current_user(1);
wp_insert_post(array('ID' => 1));
$this->w = new WDTSTranscriptManager(1);
$this->w->key = "test";
}
function testSaveTranscript() {
$this->w->save_transcript(array(
'language' => 'en',
'transcript' => 'this is a transcript'
));
$this->assertEquals(
array(
array(
'language' => 'en',
'transcript' => 'this is a transcript',
'user_id' => 1
)
),
get_post_meta(1, $this->w->key, true)
);
$this->w->save_transcript(array(
'language' => 'en',
'transcript' => 'this is another transcript'
));
$this->assertEquals(
array(
array(
'language' => 'en',
'transcript' => 'this is another transcript',
'user_id' => 1
)
),
get_post_meta(1, $this->w->key, true)
);
$this->w->save_transcript(array(
'language' => 'fr',
'transcript' => "il s'agit d'une nouvelle transcription"
));
$this->assertEquals(
array(
array(
'language' => 'en',
'transcript' => 'this is another transcript',
'user_id' => 1
),
array(
'language' => 'fr',
'transcript' => "il s'agit d'une nouvelle transcription",
'user_id' => 1
),
),
get_post_meta(1, $this->w->key, true)
);
}
function testDeleteTranscript() {
update_post_meta(1, $this->w->key, array(
array(
'language' => 'en',
'transcript' => 'this is another transcript',
'user_id' => 1
),
array(
'language' => 'fr',
'transcript' => "il s'agit d'une nouvelle transcription",
'user_id' => 1
),
));
$this->w->delete_transcript('en');
$this->assertEquals(array(
array(
'language' => 'fr',
'transcript' => "il s'agit d'une nouvelle transcription",
'user_id' => 1
),
), get_post_meta(1, $this->w->key, true));
}
function testGetLanguages() {
update_post_meta(1, $this->w->key, array(
array(
'language' => 'en',
'transcript' => 'this is another transcript',
'user_id' => 1
),
array(
'language' => 'fr',
'transcript' => "il s'agit d'une nouvelle transcription",
'user_id' => 1
),
));
$this->assertEquals(array('en', 'fr'), $this->w->get_languages());
}
}
?>

View File

@ -1,236 +0,0 @@
<?php
require_once('PHPUnit/Framework.php');
require_once(dirname(__FILE__) . '/../../mockpress/mockpress.php');
require_once(dirname(__FILE__) . '/../classes/WhatDidTheySay.php');
class WhatDidTheySayTest extends PHPUnit_Framework_TestCase {
function setUp() {
_reset_wp();
_set_user_capabilities('submit_transcriptions', 'approve_transcriptions');
$this->what = new WhatDidTheySay();
}
function testSaveTranscription() {
wp_insert_post(array('ID' => 1));
$this->what->save_transcript(1, "en", "This is a transcript");
$this->assertEquals(array("en" => "This is a transcript"), get_post_meta(1, "provided_transcripts", true));
$this->what->save_transcript(1, "en", "this is a new transcript");
$this->assertEquals(array("en" => "this is a new transcript"), get_post_meta(1, "provided_transcripts", true));
$this->what->save_transcript(1, "fr", "il s'agit d'une nouvelle transcription");
$this->assertEquals(array("en" => "this is a new transcript", "fr" => "il s'agit d'une nouvelle transcription"), get_post_meta(1, "provided_transcripts", true));
}
function testGetListOfLanguagesForPost() {
update_post_meta(1, "provided_transcripts", array('en' => 'this is a new transcript', 'fr' => "il s'agit d'une nouvelle transcription"));
$this->assertEquals(array('en', 'fr'), $this->what->get_transcript_languages(1));
$this->assertEquals(false, $this->what->get_transcript_languages(2));
}
function testGetQueuedTranscriptionsForPost() {
wp_insert_user(array('ID' => 1, 'first_name' => 'Test', 'last_name' => 'User'));
wp_insert_post(array('ID' => 1));
update_post_meta(1, "queued_transcripts", array(
array('user_id' => 1, 'language' => 'en', 'transcript' => 'This is a transcript')
));
$this->assertEquals(
array(
array(
'user_id' => 1,
'language' => 'en',
'transcript' => 'This is a transcript'
)
),
$this->what->get_queued_transcriptions_for_post(1)
);
$this->assertFalse($what->get_queued_transcriptions_for_post(2));
}
function providerTestAddQueuedTranscriptionToPost() {
return array(
array(
array(1, 1, "en", "This is a transcript"), true
),
array(
array(2, 1, "en", "This is a transcript"), false
),
array(
array(1, 2, "en", "This is a transcript"), false
),
array(
array(1, 1, "", "This is a transcript"), false
),
array(
array(1, 1, "en", ""), false
),
);
}
/**
* @dataProvider providerTestAddQueuedTranscriptionToPost
*/
function testAddQueuedTranscriptionToPost($query_settings, $expected_result) {
wp_insert_user(array('ID' => 1, 'first_name' => 'Test', 'last_name' => 'User'));
wp_insert_post(array('ID' => 1));
wp_set_current_user(1);
$what = $this->getMock('WhatDidTheySay', array('is_user_allowed_to_update'));
$this->assertEquals($expected_result, $what->add_queued_transcription_to_post(
1,
array(
'language' => 'en',
'transcript' => "This is a transcript"
)
));
if ($expected_result) {
$this->assertEquals(array(
array('user_id' => 1, 'language' => 'en', 'transcript' => 'This is a transcript')
), get_post_meta(1, "queued_transcripts", true));
$what->add_queued_transcription_to_post(
1, array(
'language' => 'fr',
'transcript' => "il s'agit d'une transcription"
)
);
$this->assertEquals(array(
array('user_id' => 1, 'language' => 'en', 'transcript' => 'This is a transcript'),
array('user_id' => 1, 'language' => 'fr', 'transcript' => "il s'agit d'une transcription")
), get_post_meta(1, "queued_transcripts", true));
}
}
function providerTestUpdateQueuedTranscription() {
return array(
array(
array(), array("language" => "en", "transcript" => "This")
),
array(
array(
(object)array('ID' => 1)
), array("language" => "en", "transcript" => "This")
),
array(
array(
(object)array('ID' => 1)
), array("language" => "en", "transcript" => "This", 'id' => 1)
),
);
}
/**
* @dataProvider providerTestUpdateQueuedTranscription
*/
function testUpdateQueuedTranscription($valid_transcripts, $update_info) {
global $wpdb;
$what = $this->getMock('WhatDidTheySay', array('is_user_allowed_to_update'));
$wpdb = $this->getMock('wpdb', array('prepare', 'get_results', 'query'));
$wpdb->expects($this->once())
->method('get_results')
->will($this->returnValue($valid_transcripts));
$in_array = false;
foreach ($valid_transcripts as $transcript) {
if ($transcript->id == $update_info['id']) { $in_array = true; break; }
}
if ($in_array) {
$wpdb->expects($this->once())
->method('query');
}
wp_insert_post(array('ID' => 1));
$what->update_queued_transcription($update_info);
}
function providerTestDeleteQueuedTranscription() {
return array(
array(array(), 1, false),
array(array(2), 1, false),
array(array(1), 1, true)
);
}
/**
* @dataProvider providerTestDeleteQueuedTranscription
*/
function testDeleteQueuedTranscription($valid_transcripts, $transcript_id_to_delete, $expected_result) {
global $wpdb;
$what = $this->getMock('WhatDidTheySay', array('is_user_allowed_to_update'));
$wpdb = $this->getMock('wpdb', array('prepare', 'get_var', 'query'));
if (in_array($transcript_id_to_delete, $valid_transcripts)) {
$wpdb->expects($this->once())
->method('query');
}
$what->delete_queued_transcription($transcript_id_to_delete);
}
function providerTestAddTranscriptionToPost() {
return array(
array(null, false),
array((object)array('id' => 1, 'post_id' => 2), false),
array((object)array('id' => 1, 'post_id' => 1, 'language' => 'en', 'transcript' => 'This is a transcript'), true)
);
}
/**
* @dataProvider providerTestAddTranscriptionToPost
*/
function testAddTranscriptionToPost($get_results_return, $expects_delete) {
global $wpdb;
$what = $this->getMock('WhatDidTheySay', array('is_user_allowed_to_update', 'save_transcript'));
wp_insert_post((object)array('ID' => 1));
$wpdb = $this->getMock('wpdb', array('get_results', 'prepare', 'query'));
$wpdb->expects($this->once())
->method('get_results')
->will($this->returnValue(array($get_results_return)));
if ($expects_delete) {
$wpdb->expects($this->at(2))
->method('prepare')
->with(new PHPUnit_Framework_Constraint_PCREMatch('#DELETE FROM .* WHERE id = .*#'));
$what->expects($this->once())
->method('save_transcript');
}
$what->add_transcription_to_post(1);
}
function testDeleteTranscript() {
$what = $this->getMock('WhatDidTheySay', array('is_user_allowed_to_update'));
wp_insert_post((object)array('ID' => 1));
update_post_meta(1, "provided_transcripts", array("en" => "This is a transcript"));
$what->delete_transcript(1, "en");
$this->assertEquals(array(), get_post_meta(1, "provided_transcripts", true));
}
}
?>