Commit | Line | Data |
---|---|---|
7e95408b | 1 | <?php |
76116d2e DM |
2 | |
3 | // This file is part of Moodle - http://moodle.org/ | |
4 | // | |
5 | // Moodle is free software: you can redistribute it and/or modify | |
6 | // it under the terms of the GNU General Public License as published by | |
7 | // the Free Software Foundation, either version 3 of the License, or | |
8 | // (at your option) any later version. | |
9 | // | |
10 | // Moodle is distributed in the hope that it will be useful, | |
11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | // GNU General Public License for more details. | |
14 | // | |
15 | // You should have received a copy of the GNU General Public License | |
16 | // along with Moodle. If not, see <http://www.gnu.org/licenses/>. | |
17 | ||
18 | /** | |
19 | * @package portfolio | |
20 | * @subpackage flickr | |
21 | * @copyright 2008 Nicolas Connault | |
22 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | |
23 | */ | |
24 | ||
25 | defined('MOODLE_INTERNAL') || die(); | |
26 | ||
f675815e | 27 | require_once($CFG->libdir.'/portfolio/plugin.php'); |
7e95408b | 28 | require_once($CFG->libdir.'/filelib.php'); |
539b3d13 | 29 | require_once($CFG->libdir.'/flickrlib.php'); |
7e95408b | 30 | |
31 | class portfolio_plugin_flickr extends portfolio_plugin_push_base { | |
32 | ||
33 | private $flickr; | |
a55d94d4 | 34 | private $token; |
35 | private $raw_sets; | |
7e95408b | 36 | |
38652d90 | 37 | public function supported_formats() { |
ea0de12f | 38 | return array(PORTFOLIO_FORMAT_IMAGE); |
39 | } | |
40 | ||
0f71f48b | 41 | public static function get_name() { |
42 | return get_string('pluginname', 'portfolio_flickr'); | |
43 | } | |
44 | ||
7e95408b | 45 | public function prepare_package() { |
a55d94d4 | 46 | |
7e95408b | 47 | } |
48 | ||
49 | public function send_package() { | |
a55d94d4 | 50 | foreach ($this->exporter->get_tempfiles() as $file) { |
51 | // @TODO get max size from flickr people_getUploadStatus | |
52 | $filesize = $file->get_filesize(); | |
53 | ||
54 | if ($file->is_valid_image()) { | |
76116d2e DM |
55 | $return = $this->flickr->upload($file, array( |
56 | 'title' => $this->get_export_config('title'), | |
57 | 'description' => $this->get_export_config('description'), | |
58 | 'tags' => $this->get_export_config('tags'), | |
59 | 'is_public' => $this->get_export_config('is_public'), | |
60 | 'is_friend' => $this->get_export_config('is_friend'), | |
61 | 'is_family' => $this->get_export_config('is_family'), | |
62 | 'safety_level' => $this->get_export_config('safety_level'), | |
63 | 'content_type' => $this->get_export_config('content_type'), | |
64 | 'hidden' => $this->get_export_config('hidden'))); | |
0d4231f0 | 65 | if ($return) { |
66 | // Attach photo to a set if requested | |
67 | if ($this->get_export_config('set')) { | |
76116d2e DM |
68 | $this->flickr->photosets_addPhoto($this->get_export_config('set'), |
69 | $this->flickr->parsed_response['photoid']); | |
0d4231f0 | 70 | } |
71 | } else { | |
76116d2e DM |
72 | throw new portfolio_plugin_exception('uploadfailed', 'portfolio_flickr', |
73 | $this->flickr->error_code . ': ' . $this->flickr->error_msg); | |
a55d94d4 | 74 | } |
a55d94d4 | 75 | } |
76 | } | |
7e95408b | 77 | } |
78 | ||
384ba38a | 79 | public static function allows_multiple_instances() { |
237d80e0 | 80 | return false; |
81 | } | |
82 | ||
5d0dbf13 | 83 | public function get_interactive_continue_url() { |
76116d2e | 84 | return $this->flickr->urls_getUserPhotos(); |
7e95408b | 85 | } |
86 | ||
87 | public function expected_time($callertime) { | |
88 | return $callertime; | |
89 | } | |
90 | ||
91 | public static function get_allowed_config() { | |
92 | return array('apikey', 'sharedsecret'); | |
93 | } | |
94 | ||
95 | public static function has_admin_config() { | |
96 | return true; | |
97 | } | |
98 | ||
99 | public function admin_config_form(&$mform) { | |
76116d2e DM |
100 | global $CFG; |
101 | ||
7e95408b | 102 | $strrequired = get_string('required'); |
76116d2e | 103 | $mform->addElement('text', 'apikey', get_string('apikey', 'portfolio_flickr'), array('size' => 30)); |
7e95408b | 104 | $mform->addRule('apikey', $strrequired, 'required', null, 'client'); |
105 | $mform->addElement('text', 'sharedsecret', get_string('sharedsecret', 'portfolio_flickr')); | |
106 | $mform->addRule('sharedsecret', $strrequired, 'required', null, 'client'); | |
76116d2e DM |
107 | $a = new stdClass(); |
108 | $a->applyurl = 'http://www.flickr.com/services/api/keys/apply/'; | |
109 | $a->keysurl = 'http://www.flickr.com/services/api/keys/'; | |
dd2645d3 | 110 | $a->callbackurl = $CFG->wwwroot . '/portfolio/add.php?postcontrol=1&type=flickr'; |
76116d2e DM |
111 | $mform->addElement('static', 'setupinfo', get_string('setupinfo', 'portfolio_flickr'), |
112 | get_string('setupinfodetails', 'portfolio_flickr', $a)); | |
7e95408b | 113 | } |
114 | ||
a55d94d4 | 115 | public function has_export_config() { |
116 | return true; | |
117 | } | |
118 | ||
119 | public function get_allowed_user_config() { | |
120 | return array('authtoken', 'nsid'); | |
121 | } | |
122 | ||
123 | public function steal_control($stage) { | |
124 | if ($stage != PORTFOLIO_STAGE_CONFIG) { | |
125 | return false; | |
126 | } | |
127 | if ($this->token) { | |
128 | return false; | |
129 | } | |
130 | ||
131 | $token = $this->get_user_config('authtoken', $this->get('user')->id); | |
132 | $nsid = $this->get_user_config('nsid', $this->get('user')->id); | |
133 | ||
134 | $this->flickr = new phpFlickr($this->get_config('apikey'), $this->get_config('sharedsecret'), $token); | |
135 | ||
136 | if (!empty($token)) { | |
137 | $this->token = $token; | |
138 | $this->flickr = new phpFlickr($this->get_config('apikey'), $this->get_config('sharedsecret'), $token); | |
139 | return false; | |
140 | } | |
141 | return $this->flickr->auth('write'); | |
142 | } | |
143 | ||
144 | public function post_control($stage, $params) { | |
145 | if ($stage != PORTFOLIO_STAGE_CONFIG) { | |
146 | return; | |
147 | } | |
148 | if (!array_key_exists('frob', $params) || empty($params['frob'])) { | |
149 | throw new portfolio_plugin_exception('noauthtoken', 'portfolio_flickr'); | |
150 | } | |
151 | ||
152 | $this->flickr = new phpFlickr($this->get_config('apikey'), $this->get_config('sharedsecret')); | |
153 | ||
154 | $auth_info = $this->flickr->auth_getToken($params['frob']); | |
155 | ||
156 | $this->set_user_config(array('authtoken' => $auth_info['token'], 'nsid' => $auth_info['user']['nsid']), $this->get('user')->id); | |
157 | } | |
158 | ||
159 | public function export_config_form(&$mform) { | |
160 | $mform->addElement('text', 'plugin_title', get_string('title', 'portfolio_flickr')); | |
161 | $mform->addElement('textarea', 'plugin_description', get_string('description')); | |
162 | $mform->addElement('text', 'plugin_tags', get_string('tags')); | |
163 | $mform->addElement('checkbox', 'plugin_is_public', get_string('ispublic', 'portfolio_flickr')); | |
164 | $mform->addElement('checkbox', 'plugin_is_family', get_string('isfamily', 'portfolio_flickr')); | |
165 | $mform->addElement('checkbox', 'plugin_is_friend', get_string('isfriend', 'portfolio_flickr')); | |
166 | ||
167 | $mform->disabledIf('plugin_is_friend', 'plugin_is_public', 'checked'); | |
168 | $mform->disabledIf('plugin_is_family', 'plugin_is_public', 'checked'); | |
169 | ||
170 | $safety_levels = array(1 => $this->get_export_value_name('safety_level', 1), | |
171 | 2 => $this->get_export_value_name('safety_level', 2), | |
172 | 3 => $this->get_export_value_name('safety_level', 3)); | |
173 | ||
174 | $content_types = array(1 => $this->get_export_value_name('content_type', 1), | |
175 | 2 => $this->get_export_value_name('content_type', 2), | |
176 | 3 => $this->get_export_value_name('content_type', 3)); | |
177 | ||
178 | $hidden_values = array(1,2); | |
179 | ||
180 | $mform->addElement('select', 'plugin_safety_level', get_string('safetylevel', 'portfolio_flickr'), $safety_levels); | |
181 | $mform->addElement('select', 'plugin_content_type', get_string('contenttype', 'portfolio_flickr'), $content_types); | |
182 | $mform->addElement('advcheckbox', 'plugin_hidden', get_string('hidefrompublicsearches', 'portfolio_flickr'), get_string('yes'), null, $hidden_values); | |
183 | ||
184 | $mform->setDefaults(array('plugin_is_public' => true)); | |
185 | ||
186 | $sets = $this->get_sets(); | |
187 | ||
188 | if (!empty($sets)) { | |
189 | $sets[0] = '----'; | |
190 | $mform->addElement('select', 'plugin_set', get_string('set', 'portfolio_flickr'), $sets); | |
191 | } | |
192 | } | |
193 | ||
194 | private function get_sets() { | |
195 | if (empty($this->raw_sets)) { | |
196 | $this->raw_sets = $this->flickr->photosets_getList(); | |
197 | } | |
198 | ||
199 | $sets = array(); | |
200 | foreach ($this->raw_sets['photoset'] as $set_data) { | |
201 | $sets[$set_data['id']] = $set_data['title']; | |
202 | } | |
203 | return $sets; | |
204 | } | |
205 | ||
206 | public function get_allowed_export_config() { | |
207 | return array('set', 'title', 'description', 'tags', 'is_public', 'is_family', 'is_friend', 'safety_level', 'content_type', 'hidden'); | |
208 | } | |
209 | ||
210 | public function get_export_summary() { | |
211 | return array(get_string('set', 'portfolio_flickr') => $this->get_export_value_name('set', $this->get_export_config('set')), | |
212 | get_string('title', 'portfolio_flickr') => $this->get_export_config('title'), | |
213 | get_string('description') => $this->get_export_config('description'), | |
214 | get_string('tags') => $this->get_export_config('tags'), | |
215 | get_string('ispublic', 'portfolio_flickr') => $this->get_export_value_name('is_public', $this->get_export_config('is_public')), | |
216 | get_string('isfamily', 'portfolio_flickr') => $this->get_export_value_name('is_family', $this->get_export_config('is_family')), | |
217 | get_string('isfriend', 'portfolio_flickr') => $this->get_export_value_name('is_friend', $this->get_export_config('is_friend')), | |
218 | get_string('safetylevel', 'portfolio_flickr') => $this->get_export_value_name('safety_level', $this->get_export_config('safety_level')), | |
219 | get_string('contenttype', 'portfolio_flickr') => $this->get_export_value_name('content_type', $this->get_export_config('content_type')), | |
220 | get_string('hidefrompublicsearches', 'portfolio_flickr') => $this->get_export_value_name('hidden', $this->get_export_config('hidden'))); | |
221 | } | |
222 | ||
223 | private function get_export_value_name($param, $value) { | |
224 | $params = array('set' => $this->get_sets(), | |
225 | 'is_public' => array(0 => get_string('no'), 1 => get_string('yes')), | |
226 | 'is_family' => array(0 => get_string('no'), 1 => get_string('yes')), | |
227 | 'is_friend' => array(0 => get_string('no'), 1 => get_string('yes')), | |
228 | 'safety_level' => array(1 => get_string('safe', 'portfolio_flickr'), | |
229 | 2 => get_string('moderate', 'portfolio_flickr'), | |
230 | 3 => get_string('restricted', 'portfolio_flickr')), | |
231 | 'content_type' => array(1 => get_string('photo', 'portfolio_flickr'), | |
232 | 2 => get_string('screenshot', 'portfolio_flickr'), | |
233 | 3 => get_string('other', 'portfolio_flickr')), | |
234 | 'hidden' => array(1 => get_string('no'), 2 => get_string('yes'))); | |
235 | ||
236 | if (isset($params[$param][$value])) { | |
237 | return $params[$param][$value]; | |
238 | } else { | |
239 | return '-'; | |
240 | } | |
241 | } | |
76116d2e DM |
242 | |
243 | /** | |
244 | * For now, flickr doesn't support this because we can't dynamically construct callbackurl | |
245 | */ | |
246 | public static function allows_multiple_exports() { | |
247 | return false; | |
248 | } | |
7e95408b | 249 | } |