WORK IN PROGRESS: Starting infrastructure to initiate Yammer import from web UI and process it in the background queues. Totally not complete yet.
This commit is contained in:
		| @@ -22,9 +22,7 @@ | |||||||
|  * @maintainer Brion Vibber <brion@status.net> |  * @maintainer Brion Vibber <brion@status.net> | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } | if (!defined('STATUSNET')) { exit(1); } | ||||||
|  |  | ||||||
| set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/'); |  | ||||||
|  |  | ||||||
| class YammerImportPlugin extends Plugin | class YammerImportPlugin extends Plugin | ||||||
| { | { | ||||||
| @@ -36,8 +34,8 @@ class YammerImportPlugin extends Plugin | |||||||
|      */ |      */ | ||||||
|     function onRouterInitialized($m) |     function onRouterInitialized($m) | ||||||
|     { |     { | ||||||
|         $m->connect('admin/import/yammer', |         $m->connect('admin/yammer', | ||||||
|                     array('action' => 'importyammer')); |                     array('action' => 'yammeradminpanel')); | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -53,6 +51,56 @@ class YammerImportPlugin extends Plugin | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Set up all our tables... | ||||||
|  |      */ | ||||||
|  |     function onCheckSchema() | ||||||
|  |     { | ||||||
|  |         $schema = Schema::get(); | ||||||
|  |  | ||||||
|  |         $tables = array('Yammer_state', | ||||||
|  |                         'Yammer_user', | ||||||
|  |                         'Yammer_group', | ||||||
|  |                         'Yammer_notice', | ||||||
|  |                         'Yammer_notice_stub'); | ||||||
|  |         foreach ($tables as $table) { | ||||||
|  |             $schema->ensureTable($table, $table::schemaDef()); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * If the plugin's installed, this should be accessible to admins. | ||||||
|  |      */ | ||||||
|  |     function onAdminPanelCheck($name, &$isOK) | ||||||
|  |     { | ||||||
|  |         if ($name == 'yammer') { | ||||||
|  |             $isOK = true; | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Add the Yammer admin panel to the list... | ||||||
|  |      */ | ||||||
|  |     function onEndAdminPanelNav($nav) | ||||||
|  |     { | ||||||
|  |         if (AdminPanelAction::canAdmin('yammer')) { | ||||||
|  |             $action_name = $nav->action->trimmed('action'); | ||||||
|  |  | ||||||
|  |             $nav->out->menuItem(common_local_url('yammeradminpanel'), | ||||||
|  |                                 _m('Yammer'), | ||||||
|  |                                 _m('Yammer import'), | ||||||
|  |                                 $action_name == 'yammeradminpanel', | ||||||
|  |                                 'nav_yammer_admin_panel'); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Automatically load the actions and libraries used by the plugin |      * Automatically load the actions and libraries used by the plugin | ||||||
|      * |      * | ||||||
| @@ -70,6 +118,9 @@ class YammerImportPlugin extends Plugin | |||||||
|         case 'yammerimporter': |         case 'yammerimporter': | ||||||
|             require_once "$base/lib/$lower.php"; |             require_once "$base/lib/$lower.php"; | ||||||
|             return false; |             return false; | ||||||
|  |         case 'yammeradminpanelaction': | ||||||
|  |             require_once "$base/actions/yammeradminpanel.php"; | ||||||
|  |             return false; | ||||||
|         default: |         default: | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
|   | |||||||
							
								
								
									
										153
									
								
								plugins/YammerImport/actions/yammeradminpanel.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								plugins/YammerImport/actions/yammeradminpanel.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,153 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * StatusNet, the distributed open-source microblogging tool | ||||||
|  |  * | ||||||
|  |  * Yammer import administration panel | ||||||
|  |  * | ||||||
|  |  * PHP version 5 | ||||||
|  |  * | ||||||
|  |  * LICENCE: This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Affero General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU Affero General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Affero General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  * | ||||||
|  |  * @category  Settings | ||||||
|  |  * @package   StatusNet | ||||||
|  |  * @author    Zach Copley <zach@status.net> | ||||||
|  |  * @copyright 2010 StatusNet, Inc. | ||||||
|  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||||
|  |  * @link      http://status.net/ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | if (!defined('STATUSNET')) { | ||||||
|  |     exit(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class YammeradminpanelAction extends AdminPanelAction | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * Returns the page title | ||||||
|  |      * | ||||||
|  |      * @return string page title | ||||||
|  |      */ | ||||||
|  |     function title() | ||||||
|  |     { | ||||||
|  |         return _m('Yammer Import'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Instructions for using this form. | ||||||
|  |      * | ||||||
|  |      * @return string instructions | ||||||
|  |      */ | ||||||
|  |     function getInstructions() | ||||||
|  |     { | ||||||
|  |         return _m('Yammer import tool'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Show the Yammer admin panel form | ||||||
|  |      * | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     function showForm() | ||||||
|  |     { | ||||||
|  |         $form = new YammerAdminPanelForm($this); | ||||||
|  |         $form->show(); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class YammerAdminPanelForm extends AdminForm | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * ID of the form | ||||||
|  |      * | ||||||
|  |      * @return string ID of the form | ||||||
|  |      */ | ||||||
|  |     function id() | ||||||
|  |     { | ||||||
|  |         return 'yammeradminpanel'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * class of the form | ||||||
|  |      * | ||||||
|  |      * @return string class of the form | ||||||
|  |      */ | ||||||
|  |     function formClass() | ||||||
|  |     { | ||||||
|  |         return 'form_settings'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Action of the form | ||||||
|  |      * | ||||||
|  |      * @return string URL of the action | ||||||
|  |      */ | ||||||
|  |     function action() | ||||||
|  |     { | ||||||
|  |         return common_local_url('yammeradminpanel'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Data elements of the form | ||||||
|  |      * | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     function formData() | ||||||
|  |     { | ||||||
|  |         $this->out->element('p', array(), 'yammer import IN DA HOUSE'); | ||||||
|  |          | ||||||
|  |         /* | ||||||
|  |         Possible states of the yammer import process: | ||||||
|  |         - null (not doing any sort of import) | ||||||
|  |         - requesting-auth | ||||||
|  |         - authenticated | ||||||
|  |         - import-users | ||||||
|  |         - import-groups | ||||||
|  |         - fetch-messages | ||||||
|  |         - import-messages | ||||||
|  |         - done | ||||||
|  |         */ | ||||||
|  |         $yammerState = Yammer_state::staticGet('id', 1); | ||||||
|  |         $state = $yammerState ? $yammerState->state || null; | ||||||
|  |          | ||||||
|  |         switch($state) | ||||||
|  |         { | ||||||
|  |             case null: | ||||||
|  |                 $this->out->element('p', array(), 'Time to start auth:'); | ||||||
|  |                 $this->showAuthForm(); | ||||||
|  |                 break; | ||||||
|  |             case 'requesting-auth': | ||||||
|  |                 $this->out->element('p', array(), 'Need to finish auth!'); | ||||||
|  |                 $this->showAuthForm(); | ||||||
|  |                 break; | ||||||
|  |             case 'import-users': | ||||||
|  |             case 'import-groups': | ||||||
|  |             case 'import-messages': | ||||||
|  |             case 'save-messages': | ||||||
|  |                 $this->showImportState(); | ||||||
|  |                 break; | ||||||
|  |              | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Action elements | ||||||
|  |      * | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     function formActions() | ||||||
|  |     { | ||||||
|  |         // No submit buttons needed at bottom | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								plugins/YammerImport/actions/yammerauth.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								plugins/YammerImport/actions/yammerauth.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  |  | ||||||
|  | function showYammerAuth() | ||||||
|  | { | ||||||
|  |     $token = $yam->requestToken(); | ||||||
|  |     $url = $yam->authorizeUrl($token); | ||||||
|  |  | ||||||
|  |     // We're going to try doing this in an iframe; if that's not happy | ||||||
|  |     // we can redirect but there doesn't seem to be a way to get Yammer's | ||||||
|  |     // oauth to call us back instead of the manual copy. :( | ||||||
|  |  | ||||||
|  |     //common_redirect($url, 303); | ||||||
|  |     $this->element('iframe', array('id' => 'yammer-oauth', | ||||||
|  |                                    'src' => $url)); | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										165
									
								
								plugins/YammerImport/classes/Yammer_common.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								plugins/YammerImport/classes/Yammer_common.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,165 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Data class for remembering Yammer import mappings | ||||||
|  |  * | ||||||
|  |  * PHP version 5 | ||||||
|  |  * | ||||||
|  |  * @category Data | ||||||
|  |  * @package  StatusNet | ||||||
|  |  * @author   Brion Vibber <brion@status.net> | ||||||
|  |  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 | ||||||
|  |  * @link     http://status.net/ | ||||||
|  |  * | ||||||
|  |  * StatusNet - the distributed open-source microblogging tool | ||||||
|  |  * Copyright (C) 2010, StatusNet, Inc. | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Affero General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the | ||||||
|  |  * GNU Affero General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Affero General Public License | ||||||
|  |  * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | if (!defined('STATUSNET')) { | ||||||
|  |     exit(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Common base class for the Yammer import mappings for users, groups, and notices. | ||||||
|  |  * | ||||||
|  |  * Child classes must override these static methods, since we need to run | ||||||
|  |  * on PHP 5.2.x which has no late static binding: | ||||||
|  |  * - staticGet (as our other classes) | ||||||
|  |  * - schemaDef (call self::doSchemaDef) | ||||||
|  |  * - record (call self::doRecord) | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | class Yammer_common extends Memcached_DataObject | ||||||
|  | { | ||||||
|  |     public $__table = 'yammer_XXXX'; // table name | ||||||
|  |     public $__field = 'XXXX_id';     // field name to save into | ||||||
|  |     public $id;                      // int  primary_key not_null | ||||||
|  |     public $user_id;                 // int(4) | ||||||
|  |     public $created;                 // datetime | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @fixme add a 'references' thing for the foreign key when we support that | ||||||
|  |      */ | ||||||
|  |     protected static function doSchemaDef($field) | ||||||
|  |     { | ||||||
|  |         return array(new ColumnDef('id', 'bigint', null, | ||||||
|  |                                    false, 'PRI'), | ||||||
|  |                      new ColumnDef($field, 'integer', null, | ||||||
|  |                                    false, 'UNI'), | ||||||
|  |                      new ColumnDef('created', 'datetime', null, | ||||||
|  |                                    false)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * return table definition for DB_DataObject | ||||||
|  |      * | ||||||
|  |      * DB_DataObject needs to know something about the table to manipulate | ||||||
|  |      * instances. This method provides all the DB_DataObject needs to know. | ||||||
|  |      * | ||||||
|  |      * @return array array of column definitions | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function table() | ||||||
|  |     { | ||||||
|  |         return array('id'           => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, | ||||||
|  |                      $this->__field => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, | ||||||
|  |                      'created'      => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * return key definitions for DB_DataObject | ||||||
|  |      * | ||||||
|  |      * DB_DataObject needs to know about keys that the table has, since it | ||||||
|  |      * won't appear in StatusNet's own keys list. In most cases, this will | ||||||
|  |      * simply reference your keyTypes() function. | ||||||
|  |      * | ||||||
|  |      * @return array list of key field names | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function keys() | ||||||
|  |     { | ||||||
|  |         return array_keys($this->keyTypes()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * return key definitions for Memcached_DataObject | ||||||
|  |      * | ||||||
|  |      * Our caching system uses the same key definitions, but uses a different | ||||||
|  |      * method to get them. This key information is used to store and clear | ||||||
|  |      * cached data, so be sure to list any key that will be used for static | ||||||
|  |      * lookups. | ||||||
|  |      * | ||||||
|  |      * @return array associative array of key definitions, field name to type: | ||||||
|  |      *         'K' for primary key: for compound keys, add an entry for each component; | ||||||
|  |      *         'U' for unique keys: compound keys are not well supported here. | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function keyTypes() | ||||||
|  |     { | ||||||
|  |         return array('id' => 'K', $this->__field => 'U'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Magic formula for non-autoincrementing integer primary keys | ||||||
|  |      * | ||||||
|  |      * If a table has a single integer column as its primary key, DB_DataObject | ||||||
|  |      * assumes that the column is auto-incrementing and makes a sequence table | ||||||
|  |      * to do this incrementation. Since we don't need this for our class, we | ||||||
|  |      * overload this method and return the magic formula that DB_DataObject needs. | ||||||
|  |      * | ||||||
|  |      * @return array magic three-false array that stops auto-incrementing. | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function sequenceKey() | ||||||
|  |     { | ||||||
|  |         return array(false, false, false); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Save a mapping between a remote Yammer and local imported user. | ||||||
|  |      * | ||||||
|  |      * @param integer $user_id ID of the status in StatusNet | ||||||
|  |      * @param integer $orig_id ID of the notice in Yammer | ||||||
|  |      * | ||||||
|  |      * @return Yammer_common new object for this value | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     protected static function doRecord($class, $field, $orig_id, $local_id) | ||||||
|  |     { | ||||||
|  |         $map = self::staticGet('id', $orig_id); | ||||||
|  |  | ||||||
|  |         if (!empty($map)) { | ||||||
|  |             return $map; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         $map = self::staticGet($field, $local_id); | ||||||
|  |  | ||||||
|  |         if (!empty($map)) { | ||||||
|  |             return $map; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         common_debug("Mapping Yammer $field {$orig_id} to local $field {$local_id}"); | ||||||
|  |  | ||||||
|  |         $map = new $class(); | ||||||
|  |  | ||||||
|  |         $map->id = $orig_id; | ||||||
|  |         $map->$field = $local_id; | ||||||
|  |         $map->created = common_sql_now(); | ||||||
|  |  | ||||||
|  |         $map->insert(); | ||||||
|  |  | ||||||
|  |         return $map; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										79
									
								
								plugins/YammerImport/classes/Yammer_group.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								plugins/YammerImport/classes/Yammer_group.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Data class for remembering Yammer import mappings | ||||||
|  |  * | ||||||
|  |  * PHP version 5 | ||||||
|  |  * | ||||||
|  |  * @category Data | ||||||
|  |  * @package  StatusNet | ||||||
|  |  * @author   Brion Vibber <brion@status.net> | ||||||
|  |  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 | ||||||
|  |  * @link     http://status.net/ | ||||||
|  |  * | ||||||
|  |  * StatusNet - the distributed open-source microblogging tool | ||||||
|  |  * Copyright (C) 2010, StatusNet, Inc. | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Affero General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the | ||||||
|  |  * GNU Affero General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Affero General Public License | ||||||
|  |  * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | if (!defined('STATUSNET')) { | ||||||
|  |     exit(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class Yammer_group extends Yammer_common | ||||||
|  | { | ||||||
|  |     public $__table = 'yammer_group'; // table name | ||||||
|  |     public $__field = 'group_id';     // field to map to | ||||||
|  |     public $group_id;                 // int | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get an instance by key | ||||||
|  |      * | ||||||
|  |      * This is a utility method to get a single instance with a given key value. | ||||||
|  |      * | ||||||
|  |      * @param string $k Key to use to lookup | ||||||
|  |      * @param mixed  $v Value to lookup | ||||||
|  |      * | ||||||
|  |      * @return Yammer_group object found, or null for no hits | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function staticGet($k, $v=null) | ||||||
|  |     { | ||||||
|  |         return Memcached_DataObject::staticGet('Yammer_group', $k, $v); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Return schema definition to set this table up in onCheckSchema | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     static function schemaDef() | ||||||
|  |     { | ||||||
|  |         return self::doSchemaDef('group_id'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Save a mapping between a remote Yammer and local imported group. | ||||||
|  |      * | ||||||
|  |      * @param integer $orig_id ID of the notice in Yammer | ||||||
|  |      * @param integer $group_id ID of the status in StatusNet | ||||||
|  |      * | ||||||
|  |      * @return Yammer_group new object for this value | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     static function record($orig_id, $group_id) | ||||||
|  |     { | ||||||
|  |         return self::doRecord('Yammer_group', 'group_id', $orig_id, $group_id); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										79
									
								
								plugins/YammerImport/classes/Yammer_notice.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								plugins/YammerImport/classes/Yammer_notice.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Data class for remembering Yammer import mappings | ||||||
|  |  * | ||||||
|  |  * PHP version 5 | ||||||
|  |  * | ||||||
|  |  * @category Data | ||||||
|  |  * @package  StatusNet | ||||||
|  |  * @author   Brion Vibber <brion@status.net> | ||||||
|  |  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 | ||||||
|  |  * @link     http://status.net/ | ||||||
|  |  * | ||||||
|  |  * StatusNet - the distributed open-source microblogging tool | ||||||
|  |  * Copyright (C) 2010, StatusNet, Inc. | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Affero General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the | ||||||
|  |  * GNU Affero General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Affero General Public License | ||||||
|  |  * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | if (!defined('STATUSNET')) { | ||||||
|  |     exit(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class Yammer_notice extends Yammer_common | ||||||
|  | { | ||||||
|  |     public $__table = 'yammer_notice'; // table name | ||||||
|  |     public $__field = 'notice_id';     // field to map to | ||||||
|  |     public $notice_id;                 // int | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get an instance by key | ||||||
|  |      * | ||||||
|  |      * This is a utility method to get a single instance with a given key value. | ||||||
|  |      * | ||||||
|  |      * @param string $k Key to use to lookup | ||||||
|  |      * @param mixed  $v Value to lookup | ||||||
|  |      * | ||||||
|  |      * @return Yammer_notice object found, or null for no hits | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function staticGet($k, $v=null) | ||||||
|  |     { | ||||||
|  |         return Memcached_DataObject::staticGet('Yammer_notice', $k, $v); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Return schema definition to set this table up in onCheckSchema | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     static function schemaDef() | ||||||
|  |     { | ||||||
|  |         return self::doSchemaDef('notice_id'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Save a mapping between a remote Yammer and local imported notice. | ||||||
|  |      * | ||||||
|  |      * @param integer $orig_id ID of the notice in Yammer | ||||||
|  |      * @param integer $notice_id ID of the status in StatusNet | ||||||
|  |      * | ||||||
|  |      * @return Yammer_notice new object for this value | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     static function record($orig_id, $notice_id) | ||||||
|  |     { | ||||||
|  |         return self::doRecord('Yammer_notice', 'notice_id', $orig_id, $notice_id); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										174
									
								
								plugins/YammerImport/classes/Yammer_notice_stub.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								plugins/YammerImport/classes/Yammer_notice_stub.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,174 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Data class for remembering Yammer import mappings | ||||||
|  |  * | ||||||
|  |  * PHP version 5 | ||||||
|  |  * | ||||||
|  |  * @category Data | ||||||
|  |  * @package  StatusNet | ||||||
|  |  * @author   Brion Vibber <brion@status.net> | ||||||
|  |  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 | ||||||
|  |  * @link     http://status.net/ | ||||||
|  |  * | ||||||
|  |  * StatusNet - the distributed open-source microblogging tool | ||||||
|  |  * Copyright (C) 2010, StatusNet, Inc. | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Affero General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the | ||||||
|  |  * GNU Affero General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Affero General Public License | ||||||
|  |  * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | if (!defined('STATUSNET')) { | ||||||
|  |     exit(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Temporary storage for imported Yammer messages between fetching and saving | ||||||
|  |  * as local notices. | ||||||
|  |  * | ||||||
|  |  * The Yammer API only allows us to page down from the most recent items; in | ||||||
|  |  * order to start saving the oldest notices first, we have to pull them all | ||||||
|  |  * down in reverse chronological order, then go back over them from oldest to | ||||||
|  |  * newest and actually save them into our notice table. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | class Yammer_notice_stub extends Memcached_DataObject | ||||||
|  | { | ||||||
|  |     public $__table = 'yammer_notice_stub'; // table name | ||||||
|  |     public $id;                             // int  primary_key not_null | ||||||
|  |     public $json_data;                      // text | ||||||
|  |     public $created;                        // datetime | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Return schema definition to set this table up in onCheckSchema | ||||||
|  |      */ | ||||||
|  |     static function schemaDef($field) | ||||||
|  |     { | ||||||
|  |         return array(new ColumnDef('id', 'bigint', null, | ||||||
|  |                                    false, 'PRI'), | ||||||
|  |                      new ColumnDef('json_data', 'text', null, | ||||||
|  |                                    false), | ||||||
|  |                      new ColumnDef('created', 'datetime', null, | ||||||
|  |                                    false)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * return table definition for DB_DataObject | ||||||
|  |      * | ||||||
|  |      * DB_DataObject needs to know something about the table to manipulate | ||||||
|  |      * instances. This method provides all the DB_DataObject needs to know. | ||||||
|  |      * | ||||||
|  |      * @return array array of column definitions | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function table() | ||||||
|  |     { | ||||||
|  |         return array('id'           => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, | ||||||
|  |                      'json_data'    => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, | ||||||
|  |                      'created'      => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * return key definitions for DB_DataObject | ||||||
|  |      * | ||||||
|  |      * DB_DataObject needs to know about keys that the table has, since it | ||||||
|  |      * won't appear in StatusNet's own keys list. In most cases, this will | ||||||
|  |      * simply reference your keyTypes() function. | ||||||
|  |      * | ||||||
|  |      * @return array list of key field names | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function keys() | ||||||
|  |     { | ||||||
|  |         return array_keys($this->keyTypes()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * return key definitions for Memcached_DataObject | ||||||
|  |      * | ||||||
|  |      * Our caching system uses the same key definitions, but uses a different | ||||||
|  |      * method to get them. This key information is used to store and clear | ||||||
|  |      * cached data, so be sure to list any key that will be used for static | ||||||
|  |      * lookups. | ||||||
|  |      * | ||||||
|  |      * @return array associative array of key definitions, field name to type: | ||||||
|  |      *         'K' for primary key: for compound keys, add an entry for each component; | ||||||
|  |      *         'U' for unique keys: compound keys are not well supported here. | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function keyTypes() | ||||||
|  |     { | ||||||
|  |         return array('id' => 'K'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Magic formula for non-autoincrementing integer primary keys | ||||||
|  |      * | ||||||
|  |      * If a table has a single integer column as its primary key, DB_DataObject | ||||||
|  |      * assumes that the column is auto-incrementing and makes a sequence table | ||||||
|  |      * to do this incrementation. Since we don't need this for our class, we | ||||||
|  |      * overload this method and return the magic formula that DB_DataObject needs. | ||||||
|  |      * | ||||||
|  |      * @return array magic three-false array that stops auto-incrementing. | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function sequenceKey() | ||||||
|  |     { | ||||||
|  |         return array(false, false, false); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Save the native Yammer API representation of a message for the pending | ||||||
|  |      * import. Since they come in in reverse chronological order, we need to | ||||||
|  |      * record them all as stubs and then go through from the beginning and | ||||||
|  |      * save them as native notices, or we'll lose ordering and threading | ||||||
|  |      * data. | ||||||
|  |      * | ||||||
|  |      * @param integer $orig_id ID of the notice on Yammer | ||||||
|  |      * @param array $data the message record fetched out of Yammer API returnd data | ||||||
|  |      * | ||||||
|  |      * @return Yammer_notice_stub new object for this value | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     static function record($orig_id, $data) | ||||||
|  |     { | ||||||
|  |         common_debug("Recording Yammer message stub {$orig_id} for pending import..."); | ||||||
|  |  | ||||||
|  |         $stub = new Yammer_notice_stub(); | ||||||
|  |  | ||||||
|  |         $stub->id = $orig_id; | ||||||
|  |         $stub->json_data = json_encode($data); | ||||||
|  |         $stub->created = common_sql_now(); | ||||||
|  |  | ||||||
|  |         $stub->insert(); | ||||||
|  |  | ||||||
|  |         return $stub; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Save a mapping between a remote Yammer and local imported user. | ||||||
|  |      * | ||||||
|  |      * @param integer $user_id ID of the status in StatusNet | ||||||
|  |      * | ||||||
|  |      * @return Yammer_notice_stub new object for this value | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     static function retrieve($orig_id) | ||||||
|  |     { | ||||||
|  |         $stub = self::staticGet('id', $orig_id); | ||||||
|  |         if ($stub) { | ||||||
|  |             return json_decode($stub->json_data, true); | ||||||
|  |         } else { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								plugins/YammerImport/classes/Yammer_state.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								plugins/YammerImport/classes/Yammer_state.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  | ||||||
|  | yammer_state | ||||||
|  |     id | ||||||
|  |     state | ||||||
|  |     request_token | ||||||
|  |     oauth_token | ||||||
|  |     users_page | ||||||
|  |     groups_page | ||||||
|  |     messages_oldest | ||||||
|  |     created | ||||||
|  |     modified | ||||||
|  |  | ||||||
|  | yammer_user | ||||||
|  |     id | ||||||
|  |     user_id | ||||||
|  |     created | ||||||
|  |  | ||||||
|  | yammer_group | ||||||
|  |     id | ||||||
|  |     group_id | ||||||
|  |     created | ||||||
|  |  | ||||||
|  | yammer_notice | ||||||
|  |     id | ||||||
|  |     notice_id | ||||||
|  |     created | ||||||
|  |  | ||||||
|  | yammer_notice_stub | ||||||
|  |     id | ||||||
|  |     json_data | ||||||
|  |     created | ||||||
|  |  | ||||||
|  | */ | ||||||
|  |  | ||||||
							
								
								
									
										79
									
								
								plugins/YammerImport/classes/Yammer_user.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								plugins/YammerImport/classes/Yammer_user.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Data class for remembering Yammer import mappings | ||||||
|  |  * | ||||||
|  |  * PHP version 5 | ||||||
|  |  * | ||||||
|  |  * @category Data | ||||||
|  |  * @package  StatusNet | ||||||
|  |  * @author   Brion Vibber <brion@status.net> | ||||||
|  |  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 | ||||||
|  |  * @link     http://status.net/ | ||||||
|  |  * | ||||||
|  |  * StatusNet - the distributed open-source microblogging tool | ||||||
|  |  * Copyright (C) 2010, StatusNet, Inc. | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Affero General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the | ||||||
|  |  * GNU Affero General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Affero General Public License | ||||||
|  |  * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | if (!defined('STATUSNET')) { | ||||||
|  |     exit(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class Yammer_user extends Yammer_common | ||||||
|  | { | ||||||
|  |     public $__table = 'yammer_user'; // table name | ||||||
|  |     public $__field = 'user_id';     // field to map to | ||||||
|  |     public $user_id;                 // int | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Get an instance by key | ||||||
|  |      * | ||||||
|  |      * This is a utility method to get a single instance with a given key value. | ||||||
|  |      * | ||||||
|  |      * @param string $k Key to use to lookup | ||||||
|  |      * @param mixed  $v Value to lookup | ||||||
|  |      * | ||||||
|  |      * @return Yammer_user object found, or null for no hits | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     function staticGet($k, $v=null) | ||||||
|  |     { | ||||||
|  |         return Memcached_DataObject::staticGet('Yammer_user', $k, $v); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Return schema definition to set this table up in onCheckSchema | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     static function schemaDef() | ||||||
|  |     { | ||||||
|  |         return self::doSchemaDef('user_id'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Save a mapping between a remote Yammer and local imported user. | ||||||
|  |      * | ||||||
|  |      * @param integer $orig_id ID of the notice in Yammer | ||||||
|  |      * @param integer $user_id ID of the status in StatusNet | ||||||
|  |      * | ||||||
|  |      * @return Yammer_user new object for this value | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     static function record($orig_id, $user_id) | ||||||
|  |     { | ||||||
|  |         return self::doRecord('Yammer_user', 'user_id', $orig_id, $user_id); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -26,9 +26,6 @@ | |||||||
| class YammerImporter | class YammerImporter | ||||||
| { | { | ||||||
|     protected $client; |     protected $client; | ||||||
|     protected $users=array(); |  | ||||||
|     protected $groups=array(); |  | ||||||
|     protected $notices=array(); |  | ||||||
|  |  | ||||||
|     function __construct(SN_YammerClient $client) |     function __construct(SN_YammerClient $client) | ||||||
|     { |     { | ||||||
| @@ -330,44 +327,32 @@ class YammerImporter | |||||||
|  |  | ||||||
|     private function findImportedUser($origId) |     private function findImportedUser($origId) | ||||||
|     { |     { | ||||||
|         if (isset($this->users[$origId])) { |         return Yammer_user::staticGet('id', $origId); | ||||||
|             return $this->users[$origId]; |  | ||||||
|         } else { |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private function findImportedGroup($origId) |     private function findImportedGroup($origId) | ||||||
|     { |     { | ||||||
|         if (isset($this->groups[$origId])) { |         return Yammer_group::staticGet('id', $origId); | ||||||
|             return $this->groups[$origId]; |  | ||||||
|         } else { |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private function findImportedNotice($origId) |     private function findImportedNotice($origId) | ||||||
|     { |     { | ||||||
|         if (isset($this->notices[$origId])) { |         return Yammer_notice::staticGet('id', $origId); | ||||||
|             return $this->notices[$origId]; |  | ||||||
|         } else { |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private function recordImportedUser($origId, $userId) |     private function recordImportedUser($origId, $userId) | ||||||
|     { |     { | ||||||
|         $this->users[$origId] = $userId; |         Yammer_user::record($origId, $userId); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private function recordImportedGroup($origId, $groupId) |     private function recordImportedGroup($origId, $groupId) | ||||||
|     { |     { | ||||||
|         $this->groups[$origId] = $groupId; |         Yammer_group::record($origId, $groupId); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private function recordImportedNotice($origId, $noticeId) |     private function recordImportedNotice($origId, $noticeId) | ||||||
|     { |     { | ||||||
|         $this->notices[$origId] = $noticeId; |         Yammer_notice::record($origId, $noticeId); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
							
								
								
									
										47
									
								
								plugins/YammerImport/lib/yammerqueuehandler.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								plugins/YammerImport/lib/yammerqueuehandler.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | |||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * StatusNet - the distributed open-source microblogging tool | ||||||
|  |  * Copyright (C) 2010, StatusNet, Inc. | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU Affero General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU Affero General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Affero General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | if (!defined('STATUSNET')) { | ||||||
|  |     exit(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Queue handler for bumping the next chunk of Yammer import activity! | ||||||
|  |  * | ||||||
|  |  * @package YammerImportPlugin | ||||||
|  |  * @author Brion Vibber <brion@status.net> | ||||||
|  |  */ | ||||||
|  | class YammerQueueHandler extends QueueHandler | ||||||
|  | { | ||||||
|  |     function transport() | ||||||
|  |     { | ||||||
|  |         return 'yammer'; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function handle($notice) | ||||||
|  |     { | ||||||
|  |         $importer = new YammerImporter(); | ||||||
|  |         if ($importer->hasWork()) { | ||||||
|  |             return $importer->iterate(); | ||||||
|  |         } else { | ||||||
|  |             // We're done! | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user