44ef1742ba03ce7bb0bdfeea1a1784be422aa69d
[platal.git] / modules / ptawebservice / request.inc.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2011 Polytechnique.org *
4 * http://opensource.polytechnique.org/ *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
18 * Foundation, Inc., *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
21
22
23 class WSDirectoryRequest
24 {
25 // Default number of returned results.
26 const DEFAULT_AMOUNT = 20;
27
28 public $fields;
29 public $criteria;
30 public $order = array();
31 public $amount = 0;
32 protected $partner = null;
33
34 const ORDER_RAND = 'rand';
35 const ORDER_NAME = 'name';
36 const ORDER_PROMOTION = 'promotion';
37
38 public static $ORDER_CHOICES = array(
39 self::ORDER_RAND,
40 self::ORDER_NAME,
41 self::ORDER_PROMOTION,
42 );
43
44 public function __construct($partner, PlDict $payload)
45 {
46 $this->partner = $partner;
47 global $globals;
48
49 $this->fields = array_intersect($payload->v('fields'), WSRequestFields::$CHOICES);
50 $this->order = array_intersect($payload->v('order', array()), self::$ORDER_CHOICES);
51
52 $this->criteria = array();
53 $criteria = new PlDict($payload->v('criteria'));
54 foreach (WSRequestCriteria::$CHOICES_SIMPLE as $criterion) {
55 if ($criteria->has($criterion)) {
56 $this->criteria[$criterion] = $criteria->s($criterion);
57 }
58 }
59 foreach (WSRequestCriteria::$CHOICES_ENUM as $criterion) {
60 if ($criteria->has($criterion)) {
61 $this->criteria[$criterion] = $criteria->s($criterion);
62 }
63 }
64 foreach (WSRequestCriteria::$CHOICES_LIST as $criterion) {
65 if ($criteria->has($criterion)) {
66 $this->criteria[$criterion] = $criteria->v($criterion);
67 }
68 }
69
70 // Amount may not exceed $globals->pta->max_result_per_query.
71 $amount = $payload->i('amount', self::DEFAULT_AMOUNT);
72 $this->amount = min($amount, $globals->pta->max_result_per_query);
73 }
74
75 public function get()
76 {
77 $cond = $this->getCond();
78 $cond->addChild(new UFC_PartnerSharing($this->partner->id));
79 $pf = new ProfileFilter($cond, $this->getOrders());
80 $pf->restrictVisibilityForPartner($this->partner->id);
81 $response = array();
82 $matches = $pf->getTotalProfileCount();
83 $response['matches'] = $matches;
84
85 $profiles = array();
86 if ($matches) {
87 // TODO : improve fetching by passing an adequate FETCH field
88 $iter = $pf->iterProfiles(new PlLimit($this->amount), 0x0000, Visibility::get(Visibility::VIEW_PRIVATE));
89 while ($profile = $iter->next()) {
90 if ($profile->getPartnerSettings($this->partner->id)->exposed_uid !== 0) {
91 $profile_data = new WSRequestEntry($this->partner, $profile);
92 $profiles[] = $profile_data->getFields($this->fields);
93 }
94 }
95 }
96 $response['profiles'] = $profiles;
97 return $response;
98 }
99
100 public function assignToPage(PlPage $page)
101 {
102 $response = $this->get();
103 $page->jsonAssign('matches', $response['matches']);
104 $page->jsonAssign('profiles', $response['profiles']);
105 }
106
107 /** Compute the orders to use for the current request.
108 * @return array of PlFilterOrder
109 */
110 protected function getOrders()
111 {
112 $orders = array();
113 foreach ($this->order as $order)
114 {
115 switch ($order) {
116 case self::ORDER_RAND:
117 $orders[] = new PFO_Random();
118 break;
119 case self::ORDER_NAME:
120 $orders[] = new UFO_Name(Profile::DN_SORT);
121 break;
122 case self::ORDER_PROMOTION:
123 $orders[] = new UFO_Promo();
124 break;
125 default:
126 break;
127 }
128 }
129 return $orders;
130 }
131
132 /** Compute the conditions to use for the current request.
133 * @return A PlFilterCondition instance (actually a PFC_And)
134 */
135 protected function getCond()
136 {
137 $cond = new PFC_And();
138 foreach ($this->criteria as $criterion => $value) {
139 switch ($criterion) {
140
141 // ENUM fields
142 case WSRequestCriteria::SCHOOL:
143 // Useless criterion: we don't need to check on origin school
144 if (WSRequestCriteria::$CHOICES_ENUM[$criterion][$value]) {
145 $cond->addChild(new PFC_True());
146 } else {
147 $cond->addChild(new PFC_False());
148 };
149 break;
150 case WSRequestCriteria::DIPLOMA:
151 $diploma = WSRequestCriteria::$CHOICES_ENUM[$criterion][$value];
152 $id_X = XDB::fetchOneCell('SELECT id
153 FROM profile_education_enum
154 WHERE abbreviation = {?}', 'X');
155 $cond->addChildren(array(
156 new UFC_EducationSchool($id_X),
157 new UFC_EducationDegree($diploma),
158 ));
159 break;
160
161 // TEXT fields
162 case WSRequestCriteria::FIRSTNAME:
163 case WSRequestCriteria::LASTNAME:
164 $cond->addChild(new UFC_NameTokens($value, UFC_NameTokens::FLAG_PUBLIC, false, false, $criterion));
165 break;
166 case WSRequestCriteria::PROMOTION:
167 $cond->addChild(new PFC_Or(
168 new UFC_Promo(UserFilter::OP_EQUALS,
169 UserFilter::GRADE_ING,
170 $value),
171 new UFC_Promo(UserFilter::OP_EQUALS,
172 UserFilter::GRADE_MST,
173 $value),
174 new UFC_Promo(UserFilter::OP_EQUALS,
175 UserFilter::GRADE_PHD,
176 $value)
177 ));
178 break;
179 case WSRequestCriteria::ALT_DIPLOMA:
180 $cond->addChild(
181 new UFC_EducationDegree(
182 DirEnum::getIds(DirEnum::EDUDEGREES, $value)));
183 break;
184 case WSRequestCriteria::DIPLOMA_FIELD:
185 $cond->addChild(
186 new UFC_EducationField(
187 DirEnum::getIds(DirEnum::EDUFIELDS, $value)));
188 break;
189 case WSRequestCriteria::CITY:
190 $cond->addChild(
191 new UFC_AddressField($value,
192 UFC_AddressField::FIELD_LOCALITY,
193 UFC_Address::TYPE_HOME,
194 UFC_Address::FLAG_CURRENT));
195 break;
196 case WSRequestCriteria::COUNTRY:
197 $cond->addChild(
198 new UFC_AddressField($value,
199 UFC_AddressField::FIELD_COUNTRY,
200 UFC_Address::TYPE_HOME,
201 UFC_Address::FLAG_CURRENT));
202 break;
203 case WSRequestCriteria::ZIPCODE:
204 $cond->addChild(
205 new UFC_AddressField($value,
206 UFC_AddressField::FIELD_ZIPCODE,
207 UFC_Address::TYPE_HOME,
208 UFC_Address::FLAG_CURRENT));
209 break;
210 case WSRequestCriteria::JOB_ANY_COUNTRY:
211 $cond->addChild(
212 new UFC_AddressField($value,
213 UFC_AddressField::FIELD_COUNTRY,
214 UFC_Address::TYPE_PRO,
215 UFC_Address::FLAG_ANY));
216 break;
217 case WSRequestCriteria::JOB_CURRENT_CITY:
218 $cond->addChild(
219 new UFC_AddressField($value,
220 UFC_AddressField::FIELD_LOCALITY,
221 UFC_Address::TYPE_PRO,
222 UFC_Address::FLAG_ANY));
223 break;
224 case WSRequestCriteria::JOB_ANY_COMPANY:
225 case WSRequestCriteria::JOB_CURRENT_COMPANY:
226 $cond->addChild(
227 new UFC_Job_Company(UFC_Job_Company::JOBNAME,
228 $value));
229 break;
230 case WSRequestCriteria::JOB_ANY_SECTOR:
231 case WSRequestCriteria::JOB_CURRENT_SECTOR:
232 case WSRequestCriteria::JOB_CURRENT_TITLE:
233 $cond->addChild(
234 new UFC_Job_Terms(DirEnum::getIds(DirEnum::JOBTERMS, $value)));
235 break;
236
237 // LIST fields
238 case WSRequestCriteria::HOBBIES:
239 $subcond = new PFC_Or();
240 foreach ($value as $val) {
241 $subcond->addChild(new UFC_Comment($value));
242 }
243 $cond->addChild($subcond);
244 break;
245 case WSRequestCriteria::JOB_COMPETENCIES:
246 case WSRequestCriteria::JOB_RESUME:
247 case WSRequestCriteria::PROFESSIONAL_PROJECT:
248 $subcond = new PFC_Or();
249 foreach ($value as $val) {
250 $subcond->addChild(
251 new UFC_Job_Description($value, UserFilter::JOB_USERDEFINED));
252 }
253 $cond->addChild($subcond);
254 break;
255 case WSRequestCriteria::NOT_UID:
256 $cond->addChild(
257 new PFC_Not(
258 new UFC_PartnerSharingID($this->partner->id, $value)));
259 break;
260 default:
261 break;
262 }
263 }
264
265 return $cond;
266 }
267
268 /** Input validation
269 */
270 const ERROR_MISSING_FIELDS = 'missing_fields';
271 const ERROR_MISSING_CRITERIA = 'missing_criteria';
272 const ERROR_MALFORMED_AMOUNT = 'malformed_amount';
273 const ERROR_MALFORMED_ORDER = 'malformed_order';
274
275 public static $ERROR_MESSAGES = array(
276 self::ERROR_MISSING_FIELDS => "The 'fields' field is mandatory.",
277 self::ERROR_MISSING_CRITERIA => "The 'criteria' field is mandatory.",
278 self::ERROR_MALFORMED_AMOUNT => "The 'amount' value is invalid (expected an int)",
279 self::ERROR_MALFORMED_ORDER => "The 'order' value is invalid (expected an array)",
280 );
281
282 /** Static method performing all input validation on the payload.
283 * @param PlDict $payload The payload to validate
284 * @return array Errors discovered when validating input
285 */
286 public static function validatePayload(PlDict $payload)
287 {
288 $errors = array();
289 if (!$payload->has('fields')) {
290 $errors[] = self::ERROR_MISSING_FIELDS;
291 }
292 if (!$payload->has('criteria')) {
293 $errors[] = self::ERROR_MISSING_CRITERIA;
294 }
295
296 if ($payload->has('amount') && $payload->i('amount', -1) < 0) {
297 $errors[] = self::ERROR_MALFORMED_AMOUNT;
298 }
299
300 if (!is_array($payload->v('order', array()))) {
301 $errors[] = self::ERROR_MALFORMED_ORDER;
302 }
303
304 return $errors;
305 }
306 }
307
308 // {{{ WSRequestEntry
309 /** Performs field retrieval for a profile.
310 */
311 class WSRequestEntry
312 {
313 private $profile = null;
314 private $partner = null;
315 private $settings = null;
316
317 public function __construct($partner, $profile)
318 {
319 $this->partner = $partner;
320 $this->profile = $profile;
321 $this->settings = $this->profile->getPartnerSettings($this->partner->id);
322 }
323
324 public function isVisible($level)
325 {
326 return $this->settings->sharing_visibility->isVisible($level);
327 }
328
329 public function getFields($fields)
330 {
331 $data = array();
332 foreach ($fields as $field)
333 {
334 $val = $this->getFieldValue($field);
335 if ($val !== null) {
336 $data[$field] = $val;
337 }
338 }
339 $data['uid'] = $this->settings->exposed_uid;
340 return $data;
341 }
342
343 protected function getFieldValue($field)
344 {
345 // Shortcut
346 $p = $this->profile;
347
348 switch ($field) {
349 case WSRequestFields::UID:
350 // UID is always included
351 return;
352 case WSRequestFields::BIRTHDATE:
353 case WSRequestFields::FAMILY_POSITION:
354 case WSRequestFields::HONORARY_TITLES:
355 case WSRequestFields::LANGS:
356 case WSRequestFields::JOB_COMPETENCIES:
357 case WSRequestFields::RESUME:
358 case WSRequestFields::PROFESSIONAL_PROJECT:
359 case WSRequestFields::HOBBIES:
360 // Ignored fields
361 return;
362
363 // Public fields
364 case WSRequestFields::FIRSTNAME:
365 return $p->firstName();
366 case WSRequestFields::LASTNAME:
367 return $p->lastName();
368 case WSRequestFields::GENDER:
369 if ($p->isFemale()) {
370 return WSRequestFields::GENDER_WOMAN;
371 } else {
372 return WSRequestFields::GENDER_MAN;
373 }
374 case WSRequestFields::SCHOOL:
375 return WSRequestCriteria::SCHOOL_X;
376 case WSRequestFields::DIPLOMA:
377 $edu = $p->getEducations(Profile::EDUCATION_MAIN);
378 if (count($edu)) {
379 return WSRequestFields::profileDegreeToWSDiploma(
380 array_pop($edu)->degree);
381 } else {
382 return null;
383 }
384 case WSRequestFields::DIPLOMA_FIELD:
385 $edu = $p->getEducations(Profile::EDUCATION_MAIN);
386 if (count($edu)) {
387 return array_pop($edu)->field;
388 } else {
389 return null;
390 }
391 case WSRequestFields::PROMOTION:
392 return $p->yearpromo();
393 case WSRequestFields::ALT_DIPLOMAS:
394 $diplomas = array();
395 foreach ($p->getExtraEducations() as $edu) {
396 $diplomas[] = WSRequestFields::profileDegreeToWSDiploma(
397 $edu->degree);
398 }
399 return $diplomas;
400
401 // Other generic profile fields
402 case WSRequestFields::EMAIL:
403 if ($this->settings->sharing_visibility->isVisible(Visibility::EXPORT_PRIVATE)) {
404 // If sharing "all" data, share best email.
405 return $p->displayEmail();
406 } elseif ($this->settings->sharing_visibility->isVisible(Visibility::EXPORT_AX)) {
407 // If sharing "AX" level, share "AX" email.
408 return $p->email_directory;
409 } else {
410 // Otherwise, don't share.
411 return null;
412 }
413 case WSRequestFields::MOBILE_PHONE:
414 $phones = $p->getPhones(Profile::PHONE_TYPE_MOBILE | Profile::PHONE_LINK_PROFILE);
415 if (count($phones)) {
416 $phone = array_pop($phones);
417 if ($this->isVisible($phone->pub)) {
418 return $phone->display;
419 }
420 }
421 return null;
422 case WSRequestFields::PIC_SMALL:
423 case WSRequestFields::PIC_MEDIUM:
424 case WSRequestFields::PIC_LARGE:
425 if ($this->isVisible($p->photo_pub)) {
426 $token = sha1(uniqid(rand(), true));
427 XDB::execute('DELETE FROM profile_photo_tokens
428 WHERE pid = {?}', $p->pid);
429 XDB::execute('INSERT INTO profile_photo_tokens
430 SET pid = {?}, token = {?},
431 expires = ADDTIME(NOW(), \'0:05:00\')',
432 $p->pid, $token);
433 $size_mappings = array(
434 WSRequestFields::PIC_SMALL => 'small',
435 WSRequestFields::PIC_MEDIUM => 'medium',
436 WSRequestFields::PIC_LARGE => 'large',
437 );
438 $size = $size_mappings[$field];
439 return pl_url("pta/picture/$size/$token");
440 } else {
441 return null;
442 }
443
444 // Address related
445 case WSRequestFields::CURRENT_CITY:
446 $address = $p->getMainAddress();
447 if ($address != null && $this->isVisible($address->pub)) {
448 return $address->locality;
449 } else {
450 return null;
451 }
452 case WSRequestFields::CURRENT_COUNTRY:
453 $address = $p->getMainAddress();
454 if ($address != null && $this->isVisible($address->pub)) {
455 return $address->country;
456 } else {
457 return null;
458 }
459 case WSRequestFields::ADDRESS:
460 $address = $p->getMainAddress();
461 if ($address != null && $this->isVisible($address->pub)) {
462 return $this->addressToResponse($address);
463 } else {
464 return null;
465 }
466
467 // Job related
468 case WSRequestFields::CURRENT_COMPANY:
469 $job = $p->getMainJob();
470 if ($job != null && $this->isVisible($job->pub)) {
471 return $job->company->name;
472 } else {
473 return null;
474 }
475 case WSRequestFields::JOB:
476 $jobs = $p->getJobs(Profile::JOBS_ALL);
477 $res = array();
478 foreach ($jobs as $job) {
479 if ($this->isVisible($job->pub)) {
480 $res[] = $this->jobToResponse($job);
481 }
482 }
483 return $res;
484 case WSRequestFields::MINI_RESUME:
485 if ($this->isVisible(Visibility::EXPORT_PRIVATE)) {
486 return $p->cv;
487 } else {
488 return null;
489 }
490
491 // Community
492 case WSRequestFields::GROUPS:
493 $groups = array();
494 if ($this->isVisible(Visibility::EXPORT_PRIVATE)) {
495 foreach ($p->owner()->groups(true, true) as $group) {
496 $groups[] = array('name' => $group['nom']);
497 }
498 }
499 return $groups;
500 case WSRequestFields::FRIENDS:
501 $friends = array();
502 if ($this->isVisible(Visibility::EXPORT_PRIVATE)) {
503 $contacts = $p->owner()->iterContacts();
504 if ($contacts == null) {
505 return $friends;
506 }
507
508 while ($contact = $contacts->next()) {
509 $cps = $contact->getPartnerSettings($this->partner->id);
510 if ($cps->sharing_visibility->isVisible(Visibility::EXPORT_PRIVATE)) {
511 $friends[] = $cps->exposed_uid;
512 }
513 }
514 }
515 return $friends;
516 case WSRequestFields::NETWORKING:
517 $networks = array();
518 if ($this->isVisible(Visibility::EXPORT_PRIVATE)) {
519 foreach ($p->getNetworking(Profile::NETWORKING_ALL) as $nw) {
520 $networks[] = array(
521 'network' => $nw['name'],
522 'login' => $nw['address'],
523 );
524 }
525 }
526 return $networks;
527
528 default:
529 return null;
530 }
531 }
532
533 protected function jobToResponse($job)
534 {
535 $data = array();
536 $data['company'] = $job->company->name;
537 $data['title'] = $job->description;
538 $data['sector'] = array_pop($job->terms);
539 $data['entry'] = null;
540 $data['left'] = null;
541 foreach($job->phones() as $phone) {
542 if ($this->isVisible($phone->pub)) {
543 $data['phone'] = $phone->display;
544 break;
545 }
546 }
547 if ($job->address && $this->isVisible($job->address->pub)) {
548 $data['address'] = $this->addressToResponse($job->address);
549 }
550 return $data;
551 }
552
553 protected function addressToResponse($address)
554 {
555 $data = array();
556 $data['street'] = $address->postalText;
557 $data['zipcode'] = $address->postalCode;
558 $data['city'] = $address->locality;
559 $data['country'] = $address->country;
560 $data['latitude'] = $address->latitude;
561 $data['longitude'] = $address->longitude;
562 return $data;
563 }
564 }
565 // }}}
566 // {{{ WSRequestCriteria
567 /** Holds all enums and related mappings for criterias.
568 */
569 class WSRequestCriteria
570 {
571 const FIRSTNAME = 'firstname';
572 const LASTNAME = 'lastname';
573 const SCHOOL = 'school';
574 const DIPLOMA = 'diploma';
575 const DIPLOMA_FIELD = 'diploma_field';
576 const PROMOTION = 'promotion';
577 const HOBBIES = 'hobbies';
578 const ZIPCODE = 'zipcode';
579 const CITY = 'city';
580 const COUNTRY = 'country';
581 const JOB_CURRENT_SECTOR = 'job_current_sector';
582 const JOB_CURRENT_TITLE = 'job_current_title';
583 const JOB_CURRENT_COMPANY = 'job_current_company';
584 const JOB_CURRENT_CITY = 'job_current_city';
585 const JOB_CURRENT_COUNTRY = 'job_current_country';
586 const JOB_ANY_SECTOR = 'job_any_sector';
587 const JOB_ANY_COMPANY = 'job_any_company';
588 const JOB_ANY_COUNTRY = 'job_any_country';
589 const JOB_RESUME = 'job_resume';
590 const JOB_COMPETENCIES = 'job_competencies';
591 const PROFESSIONAL_PROJECT = 'professional_project';
592 const ALT_DIPLOMA = 'alt_diploma';
593 const NOT_UID = 'not_uid';
594
595 public static $CHOICES_SIMPLE = array(
596 self::FIRSTNAME,
597 self::LASTNAME,
598 self::PROMOTION,
599 self::ALT_DIPLOMA,
600 self::DIPLOMA_FIELD,
601 self::CITY,
602 self::ZIPCODE,
603 self::COUNTRY,
604 self::JOB_ANY_COUNTRY,
605 self::JOB_CURRENT_CITY,
606 self::JOB_CURRENT_COUNTRY,
607 self::JOB_ANY_COMPANY,
608 self::JOB_ANY_SECTOR,
609 self::JOB_CURRENT_COMPANY,
610 self::JOB_CURRENT_SECTOR,
611 self::JOB_CURRENT_TITLE,
612 );
613
614 const SCHOOL_AGRO = 'agro';
615 const SCHOOL_ENSAE = 'ensae';
616 const SCHOOL_ENSCP = 'enscp';
617 const SCHOOL_ENST = 'enst';
618 const SCHOOL_ENSTA = 'ensta';
619 const SCHOOL_ESPCI = 'espci';
620 const SCHOOL_GADZ = 'gadz';
621 const SCHOOL_HEC = 'hec';
622 const SCHOOL_MINES = 'ensmp';
623 const SCHOOL_PONTS = 'enpc';
624 const SCHOOL_SUPELEC = 'supelec';
625 const SCHOOL_SUPOP = 'supop';
626 const SCHOOL_X = 'X';
627
628 const DIPLOMA_ING = 'ING';
629 const DIPLOMA_MASTER = 'MASTER';
630 const DIPLOMA_PHD = 'PHD';
631
632 public static $CHOICES_ENUM = array(
633 self::SCHOOL => array(
634 self::SCHOOL_AGRO => false,
635 self::SCHOOL_ENSAE => false,
636 self::SCHOOL_ENSCP => false,
637 self::SCHOOL_ENST => false,
638 self::SCHOOL_ENSTA => false,
639 self::SCHOOL_ESPCI => false,
640 self::SCHOOL_GADZ => false,
641 self::SCHOOL_HEC => false,
642 self::SCHOOL_MINES => false,
643 self::SCHOOL_PONTS => false,
644 self::SCHOOL_SUPELEC => false,
645 self::SCHOOL_SUPOP => false,
646 self::SCHOOL_X => true,
647 ),
648 self::DIPLOMA => array(
649 self::DIPLOMA_ING => UserFilter::GRADE_ING,
650 self::DIPLOMA_MASTER => UserFilter::GRADE_MST,
651 self::DIPLOMA_PHD => UserFilter::GRADE_PHD,
652 ),
653 );
654
655 public static $CHOICES_LIST = array(
656 self::HOBBIES,
657 self::JOB_COMPETENCIES,
658 self::JOB_RESUME,
659 self::NOT_UID,
660 self::PROFESSIONAL_PROJECT,
661 );
662 }
663
664 // }}}
665 // {{{ WSRequestFields
666 /** Holds all enums for fields.
667 */
668 class WSRequestFields
669 {
670 const UID = 'uid';
671 const FIRSTNAME = 'firstname';
672 const LASTNAME = 'lastname';
673 const BIRTHDATE = 'birthdate';
674 const GENDER = 'gender';
675 const FAMILY_POSITION = 'family_position';
676 const SCHOOL = 'school';
677 const DIPLOMA = 'diploma';
678 const DIPLOMA_FIELD = 'diploma_field';
679 const PROMOTION = 'promotion';
680 const ALT_DIPLOMAS = 'alt_diplomas';
681 const CURRENT_COMPANY = 'current_company';
682 const CURRENT_CITY = 'current_city';
683 const CURRENT_COUNTRY = 'current_country';
684 const MOBILE_PHONE = 'mobile_phone';
685 const HONORARY_TITLES = 'honorary_titles';
686 const EMAIL = 'email';
687 const PIC_SMALL = 'pic_small';
688 const PIC_MEDIUM = 'pic_medium';
689 const PIC_LARGE = 'pic_large';
690 const ADDRESS = 'address';
691 const JOB = 'job';
692 const GROUPS = 'groups';
693 const LANGS = 'langs';
694 const JOB_COMPETENCIES = 'job_competencies';
695 const MINI_RESUME = 'mini_resume';
696 const RESUME = 'resume';
697 const PROFESSIONAL_PROJECT = 'professional_project';
698 const HOBBIES = 'hobbies';
699 const FRIENDS = 'friends';
700 const NETWORKING = 'networking';
701
702 const GENDER_MAN = 'man';
703 const GENDER_WOMAN = 'woman';
704
705 const DIPLOMA_ING = 'engineer';
706 const DIPLOMA_MASTER = 'master';
707 const DIPLOMA_PHD = 'phd';
708
709 public static $CHOICES = array(
710 self::UID,
711 self::FIRSTNAME,
712 self::LASTNAME,
713 self::BIRTHDATE,
714 self::GENDER,
715 self::FAMILY_POSITION,
716 self::SCHOOL,
717 self::DIPLOMA,
718 self::DIPLOMA_FIELD,
719 self::PROMOTION,
720 self::ALT_DIPLOMAS,
721 self::CURRENT_COMPANY,
722 self::CURRENT_CITY,
723 self::CURRENT_COUNTRY,
724 self::MOBILE_PHONE,
725 self::HONORARY_TITLES,
726 self::EMAIL,
727 self::PIC_SMALL,
728 self::PIC_MEDIUM,
729 self::PIC_LARGE,
730 self::ADDRESS,
731 self::JOB,
732 self::GROUPS,
733 self::LANGS,
734 self::JOB_COMPETENCIES,
735 self::MINI_RESUME,
736 self::RESUME,
737 self::PROFESSIONAL_PROJECT,
738 self::HOBBIES,
739 self::FRIENDS,
740 self::NETWORKING,
741 );
742
743 public static function profileDegreeToWSDiploma($degree)
744 {
745 switch ($degree) {
746 case Profile::DEGREE_X:
747 return self::DIPLOMA_ING;
748 case Profile::DEGREE_M:
749 return self::DIPLOMA_MASTER;
750 case Profile::DEGREE_D:
751 return self::DIPLOMA_PHD;
752 default:
753 return null;
754 }
755 }
756
757 }
758 // }}}
759
760 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
761 ?>