X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FProfile.php;h=85af2030013b7ba6d85b0b99f2c6c19e471bbcdd;hb=72a3ab6382551811f22391b7e82e7398628b235b;hp=a1e97d1ee464273aea874fb902eda9da976ff3f9;hpb=13a91e63aa5896014a010d30f4070f475306a397;p=friendica.git diff --git a/src/Model/Profile.php b/src/Model/Profile.php index a1e97d1ee4..85af203001 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -1,6 +1,6 @@ getQueryString(), Logger::DEBUG); + Logger::info('profile error: ' . DI::args()->getQueryString()); return []; } @@ -361,7 +364,7 @@ class Profile } // Fetch the account type - $account_type = Contact::getAccountType($profile); + $account_type = Contact::getAccountType($profile['account-type']); if (!empty($profile['address']) || !empty($profile['location'])) { $location = DI::l10n()->t('Location:'); @@ -406,7 +409,7 @@ class Profile } if (!$block && $show_contacts) { - $contact_block = ContactBlock::getHTML($profile); + $contact_block = ContactBlock::getHTML($profile, local_user()); if (is_array($profile) && !$profile['hide-friends']) { $contact_count = DBA::count('contact', [ @@ -441,7 +444,7 @@ class Profile $p['address'] = BBCode::convertForUriId($profile['uri-id'] ?? 0, $p['address']); } - $p['photo'] = Contact::getAvatarUrlForId($cid, ProxyUtils::SIZE_SMALL); + $p['photo'] = Contact::getAvatarUrlForId($cid, Proxy::SIZE_SMALL); $p['url'] = Contact::magicLinkById($cid, $profile['url']); @@ -476,13 +479,19 @@ class Profile return $o; } - public static function getBirthdays() + /** + * Returns the upcoming birthdays of contacts of the current user as HTML content + * + * @return string The upcoming birthdays (HTML) + * + * @throws HTTPException\InternalServerErrorException + * @throws HTTPException\ServiceUnavailableException + * @throws \ImagickException + */ + public static function getBirthdays(): string { - $a = DI::app(); - $o = ''; - if (!local_user() || DI::mode()->isMobile() || DI::mode()->isMobile()) { - return $o; + return ''; } /* @@ -492,13 +501,12 @@ class Profile * return $o; */ - $bd_format = DI::l10n()->t('g A l F d'); // 8 AM Friday January 18 $bd_short = DI::l10n()->t('F d'); - $cachekey = 'get_birthdays:' . local_user(); - $r = DI::cache()->get($cachekey); - if (is_null($r)) { - $s = DBA::p( + $cacheKey = 'get_birthdays:' . local_user(); + $events = DI::cache()->get($cacheKey); + if (is_null($events)) { + $result = DBA::p( "SELECT `event`.*, `event`.`id` AS `eid`, `contact`.* FROM `event` INNER JOIN `contact` ON `contact`.`id` = `event`.`cid` @@ -509,67 +517,68 @@ class Profile AND NOT `contact`.`archive` AND NOT `contact`.`deleted` WHERE `event`.`uid` = ? AND `type` = 'birthday' AND `start` < ? AND `finish` > ? - ORDER BY `start` ASC ", + ORDER BY `start`", Contact::SHARING, Contact::FRIEND, local_user(), DateTimeFormat::utc('now + 6 days'), DateTimeFormat::utcNow() ); - if (DBA::isResult($s)) { - $r = DBA::toArray($s); - DI::cache()->set($cachekey, $r, Duration::HOUR); + if (DBA::isResult($result)) { + $events = DBA::toArray($result); + DI::cache()->set($cacheKey, $events, Duration::HOUR); } } - $total = 0; - $classtoday = ''; - if (DBA::isResult($r)) { - $now = strtotime('now'); + $total = 0; + $classToday = ''; + $tpl_events = []; + if (DBA::isResult($events)) { + $now = strtotime('now'); $cids = []; - $istoday = false; - foreach ($r as $rr) { - if (strlen($rr['name'])) { - $total ++; + $isToday = false; + foreach ($events as $event) { + if (strlen($event['name'])) { + $total++; } - if ((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now)) { - $istoday = true; + if ((strtotime($event['start'] . ' +00:00') < $now) && (strtotime($event['finish'] . ' +00:00') > $now)) { + $isToday = true; } } - $classtoday = $istoday ? ' birthday-today ' : ''; + $classToday = $isToday ? ' birthday-today ' : ''; if ($total) { - foreach ($r as &$rr) { - if (!strlen($rr['name'])) { + foreach ($events as $event) { + if (!strlen($event['name'])) { continue; } // avoid duplicates - - if (in_array($rr['cid'], $cids)) { + if (in_array($event['cid'], $cids)) { continue; } - $cids[] = $rr['cid']; + $cids[] = $event['cid']; - $today = (((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now)) ? true : false); + $today = (strtotime($event['start'] . ' +00:00') < $now) && (strtotime($event['finish'] . ' +00:00') > $now); - $rr['link'] = Contact::magicLinkById($rr['cid']); - $rr['title'] = $rr['name']; - $rr['date'] = DI::l10n()->getDay(DateTimeFormat::convert($rr['start'], $a->getTimeZone(), 'UTC', $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . DI::l10n()->t('[today]') : ''); - $rr['startime'] = null; - $rr['today'] = $today; + $tpl_events[] = [ + 'id' => $event['id'], + 'link' => Contact::magicLinkById($event['cid']), + 'title' => $event['name'], + 'date' => DI::l10n()->getDay(DateTimeFormat::local($event['start'], $bd_short)) . (($today) ? ' ' . DI::l10n()->t('[today]') : '') + ]; } } } $tpl = Renderer::getMarkupTemplate('birthdays_reminder.tpl'); return Renderer::replaceMacros($tpl, [ - '$classtoday' => $classtoday, - '$count' => $total, + '$classtoday' => $classToday, + '$count' => $total, '$event_reminders' => DI::l10n()->t('Birthday Reminders'), - '$event_title' => DI::l10n()->t('Birthdays this week:'), - '$events' => $r, - '$lbr' => '{', // raw brackets mess up if/endif macro processing - '$rbr' => '}' + '$event_title' => DI::l10n()->t('Birthdays this week:'), + '$events' => $tpl_events, + '$lbr' => '{', // raw brackets mess up if/endif macro processing + '$rbr' => '}' ]); } @@ -614,8 +623,8 @@ class Profile $total++; } - $strt = DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->getTimeZone() : 'UTC', 'UTC', 'Y-m-d'); - if ($strt === DateTimeFormat::timezoneNow($a->getTimeZone(), 'Y-m-d')) { + $strt = DateTimeFormat::local($rr['start'], 'Y-m-d'); + if ($strt === DateTimeFormat::localNow('Y-m-d')) { $istoday = true; } @@ -630,17 +639,17 @@ class Profile $description = DI::l10n()->t('[No description]'); } - $strt = DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->getTimeZone() : 'UTC'); + $strt = DateTimeFormat::local($rr['start']); - if (substr($strt, 0, 10) < DateTimeFormat::timezoneNow($a->getTimeZone(), 'Y-m-d')) { + if (substr($strt, 0, 10) < DateTimeFormat::localNow('Y-m-d')) { continue; } - $today = ((substr($strt, 0, 10) === DateTimeFormat::timezoneNow($a->getTimeZone(), 'Y-m-d')) ? true : false); + $today = substr($strt, 0, 10) === DateTimeFormat::localNow('Y-m-d'); $rr['title'] = $title; $rr['description'] = $description; - $rr['date'] = DI::l10n()->getDay(DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->getTimeZone() : 'UTC', 'UTC', $bd_format)) . (($today) ? ' ' . DI::l10n()->t('[today]') : ''); + $rr['date'] = DI::l10n()->getDay(DateTimeFormat::local($rr['start'], $bd_format)) . (($today) ? ' ' . DI::l10n()->t('[today]') : ''); $rr['startime'] = $strt; $rr['today'] = $today; @@ -705,27 +714,27 @@ class Profile // Try to find the public contact entry of the visitor. $cid = Contact::getIdForURL($my_url); if (!$cid) { - Logger::log('No contact record found for ' . $my_url, Logger::DEBUG); + Logger::info('No contact record found for ' . $my_url); return; } $contact = DBA::selectFirst('contact',['id', 'url'], ['id' => $cid]); if (DBA::isResult($contact) && remote_user() && remote_user() == $contact['id']) { - Logger::log('The visitor ' . $my_url . ' is already authenticated', Logger::DEBUG); + Logger::info('The visitor ' . $my_url . ' is already authenticated'); return; } // Avoid endless loops $cachekey = 'zrlInit:' . $my_url; if (DI::cache()->get($cachekey)) { - Logger::log('URL ' . $my_url . ' already tried to authenticate.', Logger::DEBUG); + Logger::info('URL ' . $my_url . ' already tried to authenticate.'); return; } else { DI::cache()->set($cachekey, true, Duration::MINUTE); } - Logger::log('Not authenticated. Invoking reverse magic-auth for ' . $my_url, Logger::DEBUG); + Logger::info('Not authenticated. Invoking reverse magic-auth for ' . $my_url); // Remove the "addr" parameter from the destination. It is later added as separate parameter again. $addr_request = 'addr=' . urlencode($addr); @@ -742,9 +751,9 @@ class Profile $magic_path = $basepath . '/magic' . '?owa=1&dest=' . $dest . '&' . $addr_request; // We have to check if the remote server does understand /magic without invoking something - $serverret = DI::httpClient()->get($basepath . '/magic'); + $serverret = DI::httpClient()->head($basepath . '/magic', [HttpClientOptions::ACCEPT_CONTENT => HttpClient::ACCEPT_HTML]); if ($serverret->isSuccess()) { - Logger::log('Doing magic auth for visitor ' . $my_url . ' to ' . $magic_path, Logger::DEBUG); + Logger::info('Doing magic auth for visitor ' . $my_url . ' to ' . $magic_path); System::externalRedirect($magic_path); } } @@ -844,7 +853,7 @@ class Profile info(DI::l10n()->t('OpenWebAuth: %1$s welcomes %2$s', DI::baseUrl()->getHostname(), $visitor['name'])); - Logger::log('OpenWebAuth: auth success from ' . $visitor['addr'], Logger::DEBUG); + Logger::info('OpenWebAuth: auth success from ' . $visitor['addr']); } public static function zrl($s, $force = false) @@ -936,4 +945,86 @@ class Profile return ['total' => $total, 'entries' => $profiles]; } + + /** + * Migrates a legacy profile to the new slimmer profile with extra custom fields. + * Multi profiles are converted to ACl-protected custom fields and deleted. + * + * @param array $profile One profile array + * @throws \Exception + */ + public static function migrate(array $profile) + { + // Already processed, aborting + if ($profile['is-default'] === null) { + return; + } + + $contacts = []; + + if (!$profile['is-default']) { + $contacts = Contact::selectToArray(['id'], [ + 'uid' => $profile['uid'], + 'profile-id' => $profile['id'] + ]); + if (!count($contacts)) { + // No contact visibility selected defaults to user-only permission + $contacts = Contact::selectToArray(['id'], ['uid' => $profile['uid'], 'self' => true]); + } + } + + $permissionSet = DI::permissionSet()->selectOrCreate( + new PermissionSet( + $profile['uid'], + array_column($contacts, 'id') ?? [] + ) + ); + + $order = 1; + + $custom_fields = [ + 'hometown' => DI::l10n()->t('Hometown:'), + 'marital' => DI::l10n()->t('Marital Status:'), + 'with' => DI::l10n()->t('With:'), + 'howlong' => DI::l10n()->t('Since:'), + 'sexual' => DI::l10n()->t('Sexual Preference:'), + 'politic' => DI::l10n()->t('Political Views:'), + 'religion' => DI::l10n()->t('Religious Views:'), + 'likes' => DI::l10n()->t('Likes:'), + 'dislikes' => DI::l10n()->t('Dislikes:'), + 'pdesc' => DI::l10n()->t('Title/Description:'), + 'summary' => DI::l10n()->t('Summary'), + 'music' => DI::l10n()->t('Musical interests'), + 'book' => DI::l10n()->t('Books, literature'), + 'tv' => DI::l10n()->t('Television'), + 'film' => DI::l10n()->t('Film/dance/culture/entertainment'), + 'interest' => DI::l10n()->t('Hobbies/Interests'), + 'romance' => DI::l10n()->t('Love/romance'), + 'work' => DI::l10n()->t('Work/employment'), + 'education' => DI::l10n()->t('School/education'), + 'contact' => DI::l10n()->t('Contact information and Social Networks'), + ]; + + foreach ($custom_fields as $field => $label) { + if (!empty($profile[$field]) && $profile[$field] > DBA::NULL_DATE && $profile[$field] > DBA::NULL_DATETIME) { + DI::profileField()->save(DI::profileFieldFactory()->createFromValues( + $profile['uid'], + $order, + trim($label, ':'), + $profile[$field], + $permissionSet + )); + } + + $profile[$field] = null; + } + + if ($profile['is-default']) { + $profile['profile-name'] = null; + $profile['is-default'] = null; + DBA::update('profile', $profile, ['id' => $profile['id']]); + } else if (!empty($profile['id'])) { + DBA::delete('profile', ['id' => $profile['id']]); + } + } }