/** * Remove items of certain type and autho * * This method can be used to remove spam comments or attachments * * person - id of person who did the changes * data - date to with revert changes * delete_history (Default off) - Reverting can't be undone! The person's modification are lost forever! * This can be useful on massive changes to avoid sending huge * notification mails. */ function itemsRemoveMany() { global $PH; global $auth; $PH->go_submit = 'itemsRemoveManyPreview'; $page = new Page(); $page->cur_tab = 'home'; $page->title = __('Remove many items'); $page->title_minor = ''; echo new PageHeader(); echo new PageContentOpen(); require_once confGet('DIR_STREBER') . "render/render_form.inc.php"; $form = new PageForm(); $form->button_cancel = true; ### author $people = array(0 => 'anybody'); foreach (Person::getPeople() as $p) { $people[$p->id] = $p->nickname; } $form->add(new Form_Dropdown('person', __("Created by"), array_flip($people), 0)); $form->add(new Form_Checkbox('type_comment', __("Comments"), true)); $form->add(new Form_Checkbox('only_spam_comments', __("Only comments that look like spam"), true)); $form->add(new Form_Checkbox('type_task', __("Tasks"), false)); $form->add(new Form_Checkbox('type_topic', __("Topic"), false)); $form->add(new Form_DateTime('time_start', __('starting at', 'label for time filter'), getGMTString(time() - 7 * 24 * 60 * 60))); $form->add(new Form_DateTime('time_end', __('ending at', 'label for time filter'), getGMTString(time() + 60 * 60))); echo $form; echo new PageContentClose(); echo new PageHtmlEnd(); }
static function getFromItem($item) { ### get changes ### $all_changes = $all_changes = ItemChange::getItemChanges(array('item' => $item->id)); $versions = array(new ItemVersion(array('version_number' => 1, 'date_from' => $item->created, 'author' => $item->created_by))); $last_version = $versions[0]; $version_number = 2; $modified_last = NULL; foreach ($all_changes as $cf) { $flag_new = false; if ($cf->modified != $modified_last) { $flag_new = true; } if (isset($last_version) && $last_version->author != $cf->modified_by) { $flag_new; } if ($flag_new) { $version = new ItemVersion(array('version_number' => $version_number++, 'date_from' => $cf->modified, 'author' => $cf->modified_by)); $modified_last = $cf->modified; $versions[] = $version; $last_version = $versions[count($versions) - 2]; $last_version->date_to = $cf->modified; } $last_version->values[$cf->field] = $cf->value_old; #$versions[count($versions)-1]->values[$cf->field]= 'bla'; } ### finally fill out latest values ### if (count($versions) > 1) { foreach ($versions[count($versions) - 2]->values as $fname => $value) { $versions[count($versions) - 1]->values[$fname] = $item->{$fname}; } $versions[count($versions) - 1]->date_to = getGMTString(); ### fill in next values ### $changed = array(); foreach (array_reverse($versions) as $v) { foreach ($v->values as $name => $value) { if (isset($changed[$name])) { $v->values_next[$name] = $changed[$name]; } else { $v->values_next[$name] = $item->{$name}; } $changed[$name] = $value; } } } return $versions; }
/** * Mark all items of a person as been viewed @ingroup pages * * if an item is viewed (not changed) depends on two facts: * 1. item_person item exists * 2. item.modfied < person.date_highlight_changes */ function personAllItemsViewed() { global $PH; global $auth; $id = intval(getOnePassedId('person', 'people_*')); if ($id) { if ($id == $auth->cur_user->id) { $person = $auth->cur_user; } else { $person = Person::getEditableById($id); if (!$person) { $PH->abortWarning("Could not get object..."); } } } else { ### profile and login ### if ($auth->cur_user->user_rights & RIGHT_PERSON_EDIT_RIGHTS) { $person = $auth->cur_user; } else { $PH->abortWarning("Could not get object..."); } } $person->date_highlight_changes = getGMTString(); $person->update(array('date_highlight_changes'), false); /** * note, we have to update the current user to get an emmidate effect */ if ($auth->cur_user->id == $person->id) { $auth->cur_user->date_highlight_changes = getGMTString(); } new FeedbackMessage(sprintf(__("Marked all previous items as viewed."))); if (!$PH->showFromPage()) { $PH->show('personView', array('person' => $person->id)); } }
/** * mark_delete (sets object-state to -1) * * returns true on success */ public function delete() { global $auth; if (!$this->id) { trigger_error("Deleting requires id", E_USER_WARNING); } ### check user-rights ### if ($pp = $this->getProjectPerson()) { $pub_level = $this->pub_level; ### owned ### if ($this->created_by == $pp->person) { $pub_level = PUB_LEVEL_OWNED; } ### is item editable ? if ($pub_level >= $pp->level_delete) { ### AND below delete-level ### if ($pub_level >= $pp->level_delete) { $this->state = -1; $this->deleted_by = $auth->cur_user->id; $this->deleted = getGMTString(); $this->update(); #--- deleting yourself? ---- return true; } } } else { if ($this->project == 0) { if ($auth->cur_user) { $this->state = -1; $this->deleted_by = $auth->cur_user->id; $this->deleted = getGMTString(); $this->update(); return true; } else { return false; } } } return false; }
/** * Edit note on person * * @ingroup pages */ function taskNoteOnPersonEdit($task = NULL, $person = NULL) { global $PH; global $auth; global $g_pub_level_names; global $g_prio_names; if (!$task) { $id = getOnePassedId('tsk'); if (!($task = Task::getEditableById($id))) { $PH->abortWarning(__("Select a note to edit"), ERROR_NOTE); return; } } ## get person ## if (!$person) { $pid = getOnePassedId('person'); if (!($person = Person::getById($pid))) { $PH->abortWarning(__("ERROR: could not get Person"), ERROR_NOTE); return; } } $page = new Page(array('use_jscalendar' => false, 'autofocus_field' => 'task_name')); $page->cur_tab = 'people'; if ($person->id) { $page->crumbs = build_person_crumbs($person); } $page->crumbs[] = new NaviCrumb(array('target_id' => 'taskNoteOnPersonEdit')); $page->type = __("Note"); if (!$task->id) { $page->title = __('Create new note'); $page->title_minor = __('Edit'); ## default title ## $date = gmdate("Y-m-d", time()); $time = getGMTString(); $dt = $date . " " . renderTime($time); $task->name = sprintf(__("New Note on %s, %s"), $person->name, $dt); } ## eventually needed later when note is a subcategory of task /*else { $page->title=$task->name; $page->title_minor=$task->short; }*/ echo new PageHeader(); echo new PageContentOpen(); require_once confGet('DIR_STREBER') . 'render/render_form.inc.php'; $form = new PageForm(); $form->button_cancel = true; ## name field ## $form->add($task->fields['name']->getFormElement($task)); ## description field ## $e = $task->fields['description']->getFormElement($task); $e->rows = 22; $form->add($e); ### public-level drop down menu ### $form->add(new Form_Dropdown('task_pub_level', __("Publish to", "Form label"), array_flip($g_pub_level_names), $task->pub_level)); ## priority drop down menu## $form->add(new Form_Dropdown('task_prio', __("Prio", "Form label"), array_flip($g_prio_names), $task->prio)); if ($task->id == 0) { $proj_select = 0; } $p_list = array(); $count = 1; $p_projects = $person->getProjects(); $num = count($p_projects); if ($num > 0) { $p_list[0] = __('Assigned Projects'); foreach ($p_projects as $pp) { $p_list[$pp->id] = "- " . $pp->name; $count++; } } $p_companies = $person->getCompanies(); $num = count($p_companies); if ($num > 0) { $p_list['-1'] = __('Company Projects'); foreach ($p_companies as $pcs) { $c_id = $pcs->id; $c_projects = Project::getAll(array('company' => $c_id)); $count2 = 0; foreach ($c_projects as $cp) { $p_list[$cp->id] = "- " . $cp->name; } } } if (!($projects = Project::getAll(array('order_by' => 'name ASC')))) { } else { $p_list['-2'] = __('All other Projects'); foreach ($projects as $pj) { $p_list[$pj->id] = "- " . $pj->name; } } $form->add(new Form_Dropdown('project', __('For Project', 'form label'), array_flip($p_list), $proj_select, "id='proj_list'")); ## new project ## if ($task->id == 0) { $form->add(new Form_checkbox('new_project', __('New project', 'form label'), false, "id='proj_new_checkbox'")); $form->add(new Form_Input('new_project_name', __('Project name', 'form label'), false, NULL, false, "id='proj_new_input'", "style='display:none'")); } $checked1 = ""; $checked2 = ""; if ($task->id == 0) { $checked1 = "checked"; $checked2 = "checked"; $person_select = -1; } ## eventually needed later when note is a subcategory of task /*else { if(!$pperson = $task->getAssignedPeople()){ $PH->abortWarning(__("ERROR: could not get assigned people"), ERROR_NOTE); } else{ foreach($pperson as $pp){ if($pp->id == $person->id){ $checked1= "checked"; } elseif($pp->id == $auth->cur_user->id){ $checked2= "checked"; } else{ $person_select = $pp->id; } } } }*/ $form->add(new Form_customHTML('<p><label>' . __('Assign to') . '</lable></p>', 'assigne_note')); if ($person->id != $auth->cur_user->id) { $form->add(new Form_customHTML('<span class="checker"><input value="' . $person->id . '" name="task_assignement1" type="checkbox" ' . $checked1 . '><label for="task_assignement1">' . $person->name . '</label></span>', 'assigned_person1')); $form->add(new Form_customHTML('<span class="checker"><input value="' . $auth->cur_user->id . '" name="task_assignement2" type="checkbox" ' . $checked2 . '><label for="task_assignement2">' . $auth->cur_user->name . '</label></span>', 'assigned_person2')); } else { $form->add(new Form_customHTML('<span class="checker"><input value="' . $auth->cur_user->id . '" name="task_assignement2" type="checkbox" ' . $checked2 . '><label for="task_assignement2">' . $auth->cur_user->name . '</label></span>', 'assigned_person')); } $pers_list = array(); $pers_list[-1] = __('undefined'); if ($people = Person::getPeople(array('can_login' => 1))) { foreach ($people as $pers) { if ($auth->cur_user->name != $pers->name) { $pers_list[$pers->id] = $pers->name; } } } $form->add(new Form_Dropdown('task_also_assign', __('Also assign to'), array_flip($pers_list), $person_select)); ## Book effort after submit ## $form->form_options[] = "<span class=option><input id='book_effort' name='book_effort' class='checker' type=checkbox>" . __("Book effort after submit") . "</span>"; $form->add(new Form_HiddenField('tsk', '', $task->id)); $form->add(new Form_HiddenField('person_id', '', $person->id)); $form->add(new Form_HiddenField('creation_time', '', $time)); echo $form; $PH->go_submit = 'taskNoteOnPersonEditSubmit'; echo new PageContentClose(); echo new PageHtmlEnd(); }
function newEffortFromTimeTracking() { global $PH; global $auth; require_once confGet('DIR_STREBER') . 'db/class_effort.inc.php'; $time_end = intval(get('effort_end_seconds')); if ($time_end == 0) { $time_end = null; } $new_effort = new Effort(array('id' => 0, 'time_start' => getGMTString(get('effort_start_seconds')), 'time_end' => getGMTString($time_end), 'name' => get('description'), 'billing' => get('billing'), 'productivity' => get('productivity'))); ### get project ### $new_effort->project = get('effort_project_id'); if (!($project = Project::getVisibleById($new_effort->project))) { $PH->abortWarning(__("Could not get project of effort")); } if (!$project->isPersonVisibleTeamMember($auth->cur_user)) { $PH->abortWarning("ERROR: Insufficient rights"); } ### link to task ### $task_id = get('effort_task_id'); if (!(is_null($task_id) || $task_id == 0)) { if ($task_id == 0) { $new_effort->task = 0; } else { if ($task = Task::getVisibleById($task_id)) { $new_effort->task = $task->id; } } } else { if (get('task_name') != "") { ### create new task $newtask = new Task(array('id' => 0, 'name' => get('task_name'), 'project' => $project->id)); $newtask->insert(); $new_effort->task = $newtask->id; } } ### get person ### $new_effort->person = $auth->cur_user->id; ### go back to from if validation fails ### $failure = false; if (strToGMTime($new_effort->time_end) - strToGMTime($new_effort->time_start) < 0) { $failure = true; new FeedbackWarning(__("Cannot start before end.")); } ### write to db ### $new_effort->insert(); ### display taskView #### if (!$PH->showFromPage()) { $PH->show('projView', array('prj' => $effort->project)); } }
/** * converts a time in seconds from the client's timezone to database GMT-String */ function clientTimeToGMTString($time) { global $auth; $time_offset = 0; if (isset($auth->cur_user)) { $time_offset = $auth->cur_user->time_offset; } return getGMTString($time - $time_offset - confGet('SERVER_TIME_OFFSET')); }
/** * Logout the current user and remove cookies @ingroup pages */ function logout() { global $PH; global $auth; ### kill cookie ### $auth->removeUserCookie(); $PH->cur_page_md5 = NULL; /** * keep date of last logout * NOTE: the cur_user-object might be no longer up to date (think about person submit). * so we get the latest version from the database to update the last_login-field */ if ($cur_user = Person::getById($auth->cur_user->id)) { $cur_user->cookie_string = $auth->cur_user->calcCookieString(); $cur_user->last_logout = getGMTString(); $cur_user->update(); } ### go to login-page #### $PH->messages[] = "Logged out"; $PH->show('loginForm'); #header("location:index.php"); if ($auth->cur_user) { $nickname = $auth->cur_user->nickname; } else { $nickname = '_nobody_'; } log_message("'" . $nickname . "' logged out from:" . getServerVar("REMOTE_ADDR", true), LOG_MESSAGE_LOGOUT); require_once confGet('DIR_STREBER') . 'std/mail.inc.php'; Notifier::sendNotifications(); }
/** * submit changes to several bookmarks @ingroup pages */ function itemBookmarkEditMultipleSubmit() { global $PH; global $auth; ### cancel ? ### if (get('form_do_cancel')) { if (!$PH->showFromPage()) { $PH->show('home', array()); } exit; } $count = 0; $error = 0; $edit = 0; $bookmark_array = array(); $is_bookmark = array(); $number = get('number'); for ($i = 0; $i < $number; $i++) { $bm_id = intval(get('bookmark_id_' . $i)); $bm_item = intval(get('bookmark_item_' . $i)); $is_already_bookmark = intval(get('is_already_bookmark_' . $i)); $is_bookmark[$bm_id] = $is_already_bookmark; if ($bm_id != 0 && $is_already_bookmark) { if (!($bookmark = ItemPerson::getAll(array('id' => $bm_id, 'person' => $auth->cur_user->id, 'is_bookmark' => 1)))) { $error++; } else { $bookmark_array[] = $bookmark[0]; } } elseif ($bm_id != 0 && !$is_already_bookmark) { if (!($bookmark = ItemPerson::getAll(array('id' => $bm_id, 'person' => $auth->cur_user->id, 'is_bookmark' => 0)))) { $error++; } else { $bookmark_array[] = $bookmark[0]; } } elseif ($bm_id == 0) { $date = getGMTString(); $bookmark = new ItemPerson(array('id' => 0, 'item' => $bm_item, 'person' => $auth->cur_user->id, 'is_bookmark' => 1, 'created' => $date)); $bookmark_array[] = $bookmark; } } foreach ($bookmark_array as $bma) { #$change = false; ### notify on change ### $noc = intval(get('notify_on_change')); if (!is_null($noc) && $noc != -1 && $noc != $bma->notify_on_change) { $bma->notify_on_change = $noc; #$change= true; } ### notify if unchanged ### $niu = intval(get('notify_if_unchanged')); if (!is_null($niu) && $niu != -1 && $niu != $bma->notify_if_unchanged) { $bma->notify_if_unchanged = $niu; #$change= true; } #if($change){ if ($bma->id != 0 && $is_bookmark[$bma->id]) { $bma->update(); $edit++; } elseif ($bma->id != 0 && !$is_bookmark[$bma->id]) { $bma->is_bookmark = 1; $bma->created = getGMTString(); $bma->update(); $count++; } elseif ($bma->id == 0) { $bma->insert(); $count++; } #} } if ($count) { new FeedbackMessage(sprintf(__("Added %s bookmark(s)."), $count)); } if ($edit) { new FeedbackMessage(sprintf(__("Edited %s bookmark(s)."), $edit)); } if ($error) { new FeedbackWarning(sprintf(__('%s bookmark(s) could not be added.'), $error)); } ### display fromPage #### if (!$PH->showFromPage()) { $PH->show('home', array()); } }
/** * Submit data of a newly registered person @ingroup pages */ function personRegisterSubmit() { global $PH; global $auth; ### cancel ? ### if (get('form_do_cancel')) { if (!$PH->showFromPage()) { $PH->show('home', array()); } exit; } if (!validateFormCrc()) { $PH->abortWarning(__('Invalid checksum for hidden form elements')); } $person = new Person(array('id' => 0)); $person->user_rights = RIGHT_PERSON_EDIT_SELF; ### person category ### $pcategory = get('pcategory'); if ($pcategory != NULL) { if ($pcategory == -1) { $person->category = PCATEGORY_STAFF; } else { if ($pcategory == -2) { $person->category = PCATEGORY_CONTACT; } else { $person->category = $pcategory; } } } $flag_ok = true; # update valid? # retrieve all possible values from post-data # NOTE: # - this could be an security-issue. # - TODO: as some kind of form-edit-behaviour to field-definition foreach ($person->fields as $f) { $name = $f->name; $f->parseForm($person); } $person->can_login = 1; $period = get('person_notification_period'); ### turn off ### if ($period === 0 || $period === "0") { $person->settings &= USER_SETTING_NOTIFICATIONS ^ RIGHT_ALL; $person->notification_period = 0; } else { $person->settings |= USER_SETTING_NOTIFICATIONS; $person->notification_period = $period; if ($person->can_login && !$person->personal_email && !$person->office_email) { $flag_ok = false; $person->fields['office_email']->required = true; $person->fields['personal_email']->required = true; new FeedbackWarning(__("Sending notifactions requires an email-address.")); } } if (get('person_html_mail')) { $person->settings |= USER_SETTING_HTML_MAIL; } else { $person->settings &= USER_SETTING_HTML_MAIL ^ RIGHT_ALL; } $zone = get('person_time_zone'); if ($zone != NULL && $person->time_zone != 1.0 * $zone) { $person->time_zone = 1.0 * $zone; if ($zone == TIME_OFFSET_AUTO) { new FeedbackMessage(__("Using auto detection of time zone requires this user to relogin.")); } else { $person->time_offset = $zone * 60.0 * 60.0; if ($person->id == $auth->cur_user->id) { $auth->cur_user->time_offset = $zone * 60.0 * 60.0; } } } $theme = get('person_theme'); if ($theme != NULL) { $person->theme = $theme; ### update immediately / without page-reload #### if ($person->id == $auth->cur_user->id) { $auth->cur_user->theme = $theme; } } $language = get('person_language'); global $g_languages; if (isset($g_languages[$language])) { $person->language = $language; ### update immediately / without page-reload #### if ($person->id == $auth->cur_user->id) { $auth->cur_user->language = $language; setLang($language); } } if (!$person->name) { new FeedbackWarning(__("Login-accounts require a full name.")); $person->fields['name']->required = true; $person->fields['name']->invalid = true; $flag_ok = false; } if (!$person->office_email) { new FeedbackWarning(__("Please enter an e-mail address.")); $person->fields['office_email']->required = true; $person->fields['office_email']->invalid = true; $flag_ok = false; } $t_nickname = get('person_nickname'); if (!$person->nickname) { new FeedbackWarning(__("Login-accounts require a unique nickname")); $person->fields['nickname']->required = true; $person->fields['nickname']->invalid = true; $flag_ok = false; } ### check if changed nickname is unique if ($person->can_login || $person->nickname != "") { /** * \todo actually this should be mb_strtolower, but this is not installed by default */ if ($person->nickname != strtolower($person->nickname)) { new FeedbackMessage(__("Nickname has been converted to lowercase")); $person->nickname = strtolower($person->nickname); } if ($p2 = Person::getByNickname($t_nickname)) { # another person with this nick? if ($p2->id != $person->id) { new FeedbackWarning(__("Nickname has to be unique")); $person->fields['nickname']->required = true; $flag_ok = false; } } } ### password entered? ### $t_password1 = get('person_password1'); $t_password2 = get('person_password2'); $flag_password_ok = true; if (($t_password1 || $t_password2) && $t_password1 != "__dont_change__") { ### check if password match ### if ($t_password1 !== $t_password2) { new FeedbackWarning(__("Passwords do not match")); $person->fields['password']->required = true; $flag_ok = false; $flag_password_ok = false; $person->cookie_string = $auth->cur_user->calcCookieString(); } } ### check if password is good enough ### $password_length = strlen($t_password1); $password_count_numbers = strlen(preg_replace('/[\\d]/', '', $t_password1)); $password_count_special = strlen(preg_replace('/[\\w]/', '', $t_password1)); $password_value = -7 + $password_length + $password_count_numbers * 2 + $password_count_special * 4; if ($password_value < confGet('CHECK_PASSWORD_LEVEL')) { new FeedbackWarning(__("Password is too weak (please add numbers, special chars or length)")); $flag_ok = false; $flag_password_ok = false; } if ($flag_password_ok) { $person->password = md5($t_password1); } if (!validateFormCaptcha()) { new FeedbackWarning(__("Please copy the text from the image.")); $flag_ok = false; } ### repeat form if invalid data ### if (!$flag_ok) { $PH->show('personRegister', NULL, $person); exit; } /** * store indentifier-string for login from notification & reminder - mails */ $person->identifier = $person->calcIdentifierString(); ### insert new object ### if ($person->settings & USER_SETTING_NOTIFICATIONS && $person->can_login) { $person->settings |= USER_SETTING_SEND_ACTIVATION; new FeedbackHint(sprintf(__("A notification / activation will be mailed to <b>%s</b> when you log out."), $person->name) . " " . sprintf(__("Read more about %s."), $PH->getWikiLink('notifications'))); } $person->notification_last = getGMTString(time() - $person->notification_period * 60 * 60 * 24 - 1); $person->cookie_string = $person->calcCookieString(); if ($person->insert()) { new FeedbackHint(__("Thank you for registration! After your request has been approved by a moderator, you will can an email.")); ### link to a company ### if ($c_id = get('company')) { require_once confGet('DIR_STREBER') . 'db/class_company.inc.php'; if ($c = Company::getVisibleById($c_id)) { require_once confGet('DIR_STREBER') . 'db/class_employment.inc.php'; $e = new Employment(array('id' => 0, 'person' => $person->id, 'company' => $c->id)); $e->insert(); } } ## assigne to project ## require_once confGet('DIR_STREBER') . 'db/class_projectperson.inc.php'; $prj_num = confGet('REGISTER_NEW_USERS_TO_PROJECT'); global $g_user_profile_names; if (isset($prj_num)) { if ($prj_num != -1) { if ($p = Project::getVisibleById($prj_num)) { $prj_person = new ProjectPerson(array('person' => $person->id, 'project' => $p->id, 'name' => $g_user_profile_names[$person->profile])); $prj_person->insert(); } } } new FeedbackMessage(sprintf(__('Person %s created'), $person->getLink())); ### automatically login ### $foo = array('login_name' => $person->nickname, 'login_password_md5' => $person->password); addRequestVars($foo); $PH->show('loginFormSubmit', array()); exit; } else { new FeedbackError(__("Could not insert object")); } ### display fromPage #### if (!$PH->showFromPage()) { $PH->show('home', array()); } }
/** * renders a comparision between two versions of an item @ingroup pages */ function itemViewDiff() { global $PH; global $auth; require_once confGet('DIR_STREBER') . 'render/render_wiki.inc.php'; ### get task #### $item_id = get('item'); if (!($item = DbProjectItem::getObjectById($item_id))) { $PH->abortWarning("invalid item-id", ERROR_FATAL); } if (!($project = Project::getVisibleById($item->project))) { $PH->abortWarning("this item has an invalid project id", ERROR_DATASTRUCTURE); } require_once confGet('DIR_STREBER') . "db/db_itemchange.inc.php"; $versions = ItemVersion::getFromItem($item); $date1 = get('date1'); $date2 = get('date2'); if (!$date1) { #if(count($versions) > 1) { # if($auth->cur_user->last_logout < $versions[count($versions)-2]->date_to) # { # $date1 = $auth->cur_user->last_logout; # } # else { # $date1 = $versions[count($versions)-2]->date_from; # } #} #else { foreach (array_reverse($versions) as $v) { if ($v->author == $auth->cur_user->id) { $date1 = $v->date_from; break; } } #} } if (!$date2) { $date2 = getGMTString(); } $page = new Page(); $page->cur_tab = 'projects'; $page->crumbs = build_project_crumbs($project); $page->options = build_projView_options($project); $page->title = $item->name; $page->title_minor = __('changes'); $page->add_function(new PageFunction(array('target' => 'itemView', 'params' => array('item' => $item->id), 'icon' => 'edit', 'name' => __('View item')))); ### render title ### echo new PageHeader(); echo new PageContentOpen(); if ($date1 > $date2) { new FeedbackMessage(__("date1 should be smaller than date2. Swapped")); $t = $date1; $date1 = $date2; $date2 = $t; } if (count($versions) == 1) { echo __("item has not been edited history"); } else { $old_version = NULL; $version_right = NULL; $version_left = $versions[0]; foreach ($versions as $v) { if ($v->date_from <= $date1) { $version_left = $v; } if ($v->date_from >= $date2) { if (isset($version_right)) { if ($version_right->date_from > $v->date_from) { $version_right = $v; } } else { $version_right = $v; } } } if (!isset($version_right)) { $version_right = $versions[count($versions) - 1]; } $options_left = array(); $options_right = array(); ### list versions left ### for ($i = 0; $i < count($versions) - 1; $i++) { $v = $versions[$i]; if ($person = Person::getVisibleById($v->author)) { $author = $person->name; } else { $author = __('unknown'); } if ($v->version_number == $version_left->version_number) { $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $versions[$i]->date_to)); $name = ' v.' . $v->version_number . ' -- ' . $author . " -- " . $v->date_from; $options_left[] = "<option selected=1 value='" . $str_link . "'>" . $name . "</option>"; } else { if ($v->version_number > $version_left->version_number) { if ($v->version_number < $version_right->version_number) { $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $versions[$i]->date_to)); $name = '> v.' . $v->version_number . ' -- ' . $author . " -- " . renderDate($v->date_from); } else { $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $version_right->date_to)); $name = '>> v.' . $v->version_number . ' -- ' . $author . " -- " . renderDate($v->date_from); } $options_left[] = "<option value='" . $str_link . "'>" . $name . "</option>"; } else { $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $version_right->date_from)); $name = '< v.' . $v->version_number . ' -- ' . $author . " -- " . renderDate($v->date_from); $options_left[] = "<option value='" . $str_link . "'>" . $name . "</option>"; } } } ### list versions right ### for ($i = 1; $i < count($versions); $i++) { $v = $versions[$i]; if ($person = Person::getVisibleById($v->author)) { $author = $person->name; } else { $author = __('unknown'); } if ($v->version_number == $version_right->version_number) { $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $versions[$i]->date_to)); $name = ' v.' . $v->version_number . ' -- ' . $author . " -- " . $v->date_from; $options_right[] = "<option selected=1 value='" . $str_link . "'>" . $name . "</option>"; } else { if ($v->version_number > $version_right->version_number) { $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $version_left->date_from, 'date2' => $versions[$i]->date_from)); $name = '> v.' . $v->version_number . ' -- ' . $author . ' -- ' . renderDate($v->date_from); $options_right[] = "<option value='" . $str_link . "'>" . $name . "</option>"; } else { if ($v->version_number > $version_left->version_number) { $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $version_left->date_from, 'date2' => $versions[$i]->date_from)); $name = '< v.' . $v->version_number . ' -- ' . $author . " -- " . renderDate($v->date_from); } else { $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $versions[$i]->date_to)); $name = '<< v.' . $v->version_number . ' -- ' . $author . ' -- ' . renderDate($v->date_from); } $options_right[] = "<option value='" . $str_link . "'>" . $name . "</option>"; } } } ### prev ### if ($version_left->version_number > 1) { $link_prev = $PH->getLink('itemViewDiff', '<< ' . __('prev change'), array('item' => $item->id, 'date1' => $versions[$version_left->version_number - 2]->date_from, 'date2' => $versions[$version_left->version_number - 2]->date_to), NULL, true); } else { $link_prev = ''; } ### next ### if ($version_right->version_number < count($versions)) { $link_next = $PH->getLink('itemViewDiff', __('next') . '>>', array('item' => $item->id, 'date1' => $versions[$version_right->version_number - 1]->date_from, 'date2' => $versions[$version_right->version_number - 1]->date_to), NULL, true); } else { $link_next = ''; } ### summary ### $link_summary = $PH->getLink('itemViewDiff', __('summary'), array('item' => $item->id, 'date1' => $auth->cur_user->last_logout, 'date2' => getGMTString()), NULL, true); echo "<div class=diff>"; echo "<table class=nav><tr>"; echo "<td class=older>" . "<select onChange='location.href=this.options[this.selectedIndex].value'>" . join(array_reverse($options_left)) . "</select>" . '<br><b class=doclear></b>' . $link_prev . "</td>"; echo "<td class=newer>" . "<select onChange='location.href=this.options[this.selectedIndex].value'>" . join(array_reverse($options_right)) . "</select>" . '<br><b class=doclear></b>' . $link_next . $link_summary . "</td>"; echo "</table>"; #if(!$date2 || !$date1) { # echo sprintf(__("Item did not exists at %s"), renderTime($date2)); #} if ($old_version == $version_right) { echo sprintf(__('no changes between %s and %s'), renderTime($date1), renderTime($date2)); } ### collect changes ### $old_field_values = array(); $new_field_values = array(); foreach ($versions as $v) { if ($v->version_number <= $version_left->version_number) { foreach ($v->values as $name => $value) { $old_field_values[$name] = $value; } } if ($v->version_number >= $version_left->version_number && $v->version_number < $version_right->version_number) { foreach ($v->values_next as $name => $value) { $new_field_values[$name] = $value; } } } foreach ($new_field_values as $field_name => $value) { echo "<h2>{$field_name}</h2>"; $old_value = isset($old_field_values[$field_name]) ? $old_field_values[$field_name] : ""; $new_value = isset($new_field_values[$field_name]) ? $new_field_values[$field_name] : ''; $field_type = $item->fields[$field_name]->type; if ($field_type == 'FieldText') { echo render_changes($old_value, $new_value); } else { if ($field_type == 'FieldOption') { if ($field_name == 'status') { global $g_status_names; $old_value = isset($g_status_names[$old_value]) ? $g_status_names[$old_value] : __('undefined'); $new_value = isset($g_status_names[$new_value]) ? $g_status_names[$new_value] : __('undefined'); } else { if ($field_name == 'label') { if ($project = Project::getVisibleById($item->project)) { $labels = explode(",", $project->labels); $old_value = isset($labels[$old_value - 1]) ? $labels[$old_value - 1] : __('undefined'); $new_value = isset($labels[$new_value - 1]) ? $labels[$new_value - 1] : __('undefined'); } } } echo render_changes($old_value, $new_value); } else { if ($field_type == 'FieldInternal') { if ($field_name == 'parent_item') { if ($task_parent_old = Task::getVisibleById($old_value)) { $ar = array(); foreach ($task_parent_old->getFolder() as $f) { $ar[] = $f->name; } $ar[] = $task_parent_old->name; $old_value = join($ar, " > "); } if ($task_parent_new = Task::getVisibleById($new_value)) { $ar = array(); foreach ($task_parent_new->getFolder() as $f) { $ar[] = $f->name; } $ar[] = $task_parent_new->name; $new_value = join($ar, " > "); } } else { if ($field_name == 'state') { $old_value = $old_value == -1 ? __('deleted') : __('ok'); $new_value = $new_value == -1 ? __('deleted') : __('ok'); } else { if ($field_name == 'pub_level') { global $g_pub_level_names; $old_value = isset($g_pub_level_names[$old_value]) ? $g_pub_level_names[$old_value] : __('undefined'); $new_value = isset($g_pub_level_names[$new_value]) ? $g_pub_level_names[$new_value] : __('undefined'); } } } echo render_changes($old_value, $new_value); } else { if ($field_type == 'FieldPercentage') { echo render_changes($old_value, $new_value); } else { if ($field_type == 'FieldInt') { echo render_changes($old_value, $new_value); } else { if ($field_type == 'FieldString') { echo render_changes($old_value, $new_value); } else { if ($field_type == 'FieldDate') { echo render_changes(renderDate($old_value), renderDate($new_value)); } else { if ($field_type == 'FieldDatetime') { echo render_changes(renderTimestamp($old_value), renderTimestamp($new_value)); } } } } } } } } } } echo "</div>"; echo new PageContentClose(); echo new PageHtmlEnd(); }
/** * Show an RSS Feed of the latest changes on a project @ingroup pages */ function projViewAsRSS() { require_once confGet('DIR_STREBER') . "std/class_rss.inc.php"; global $PH; global $auth; $project_id = getOnePassedId('prj', 'projects_*'); # aborts on failure if (!($project = Project::getVisibleById($project_id))) { echo "Project is not readable. Anonymous user active?"; exit; } ### used cached? ### $filepath = "_rss/proj_{$project->id}.xml"; if (file_exists($filepath) || getGMTString(filemtime($filepath)) . "<" . $project->modified) { RSS::updateRSS($project); } readfile_chunked($filepath); exit; }
/** * perform login for user/password * * - on success: * - sets current_user * - set cookie * - return current user * * @return false if login wasn't successfull */ public function tryLoginUser($name, $password_md5) { log_message("tryLoginUser()", LOG_MESSAGE_DEBUG); if (!($user = Person::getByNickname($name))) { log_message("login failed, unknown person '{$name}' from " . getServerVar('REMOTE_ADDR', true), LOG_MESSAGE_LOGIN_FAILURE); return false; } if ($user->state != ITEM_STATE_OK) { log_message("login failed, deleted person '{$name}'/ from " . getServerVar('REMOTE_ADDR', true), LOG_MESSAGE_LOGIN_FAILURE); return false; } if (!$user->can_login) { log_message("login failed, person '{$name}' without account / from " . getServerVar('REMOTE_ADDR', true), LOG_MESSAGE_LOGIN_FAILURE); return false; } if (!$user instanceof Person) { return false; } if ($user->password != $password_md5) { log_message("login failed, wrong password for person '{$name}' / from " . getServerVar('REMOTE_ADDR', true), LOG_MESSAGE_LOGIN_FAILURE); return false; } $this->cur_user = $user; /** * if cookie-string is empty add appropriate setting * - actually this is only good for providing the first admin-user * a valid cookie setting. This can not be done in install because * we can't use Person->calcCookieString() from there. * * If users should keep login across sessions (on different computers * or IP-Adresses), calcCookieString must NOT be called here, because * it uses Time and Random. * * However, when the user is loggin out, the cookieString should be randomized. * This make all stored cookies invalid. */ if (confGet('CHECK_IP_ADDRESS') || $this->cur_user->cookie_string == "" || $this->cur_user->cookie_string == "0") { log_message("tryLoginUser()->calcCookieString()", LOG_MESSAGE_DEBUG); $this->cur_user->cookie_string = $this->cur_user->calcCookieString(); log_message("cookie is (" . $this->cur_user->cookie_string . ")", LOG_MESSAGE_DEBUG); } $this->cur_user->ip_address = asCleanString(getServerVar('REMOTE_ADDR', true)); /** * guess time client time offset to gmt in seconds */ if ($this->cur_user->time_zone == TIME_OFFSET_AUTO) { ### store date-offsetset for this user ### if ($time_offset = get('user_timeoffset')) { list($hour, $min, $sec) = explode(':', $time_offset); $client_day_seconds = $hour * 60 * 60 + $min * 60 + $sec; ### get servertime ### if ($t = get('edit_request_time')) { $t = get('edit_request_time'); } else { $t = time(); } list($hour, $min, $sec) = explode(':', gmdate('H:i:s', $t)); $server_day_seconds = $hour * 60 * 60 + $min * 60 + $sec; $offset = $server_day_seconds - $client_day_seconds; if ($offset < -12 * 60 * 60) { $offset += 24 * 60 * 60; } else { if ($offset > 12 * 60 * 60) { $offset -= 24 * 60 * 60; } } $offset *= -1; if (confGet('ROUND_AUTO_DETECTED_TIME_OFFSET')) { $offset = intval(($offset + 30 * 60) / 60 / 60) * 60 * 60; } $this->cur_user->time_offset = $offset; log_message("usertime offset = {$offset} sec", LOG_MESSAGE_LOGIN_SUCCESS); } else { new FeedbackWarning(__("Unable to automatically detect client time zone")); } } else { $this->cur_user->time_offset = $this->cur_user->time_zone * 60.0 * 60.0; } /** * update user */ log_message("tryLoginUser()->update cur_user", LOG_MESSAGE_DEBUG); $this->cur_user->last_login = getGMTString(); $this->cur_user->update(array('last_login', 'cookie_string', 'ip_address', 'time_offset'), false); log_message("tryLoginUser()->success", LOG_MESSAGE_DEBUG); log_message("'{$name}' logged in from " . getServerVar('REMOTE_ADDR', true), LOG_MESSAGE_LOGIN_SUCCESS); return $user; }
/** * Submit changes to an effort @ingroup pages */ function effortEditSubmit() { global $PH; global $auth; ### Validate form crc if (!validateFormCrc()) { $PH->abortWarning(__('Invalid checksum for hidden form elements')); } ### get effort #### $id = getOnePassedId('effort'); if ($id == 0) { $effort = new Effort(array('id' => 0)); } else { $effort = Effort::getEditableById($id); if (!$effort) { $PH->abortWarning(__("Could not get effort")); return; } $effort->validateEditRequestTime(); } ### cancel ### if (get('form_do_cancel')) { if (!$PH->showFromPage()) { $PH->show('projView', array('prj' => $effort->project)); } exit; } ### get project ### $effort->project = get('effort_project'); if (!($project = Project::getVisibleById($effort->project))) { $PH->abortWarning(__("Could not get project of effort")); } if (!$project->isPersonVisibleTeamMember($auth->cur_user)) { $PH->abortWarning("ERROR: Insufficient rights"); } ### get person ### if ($effort->person = get('effort_person')) { if (!($person = Person::getVisibleById($effort->person))) { $PH->abortWarning(__("Could not get person of effort")); } } # retrieve all possible values from post-data # NOTE: # - this could be an security-issue. # - TODO: as some kind of form-edit-behaviour to field-definition foreach ($effort->fields as $f) { $name = $f->name; $f->parseForm($effort); } ### times as duration ### if ($as_duration = get('effort_as_duration')) { $effort->as_duration = $as_duration; ### make sure day of time_end stays the same if date changes... ### if (($time_start = $effort->time_start) && ($time_end = $effort->time_end)) { $effort->time_end = gmdate("Y-m-d", strToClientTime($time_end)) . " " . gmdate("H:i:s", strToClientTime($time_end)); $effort->time_start = gmdate("Y-m-d", strToClientTime($time_end)) . " " . gmdate("00:00:00", strToClientTime($time_end)); } else { trigger_error("Getting time_start and time_end failed", E_USER_WARNING); } } ### pub level ### if ($pub_level = get('effort_pub_level')) { ### not a new effort ### if ($effort->id) { if ($pub_level > $effort->getValidUserSetPublicLevels()) { $PH->abortWarning('invalid data', ERROR_RIGHTS); } } #else { # #@@@ check for person create rights #} $effort->pub_level = $pub_level; } ## effort status ## if ($effort_status = get('effort_status')) { $effort->status = $effort_status; } if ($effort_billing = get('effort_billing')) { $effort->billing = intval($effort_billing); } if ($effort_productivity = get('effort_productivity')) { $effort->productivity = intval($effort_productivity); } ### link to task ### $task_id = get('effort_task'); if (!is_null($task_id)) { if ($task_id == 0) { $effort->task = 0; } else { if ($task = Task::getVisibleById($task_id)) { $effort->task = $task->id; } } } ### go back to from if validation fails ### $failure = false; if (!$effort->name) { $failure = true; new FeedbackWarning(__("Name required")); } if (strToGMTime($effort->time_end) - strToGMTime($effort->time_start) < 0) { $failure = true; new FeedbackWarning(__("Cannot start before end.")); } ### validation of the Datetime fields### if (!$as_duration) { if (strToGMTime($effort->time_start) == 0) { $failure = true; $name = $effort->fields['time_start']->name; $field_id = $effort->_type . '_' . $name; $value_time = get($field_id . '_time'); new FeedbackWarning(sprintf(__("<b>%s</b> is not a valid value for start time."), $value_time)); $effort->time_start = getGMTString(); } if (strToGMTime($effort->time_end) == 0) { $failure = true; $name = $effort->fields['time_end']->name; $field_id = $effort->_type . '_' . $name; $value_time = get($field_id . '_time'); new FeedbackWarning(sprintf(__("<b>%s</b> is not a valid value for end time."), $value_time)); $effort->time_end = getGMTString(); } } else { ##As duration if (strToGMTime($effort->time_end) == 0) { $failure = true; $name = $effort->fields['time_end']->name; $field_id = $effort->_type . '_' . $name; $value_time = get($field_id . '_time'); new FeedbackWarning(sprintf(__("<b>%s</b> is not a valid value for hours."), $value_time)); $effort->time_end = gmdate("Y-m-d", time()) . " 00:00:00"; } } if ($failure) { $PH->show('effortEdit', NULL, $effort); exit; } ### write to db ### if ($effort->id == 0) { $effort->insert(); } else { $effort->update(); } ### display taskView #### if (!$PH->showFromPage()) { $PH->show('projView', array('prj' => $effort->project)); } }
public function getQuerryAttributes() { $a = array(); if ($this->active) { if ($this->value) { $a['date_min'] = getGMTString(time() - $this->value); } } return $a; }