Esempio n. 1
0
 /**  
  * implementation of abstract parse() operation from RestXMLParser.
  *
  * @xml SimpleXMLElement the root element of the application XML representation
  * 
  * @return Default_Model_Researcher
  * @access public
  */
 public function parse($xml)
 {
     if (!is_null($this->_user)) {
         $person = new Default_Model_Researcher();
         try {
             $xml = new SimpleXMLElement($xml);
         } catch (Exception $e) {
             $this->_error = RestErrorEnum::RE_INVALID_REPRESENTATION;
             $this->_extError = $e->getMessage();
             return $person;
         }
         $xmli = $xml->xpath('//person:person');
         if (count($xmli) === 0) {
             $this->_error = RestErrorEnum::RE_INVALID_REPRESENTATION;
             return $person;
         }
         $xml = $xmli[0];
         if ($this->_parent->getMethod() === RestMethodEnum::RM_POST) {
             if ($xml->attributes()->id) {
                 $person->id = strval($xml->attributes()->id);
             } else {
                 $this->_error = RestErrorEnum::RE_INVALID_REPRESENTATION;
                 $this->_extError = 'Resource ID missing';
                 return $person;
             }
         }
         if ($xml->attributes()->nodissemination) {
             $person->noDissemination = strval($xml->attributes()->nodissemination) === "true" ? true : false;
         }
         if ($xml->attributes()->cname) {
             $person->cname = strval($xml->attributes()->cname);
         }
         $firstname = $this->el($xml, "person:firstname");
         if (!is_null($firstname) && trim(strval($firstname)) !== "") {
             $person->firstName = trim(strval($firstname));
         }
         $lastname = $this->el($xml, "person:lastname");
         if (!is_null($lastname) && trim(strval($lastname)) !== "") {
             $person->lastName = trim(strval($lastname));
         }
         $gender = $this->el($xml, "person:gender");
         if (!is_null($gender)) {
             if (trim(strval($gender->attributes(RestAPIHelper::XMLNS_XSI())->nil)) === "true") {
                 $person->gender = 'n/a';
             } elseif (trim(strval($gender)) !== "") {
                 if (trim(strtolower(strval($gender))) === "male") {
                     $person->gender = "male";
                 } elseif (trim(strtolower(strval($gender))) === "female") {
                     $person->gender = "female";
                 }
             }
         }
         if ($this->_parent->getMethod() === RestMethodEnum::RM_PUT) {
             $person->dateInclusion = date("Y-m-d");
             $person->addedByID = $this->_parent->getUser()->id;
         }
         $person->lastUpdated = date('Y-m-d');
         $institute = trim(strval($this->el($xml, "person:institute")));
         if (!is_null($institute)) {
             $person->institution = trim(strval($institute));
         }
         $country = $this->el($xml, "regional:country");
         if (!is_null($country) && trim(strval($country->attributes()->id)) !== "") {
             $person->countryID = trim(strval($country->attributes()->id));
         }
         $role = $this->el($xml, "person:role");
         if (!is_null($role) && trim(strval($role->attributes()->id)) !== "") {
             $person->positionTypeID = trim(strval($role->attributes()->id));
         }
         $image = $this->el($xml, "person:image");
         $removeImageCache = false;
         if (!is_null($image)) {
             if (trim(strval($image->attributes(RestAPIHelper::XMLNS_XSI())->nil)) === "true") {
                 $person->clearImage();
                 $removeImageCache = true;
             } else {
                 if (!is_null($image->attributes()->type) && trim(strval($image->attributes()->type)) === "base64") {
                     // image is given as byte64 encoded string
                     if (trim(strval($image)) != '') {
                         $person->image = pg_escape_bytea(trim(strval($image)));
                         $removeImageCache = true;
                     }
                 } else {
                     // image is given as URL
                     if (trim(parse_url(strval($image), PHP_URL_SCHEME)) == '') {
                         // no URL scheme present; assume uploaded file though
                         // portal's uploadimage action in AppsController
                         if (trim(strval($image)) != '') {
                             try {
                                 $person->image = pg_escape_bytea(base64_encode(file_get_contents(APPLICATION_PATH . "/../public/" . trim(strval($image)))));
                                 $removeImageCache = true;
                             } catch (Exception $e) {
                                 $this->_error = RestErrorEnum::RE_BACKEND_ERROR;
                                 $this->_extError = $e->getMessage();
                                 return $person;
                             }
                         }
                     } else {
                         // URL scheme present; assume remote file
                         if (trim(strval($image)) != '') {
                             try {
                                 $person->image = pg_escape_bytea(base64_encode(file_get_contents(trim(strval($image)))));
                                 $removeImageCache = true;
                             } catch (Exception $e) {
                                 $this->_error = RestErrorEnum::RE_BACKEND_ERROR;
                                 $this->_extError = $e->getMessage();
                                 return $person;
                             }
                         }
                     }
                 }
             }
         }
         if ($removeImageCache === true) {
             if ($person->id != '' && file_exists(APPLICATION_PATH . "/../cache/ppl-image-" . $person->id . ".png")) {
                 unlink(APPLICATION_PATH . "/../cache/ppl-image-" . $person->id . ".png");
             }
         }
         $person->save();
         if ($this->_parent->getMethod() === RestMethodEnum::RM_POST) {
             //remove existing contact info
             $conts = new Default_Model_Contacts();
             $conts->filter->researcherid->equals($person->id);
             $conts->refresh();
             for ($i = count($conts->items) - 1; $i >= 0; $i--) {
                 $conts->remove($conts->items[$i]);
             }
         }
         //add new contact info
         $cts = new Default_Model_ContactTypes();
         $cts->refresh();
         $xmli = $xml->xpath("//person:contact");
         $conts2 = new Default_Model_Contacts();
         foreach ($xmli as $x) {
             if (trim(strval($x)) !== '') {
                 $cont = new Default_Model_Contact();
                 $cont->researcherID = $person->id;
                 $ct = trim(strval($x->attributes()->type));
                 $ctid = null;
                 for ($i = 0; $i < count($cts->items); $i++) {
                     if (strtolower($ct) == strtolower($cts->items[$i]->description)) {
                         $ctid = $cts->items[$i]->id;
                         break;
                     }
                 }
                 if (!is_null($ctid)) {
                     $cont->contactTypeID = $ctid;
                 } else {
                     $cont->contactTypeID = 7;
                     //e-mail by default
                 }
                 $cont->data = trim(strval($x));
                 if (strval($x->attributes()->primary) === "true") {
                     $cont->isPrimary = true;
                 }
                 $conts2->filter->data->equals($cont->data)->and($conts2->filter->contacttypeid->equals(7))->and($conts2->filter->researcherid->notequals($person->id));
                 $conts2->refresh("xml");
                 if (count($conts2->items) == 0) {
                     $cont->save();
                 } else {
                     $this->_error = RestErrorEnum::RE_BACKEND_ERROR;
                     $this->_extError = "e-mail address `" . $cont->data . "' already exists";
                     return $person;
                 }
             }
         }
         if ($this->_parent->getMethod() === RestMethodEnum::RM_POST || $this->_parent->getMethod() === RestMethodEnum::RM_PUT) {
             $xrels = $xml->xpath("person:relation");
             $ps = new Default_Model_Researchers();
             $ps->filter->id->equals($person->id);
             $p = null;
             if (count($ps->items) > 0) {
                 $p = $ps->items[0];
             }
             if ($p !== null) {
                 $rels = array();
                 if (count($xml->xpath('person:relation[@xsi:nil="true"]')) === 0) {
                     foreach ($xrels as $x) {
                         $targuid = trim(strval($x->attributes()->targetguid));
                         $subguid = trim(strval($x->attributes()->subjectguid));
                         $rel = array("id" => trim(strval($x->attributes()->id)), "parentid" => trim(strval($x->attributes()->parentid)));
                         if ($targuid === "") {
                             $rel["subjectguid"] = $subguid;
                         } else {
                             if ($subguid === "") {
                                 $rel["targetguid"] = $targuid;
                             }
                         }
                         if ($rel["parentid"] === "") {
                             $rel["parentid"] = null;
                         }
                         $rels[] = $rel;
                     }
                 }
                 try {
                     $res = PersonRelations::syncRelations($p->guid, $this->_user->id, $rels);
                 } catch (Exception $ex) {
                     $res = $ex->getMessage();
                 }
                 if (is_string($res)) {
                     $this->_error = RestErrorEnum::RE_BACKEND_ERROR;
                     $this->_extError = $res;
                     return $p;
                 }
             }
         }
     }
     $this->_error = RestErrorEnum::RE_OK;
     return $person;
 }
Esempio n. 2
0
 public function updateAction()
 {
     $this->_helper->layout->disableLayout();
     $this->_helper->viewRenderer->setNoRender();
     $hasEditRights = false;
     $entries = new Default_Model_Researchers();
     if ($this->session->userid !== null) {
         // there is a user logged in
         $users = new Default_Model_Researchers();
         $users->filter->id->equals($this->session->userid);
         $user = $users->items[0];
         if ($_POST['id'] == '') {
             // logged in user registering another user (e.g. a manager registering someone else)
             if (userIsAdminOrManager($this->session->userid)) {
                 $entry = new Default_Model_Researcher();
                 //prepare new entry
                 $entry->dateInclusion = date("Y-m-d");
                 $entry->addedBy = $this->session->userid;
                 $hasEditRights = true;
             } else {
                 $hasEditRights = false;
             }
             // logged in user has no permission to register other users
         } else {
             $entry = $entries->item($_POST['id']);
             // this is an update, get existing data
             $hasEditRights = $user->privs->canEditPersonProfile($entry);
         }
     } else {
         if ($this->session->username !== null) {
             // no user logged in, but new user registering own self
             $entry = new Default_Model_Researcher();
             //prepare new entry
             $entry->dateInclusion = date("Y-m-d");
             $entry->username = $this->session->username;
             $entry->lastLogin = time();
             $entry->password = $this->session->claimPassword;
             setAuthCookies($this->session->username, $this->session->claimPassword);
             $this->session->claimPassword = null;
             $hasEditRights = true;
         }
     }
     if ($hasEditRights) {
         $entry->lastName = $_POST['lastName'];
         $entry->firstName = $_POST['firstName'];
         $entry->gender = $_POST['gender'];
         $entry->institution = $_POST['institution'];
         $oldCountryID = $entry->countryID;
         $entry->countryID = $_POST['countryID'];
         $oldRoleID = $entry->positionTypeID;
         $entry->positionTypeID = $_POST['positionTypeID'];
         if ($_POST['newimage'] !== "") {
             $imgfile = APPLICATION_PATH . "/../public/" . $_POST['newimage'];
             if (file_exists(APPLICATION_PATH . "/../cache/ppl-image-" . $entry->id . ".png")) {
                 unlink(APPLICATION_PATH . "/../cache/ppl-image-" . $entry->id . ".png");
             }
             $entry->image = pg_escape_bytea(base64_encode(file_get_contents($imgfile)));
         }
         if ($this->session->userid === null) {
             $entries->add($entry);
             $this->session->userid = $entry->id;
             $this->session->user = $entry;
             $this->session->fullname = $entry->firstname . " " . $entry->lastname;
         } else {
             if ($_POST['id'] == '') {
                 $entries->add($entry);
                 $this->session->lastPplID = $entry->id;
             } else {
                 $entry->save();
             }
         }
         $entries->filter->id->equals($entry->id);
         $found_new_entry = false;
         $search_new_entry_count = 0;
         while (!$found_new_entry || $search_new_entry_count > 10) {
             $entries->refresh();
             $found_new_entry = count($entries->items) > 0;
             if (!$found_new_entry) {
                 sleep(1);
             }
             $search_new_entry_count = $search_new_entry_count + 1;
         }
         if (!$found_new_entry) {
             error_log("Could not find new user entry in DB after 10 tries... This should not happen (userid: " . $entry->id . ")");
             return;
         }
         $entry = $entries->items[0];
         $ant = 'his/her';
         if (!isnull($entry->gender)) {
             if ($entry->gender == 'male') {
                 $ant = 'his';
             }
             if ($entry->gender == 'female') {
                 $ant = 'her';
             }
         }
         $conts = new Default_Model_Contacts();
         $conts->refresh();
         for ($i = count($entry->contacts) - 1; $i >= 0; $i--) {
             $conts->remove($entry->contacts[$i]);
         }
         foreach ($_POST as $key => $value) {
             if (substr($key, 0, 7) === "contact" && substr($key, 0, 11) !== "contactType") {
                 $cnum = substr($key, 7);
                 $cont = new Default_Model_Contact();
                 $cont->researcherID = $entry->id;
                 $cont->data = $value;
                 $cont->contactTypeID = $_POST['contactType' . $cnum];
                 $conts->add($cont);
             }
         }
     }
     if ($entry && ($this->session->userid == null || $this->session->userid == $entry->id)) {
         $this->session->userid = $entry->id;
         //Reload session data in case of claim or save new account
         $ppl = new Default_Model_Researchers();
         $ppl->filter->id->equals($this->session->userid);
         $user = $ppl->items[0];
         $this->session->user = $user;
         $this->session->fullname = $user->firstname . " " . $user->lastname;
         $this->session->userRole = $user->positionTypeID;
         $this->session->userCountryID = $user->countryID;
         $this->session->userCountryName = $user->country->name;
         $this->session->cname = $user->cname;
     }
 }