places: support user lang
Signed-off-by: Varun Patil <varunpatil@ucla.edu>pull/563/head
parent
3b24a62ba0
commit
2453aad507
|
@ -69,7 +69,7 @@ class PlacesBackend extends Backend
|
||||||
|
|
||||||
// SELECT location name and count of photos
|
// SELECT location name and count of photos
|
||||||
$count = $query->func()->count($query->createFunction('DISTINCT m.fileid'), 'count');
|
$count = $query->func()->count($query->createFunction('DISTINCT m.fileid'), 'count');
|
||||||
$query->select('e.osm_id', 'e.name', $count)->from('memories_planet', 'e');
|
$query->select('e.osm_id', 'e.name', 'e.other_names', $count)->from('memories_planet', 'e');
|
||||||
|
|
||||||
// WHERE these are not special clusters (e.g. timezone)
|
// WHERE these are not special clusters (e.g. timezone)
|
||||||
$query->where($query->expr()->gt('e.admin_level', $query->createNamedParameter(0)));
|
$query->where($query->expr()->gt('e.admin_level', $query->createNamedParameter(0)));
|
||||||
|
@ -84,7 +84,7 @@ class PlacesBackend extends Backend
|
||||||
$query = $this->tq->joinFilecache($query);
|
$query = $this->tq->joinFilecache($query);
|
||||||
|
|
||||||
// GROUP and ORDER by tag name
|
// GROUP and ORDER by tag name
|
||||||
$query->groupBy('e.osm_id', 'e.name');
|
$query->groupBy('e.osm_id', 'e.name', 'e.other_names');
|
||||||
$query->orderBy($query->createFunction('LOWER(e.name)'), 'ASC');
|
$query->orderBy($query->createFunction('LOWER(e.name)'), 'ASC');
|
||||||
$query->addOrderBy('e.osm_id'); // tie-breaker
|
$query->addOrderBy('e.osm_id'); // tie-breaker
|
||||||
|
|
||||||
|
@ -92,9 +92,11 @@ class PlacesBackend extends Backend
|
||||||
$places = $this->tq->executeQueryWithCTEs($query)->fetchAll();
|
$places = $this->tq->executeQueryWithCTEs($query)->fetchAll();
|
||||||
|
|
||||||
// Post process
|
// Post process
|
||||||
|
$lang = Util::getUserLang();
|
||||||
foreach ($places as &$row) {
|
foreach ($places as &$row) {
|
||||||
$row['osm_id'] = (int) $row['osm_id'];
|
$row['osm_id'] = (int) $row['osm_id'];
|
||||||
$row['count'] = (int) $row['count'];
|
$row['count'] = (int) $row['count'];
|
||||||
|
self::choosePlaceLang($row, $lang);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $places;
|
return $places;
|
||||||
|
@ -128,4 +130,21 @@ class PlacesBackend extends Backend
|
||||||
// FETCH tag photos
|
// FETCH tag photos
|
||||||
return $this->tq->executeQueryWithCTEs($query)->fetchAll() ?: [];
|
return $this->tq->executeQueryWithCTEs($query)->fetchAll() ?: [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Choose the best name for the place.
|
||||||
|
*/
|
||||||
|
public static function choosePlaceLang(array &$place, string $lang): array
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$otherNames = json_decode($place['other_names'], true);
|
||||||
|
if (isset($otherNames[$lang])) {
|
||||||
|
$place['name'] = $otherNames[$lang];
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
unset($place['other_names']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $place;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,6 +144,7 @@ class PlacesSetup extends Command
|
||||||
'osm_id' => $query->createParameter('osm_id'),
|
'osm_id' => $query->createParameter('osm_id'),
|
||||||
'admin_level' => $query->createParameter('admin_level'),
|
'admin_level' => $query->createParameter('admin_level'),
|
||||||
'name' => $query->createParameter('name'),
|
'name' => $query->createParameter('name'),
|
||||||
|
'other_names' => $query->createParameter('other_names'),
|
||||||
])
|
])
|
||||||
;
|
;
|
||||||
$insertPlace = $this->connection->prepare($query->getSQL());
|
$insertPlace = $this->connection->prepare($query->getSQL());
|
||||||
|
@ -200,6 +201,7 @@ class PlacesSetup extends Command
|
||||||
$adminLevel = $data['admin_level'];
|
$adminLevel = $data['admin_level'];
|
||||||
$name = $data['name'];
|
$name = $data['name'];
|
||||||
$boundaries = $data['geometry'];
|
$boundaries = $data['geometry'];
|
||||||
|
$otherNames = json_encode($data['other_names'] ?? []);
|
||||||
|
|
||||||
// Skip some places
|
// Skip some places
|
||||||
if ($adminLevel > -2 && ($adminLevel <= 1 || $adminLevel >= 10)) {
|
if ($adminLevel > -2 && ($adminLevel <= 1 || $adminLevel >= 10)) {
|
||||||
|
@ -213,6 +215,7 @@ class PlacesSetup extends Command
|
||||||
$insertPlace->bindValue('osm_id', $osmId);
|
$insertPlace->bindValue('osm_id', $osmId);
|
||||||
$insertPlace->bindValue('admin_level', $adminLevel);
|
$insertPlace->bindValue('admin_level', $adminLevel);
|
||||||
$insertPlace->bindValue('name', $name);
|
$insertPlace->bindValue('name', $name);
|
||||||
|
$insertPlace->bindValue('other_names', $otherNames);
|
||||||
$insertPlace->execute();
|
$insertPlace->execute();
|
||||||
|
|
||||||
// Insert polygons into database
|
// Insert polygons into database
|
||||||
|
|
|
@ -4,6 +4,8 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace OCA\Memories\Db;
|
namespace OCA\Memories\Db;
|
||||||
|
|
||||||
|
use OCA\Memories\ClustersBackend\PlacesBackend;
|
||||||
|
use OCA\Memories\Util;
|
||||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||||
use OCP\IDBConnection;
|
use OCP\IDBConnection;
|
||||||
|
|
||||||
|
@ -56,6 +58,7 @@ trait TimelineQuerySingleItem
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get exif if needed
|
||||||
$exif = [];
|
$exif = [];
|
||||||
if (!$basic && !empty($row['exif'])) {
|
if (!$basic && !empty($row['exif'])) {
|
||||||
try {
|
try {
|
||||||
|
@ -64,19 +67,23 @@ trait TimelineQuerySingleItem
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get address from places
|
||||||
$gisType = \OCA\Memories\Util::placesGISType();
|
$gisType = \OCA\Memories\Util::placesGISType();
|
||||||
$address = -1 === $gisType ? 'Geocoding Unconfigured' : null;
|
$address = -1 === $gisType ? 'Geocoding Unconfigured' : null;
|
||||||
if (!$basic && $gisType > 0) {
|
if (!$basic && $gisType > 0) {
|
||||||
$qb = $this->connection->getQueryBuilder();
|
$qb = $this->connection->getQueryBuilder();
|
||||||
$qb->select('e.name')
|
$qb->select('e.name', 'e.other_names')
|
||||||
->from('memories_places', 'mp')
|
->from('memories_places', 'mp')
|
||||||
->innerJoin('mp', 'memories_planet', 'e', $qb->expr()->eq('mp.osm_id', 'e.osm_id'))
|
->innerJoin('mp', 'memories_planet', 'e', $qb->expr()->eq('mp.osm_id', 'e.osm_id'))
|
||||||
->where($qb->expr()->eq('mp.fileid', $qb->createNamedParameter($id, \PDO::PARAM_INT)))
|
->where($qb->expr()->eq('mp.fileid', $qb->createNamedParameter($id, \PDO::PARAM_INT)))
|
||||||
->andWhere($qb->expr()->gt('e.admin_level', $qb->createNamedParameter(0)))
|
->andWhere($qb->expr()->gt('e.admin_level', $qb->createNamedParameter(0)))
|
||||||
->orderBy('e.admin_level', 'DESC')
|
->orderBy('e.admin_level', 'DESC')
|
||||||
;
|
;
|
||||||
$places = $qb->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
|
|
||||||
|
$places = $qb->executeQuery()->fetchAll();
|
||||||
|
$lang = Util::getUserLang();
|
||||||
if (\count($places) > 0) {
|
if (\count($places) > 0) {
|
||||||
|
$places = array_map(fn ($p) => PlacesBackend::choosePlaceLang($p, $lang)['name'], $places);
|
||||||
$address = implode(', ', $places);
|
$address = implode(', ', $places);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (c) 2023 Your name <your@email.com>
|
||||||
|
* @author Your name <your@email.com>
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OCA\Memories\Migration;
|
||||||
|
|
||||||
|
use OCP\DB\ISchemaWrapper;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use OCP\Migration\SimpleMigrationStep;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-generated migration step: Please modify to your needs!
|
||||||
|
*/
|
||||||
|
class Version401300Date20230328012131 extends SimpleMigrationStep
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param \Closure(): ISchemaWrapper $schemaClosure
|
||||||
|
*/
|
||||||
|
public function preSchemaChange(IOutput $output, \Closure $schemaClosure, array $options): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \Closure(): ISchemaWrapper $schemaClosure
|
||||||
|
*/
|
||||||
|
public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options): ?ISchemaWrapper
|
||||||
|
{
|
||||||
|
/** @var ISchemaWrapper $schema */
|
||||||
|
$schema = $schemaClosure();
|
||||||
|
|
||||||
|
// Add lat lon to memories
|
||||||
|
$table = $schema->getTable('memories_planet');
|
||||||
|
$table->addColumn('other_names', 'text', [
|
||||||
|
'notnull' => false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $schema;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \Closure(): ISchemaWrapper $schemaClosure
|
||||||
|
*/
|
||||||
|
public function postSchemaChange(IOutput $output, \Closure $schemaClosure, array $options): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -75,4 +75,24 @@ trait UtilController
|
||||||
|
|
||||||
return \OC::$server->get(\OCP\Files\IRootFolder::class)->getUserFolder($uid);
|
return \OC::$server->get(\OCP\Files\IRootFolder::class)->getUserFolder($uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the language code for the current user.
|
||||||
|
*/
|
||||||
|
public static function getUserLang(): string
|
||||||
|
{
|
||||||
|
// Default language
|
||||||
|
$config = \OC::$server->get(\OCP\IConfig::class);
|
||||||
|
$default = $config->getSystemValue('default_language', 'en');
|
||||||
|
|
||||||
|
// Get UID of the user
|
||||||
|
try {
|
||||||
|
$uid = self::getUID();
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return 'en';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get language of the user
|
||||||
|
return $config->getUserValue($uid, 'core', 'lang', $default);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue