From 7817da0d7fa4a78cce595d7897900b9ce75fa2eb Mon Sep 17 00:00:00 2001 From: Arsentiy Milchakov Date: Fri, 7 Jun 2019 16:16:15 +0300 Subject: [PATCH] [generator][promo] The type sponsored-promo_catalog is added into cities. --- generator/CMakeLists.txt | 1 + .../booking_quality_check.cpp | 8 +-- generator/emitter_country.cpp | 5 +- generator/emitter_world.cpp | 1 + generator/feature_merger.cpp | 30 ++++++---- generator/feature_processing_layers.cpp | 27 +++++++++ generator/feature_processing_layers.hpp | 13 +++++ generator/generate_info.hpp | 5 +- generator/generator_tool/CMakeLists.txt | 2 + generator/generator_tool/generator_tool.cpp | 11 ++-- generator/promo_catalog_cities.hpp | 57 +++++++++++++++++++ indexer/ftypes_sponsored.cpp | 6 ++ indexer/ftypes_sponsored.hpp | 9 +++ .../partners_api_tests/promo_tests.cpp | 2 +- partners_api/promo_api.cpp | 11 +++- partners_api/promo_api.hpp | 4 +- tools/python/ResponseProvider.py | 2 +- tools/python/jsons.py | 4 +- tools/python/maps_generator/README.md | 1 + tools/python/maps_generator/generator/env.py | 4 ++ .../maps_generator/generator/gen_tool.py | 1 + .../maps_generator/generator/settings.py | 2 + tools/python/maps_generator/maps_generator.py | 12 ++-- .../var/etc/map_generator.ini.default | 1 + 24 files changed, 183 insertions(+), 36 deletions(-) create mode 100644 generator/promo_catalog_cities.hpp diff --git a/generator/CMakeLists.txt b/generator/CMakeLists.txt index ef398f1541..1d7e9841ce 100644 --- a/generator/CMakeLists.txt +++ b/generator/CMakeLists.txt @@ -137,6 +137,7 @@ set(SRC place_node.hpp platform_helpers.cpp platform_helpers.hpp + promo_catalog_cities.hpp ratings_section_builder.cpp ratings_section_builder.hpp relation_tags.cpp diff --git a/generator/booking_quality_check/booking_quality_check.cpp b/generator/booking_quality_check/booking_quality_check.cpp index eae80da913..699824f225 100644 --- a/generator/booking_quality_check/booking_quality_check.cpp +++ b/generator/booking_quality_check/booking_quality_check.cpp @@ -107,8 +107,8 @@ base::GeoObjectId ReadDebuggedPrintedOsmId(string const & str) GenerateInfo GetGenerateInfo() { GenerateInfo info; - info.m_bookingDatafileName = FLAGS_booking; - info.m_opentableDatafileName = FLAGS_opentable; + info.m_bookingDataFilename = FLAGS_booking; + info.m_opentableDataFilename = FLAGS_opentable; info.m_osmFileName = FLAGS_osm; info.SetNodeStorageType("map"); info.SetOsmFileType("o5m"); @@ -309,13 +309,13 @@ string GetDatasetFilePath(GenerateInfo const & info); template <> string GetDatasetFilePath(GenerateInfo const & info) { - return info.m_bookingDatafileName; + return info.m_bookingDataFilename; } template <> string GetDatasetFilePath(GenerateInfo const & info) { - return info.m_opentableDatafileName; + return info.m_opentableDataFilename; } template diff --git a/generator/emitter_country.cpp b/generator/emitter_country.cpp index 6ccfc3c42f..281bdf811c 100644 --- a/generator/emitter_country.cpp +++ b/generator/emitter_country.cpp @@ -22,9 +22,10 @@ EmitterCountry::EmitterCountry(feature::GenerateInfo const & info) { m_processingChain = std::make_shared(m_cityBoundaryProcessor); m_processingChain->Add(std::make_shared()); + m_processingChain->Add(std::make_shared(info.m_promoCatalogCitiesFilename)); m_processingChain->Add(std::make_shared(m_cityBoundaryProcessor)); - m_processingChain->Add(std::make_shared(info.m_bookingDatafileName, m_countryMapper)); - m_processingChain->Add(std::make_shared(info.m_opentableDatafileName, m_countryMapper)); + m_processingChain->Add(std::make_shared(info.m_bookingDataFilename, m_countryMapper)); + m_processingChain->Add(std::make_shared(info.m_opentableDataFilename, m_countryMapper)); m_processingChain->Add(std::make_shared(m_countryMapper)); if (info.m_emitCoasts) diff --git a/generator/emitter_world.cpp b/generator/emitter_world.cpp index c46a9c5da5..4ded6c347f 100644 --- a/generator/emitter_world.cpp +++ b/generator/emitter_world.cpp @@ -22,6 +22,7 @@ EmitterWorld::EmitterWorld(feature::GenerateInfo const & info) { m_processingChain = std::make_shared(m_cityBoundaryProcessor); m_processingChain->Add(std::make_shared()); + m_processingChain->Add(std::make_shared(info.m_promoCatalogCitiesFilename)); m_processingChain->Add(std::make_shared(m_cityBoundaryProcessor)); m_processingChain->Add(std::make_shared(m_worldMapper)); } diff --git a/generator/feature_merger.cpp b/generator/feature_merger.cpp index 546bb75bad..703d86703b 100644 --- a/generator/feature_merger.cpp +++ b/generator/feature_merger.cpp @@ -4,6 +4,8 @@ #include "indexer/feature_algo.hpp" #include "indexer/feature_visibility.hpp" +#include "indexer/ftypes_sponsored.hpp" + #include "coding/point_coding.hpp" using namespace feature; @@ -327,14 +329,18 @@ MergedFeatureBuilder1 * FeatureTypesProcessor::operator() (FeatureBuilder const namespace feature { -class IsInvisibleFn +class RemoveSolver { int m_lowScale, m_upScale; - bool m_leaveSpecialTypes; + bool m_doNotRemoveSpecialTypes; + bool m_doNotRemoveSponsoredTypes; public: - IsInvisibleFn(int lowScale, int upScale, bool leaveSpecialTypes) - : m_lowScale(lowScale), m_upScale(upScale), m_leaveSpecialTypes(leaveSpecialTypes) + RemoveSolver(int lowScale, int upScale, bool leaveSpecialTypes, bool leaveSponsoredTypes = true) + : m_lowScale(lowScale), + m_upScale(upScale), + m_doNotRemoveSpecialTypes(leaveSpecialTypes), + m_doNotRemoveSponsoredTypes(leaveSponsoredTypes) { } @@ -342,17 +348,20 @@ public: { std::pair const range = feature::GetDrawableScaleRange(type); + if (m_doNotRemoveSponsoredTypes && ftypes::IsSponsoredChecker::Instance()(type)) + return false; // We have feature types without any drawing rules. // This case was processed before: // - feature::TypeAlwaysExists; // - FeatureBuilder::RemoveInvalidTypes; // Don't delete them here. - if (m_leaveSpecialTypes && range.first == -1) + if (m_doNotRemoveSpecialTypes && range.first == -1) { ASSERT(range.second == -1, ()); return false; } + // Remove when |type| is invisible. return (range.first == -1 || (range.first > m_upScale || range.second < m_lowScale)); } }; @@ -361,7 +370,7 @@ bool PreprocessForWorldMap(FeatureBuilder & fb) { int const upperScale = scales::GetUpperWorldScale(); - if (fb.RemoveTypesIf(IsInvisibleFn(0, upperScale, false))) + if (fb.RemoveTypesIf(RemoveSolver(0, upperScale, false))) return false; fb.RemoveNameIfInvisible(0, upperScale); @@ -371,14 +380,11 @@ bool PreprocessForWorldMap(FeatureBuilder & fb) bool PreprocessForCountryMap(FeatureBuilder & fb) { - if (fb.RemoveTypesIf(IsInvisibleFn(scales::GetUpperWorldScale() + 1, - scales::GetUpperStyleScale(), - true))) - { + using namespace scales; + + if (fb.RemoveTypesIf(RemoveSolver(GetUpperWorldScale() + 1, GetUpperStyleScale(), true))) return false; - } return true; } - } diff --git a/generator/feature_processing_layers.cpp b/generator/feature_processing_layers.cpp index 0c8aaac5e2..6f5cb44bb7 100644 --- a/generator/feature_processing_layers.cpp +++ b/generator/feature_processing_layers.cpp @@ -8,6 +8,7 @@ #include "generator/emitter_interface.hpp" #include "generator/type_helper.hpp" +#include "indexer/classificator.hpp" #include "indexer/feature_visibility.hpp" #include "indexer/ftypes_matcher.hpp" @@ -243,6 +244,32 @@ void OpentableLayer::Handle(FeatureBuilder & feature) }); } + +PromoCatalogLayer::PromoCatalogLayer(std::string const & filename) + : m_cities(promo::LoadCities(filename)) +{ +} + +void PromoCatalogLayer::Handle(FeatureBuilder & feature) +{ + if (ftypes::IsCityTownOrVillage(feature.GetTypes())) + { + auto const & ids = feature.GetOsmIds(); + + auto const found = std::any_of(ids.cbegin(), ids.cend(), [this](auto const & id) + { + return m_cities.find(id) != m_cities.cend(); + }); + + if (!found) + return; + + FeatureParams & params = feature.GetParams(); + params.AddType(classif().GetTypeByPath({"sponsored", "promo_catalog"})); + } + LayerBase::Handle(feature); +} + CountryMapperLayer::CountryMapperLayer(std::shared_ptr countryMapper) : m_countryMapper(countryMapper) {} diff --git a/generator/feature_processing_layers.hpp b/generator/feature_processing_layers.hpp index a05988a81c..8a1bfd869a 100644 --- a/generator/feature_processing_layers.hpp +++ b/generator/feature_processing_layers.hpp @@ -4,6 +4,7 @@ #include "generator/feature_generator.hpp" #include "generator/opentable_dataset.hpp" #include "generator/polygonizer.hpp" +#include "generator/promo_catalog_cities.hpp" #include "generator/world_map_generator.hpp" #include @@ -159,6 +160,18 @@ private: std::shared_ptr m_countryMapper; }; +class PromoCatalogLayer : public LayerBase +{ +public: + explicit PromoCatalogLayer(std::string const & filename); + + // LayerBase overrides: + void Handle(feature::FeatureBuilder & feature) override; + +private: + promo::Cities m_cities; +}; + // Responsibility of class CountryMapperLayer - mapping of features to countries. class CountryMapperLayer : public LayerBase { diff --git a/generator/generate_info.hpp b/generator/generate_info.hpp index 6c0d13cfba..9465203eff 100644 --- a/generator/generate_info.hpp +++ b/generator/generate_info.hpp @@ -44,8 +44,9 @@ struct GenerateInfo OsmSourceType m_osmFileType; std::string m_osmFileName; - std::string m_bookingDatafileName; - std::string m_opentableDatafileName; + std::string m_bookingDataFilename; + std::string m_opentableDataFilename; + std::string m_promoCatalogCitiesFilename; std::string m_brandsFilename; std::string m_brandsTranslationsFilename; diff --git a/generator/generator_tool/CMakeLists.txt b/generator/generator_tool/CMakeLists.txt index 6a81eca3bf..97063bdc66 100644 --- a/generator/generator_tool/CMakeLists.txt +++ b/generator/generator_tool/CMakeLists.txt @@ -22,7 +22,9 @@ omim_link_libraries( search storage editor + partners_api indexer + metrics platform geometry coding diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index e0ca667fec..bba4be7483 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -159,8 +159,10 @@ DEFINE_bool( DEFINE_bool(generate_maxspeed, false, "Generate section with maxspeed of road features."); // Sponsored-related. -DEFINE_string(booking_data, "", "Path to booking data in .tsv format."); -DEFINE_string(opentable_data, "", "Path to opentable data in .tsv format."); +DEFINE_string(booking_data, "", "Path to booking data in tsv format."); +DEFINE_string(opentable_data, "", "Path to opentable data in tsv format."); +DEFINE_string(promo_catalog_cities, "", + "Path to list geo object ids of cities which contain promo catalog in json format."); DEFINE_string(ugc_data, "", "Input UGC source database file name."); @@ -264,8 +266,9 @@ int GeneratorToolMain(int argc, char ** argv) genInfo.m_osmFileName = FLAGS_osm_file_name; genInfo.m_failOnCoasts = FLAGS_fail_on_coasts; genInfo.m_preloadCache = FLAGS_preload_cache; - genInfo.m_bookingDatafileName = FLAGS_booking_data; - genInfo.m_opentableDatafileName = FLAGS_opentable_data; + genInfo.m_bookingDataFilename = FLAGS_booking_data; + genInfo.m_opentableDataFilename = FLAGS_opentable_data; + genInfo.m_promoCatalogCitiesFilename = FLAGS_promo_catalog_cities; genInfo.m_popularPlacesFilename = FLAGS_popular_places_data; genInfo.m_brandsFilename = FLAGS_brands_data; genInfo.m_brandsTranslationsFilename = FLAGS_brands_translations_data; diff --git a/generator/promo_catalog_cities.hpp b/generator/promo_catalog_cities.hpp new file mode 100644 index 0000000000..3239156ada --- /dev/null +++ b/generator/promo_catalog_cities.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include "coding/file_reader.hpp" + +#include "base/geo_object_id.hpp" +#include "base/logging.hpp" + +#include +#include + +#include "3party/jansson/myjansson.hpp" + +namespace promo +{ +using Cities = std::unordered_set; + +inline Cities LoadCities(std::string const & filename) +{ + std::string src; + try + { + FileReader reader(filename); + reader.ReadAsString(src); + } + catch (Reader::Exception const & e) + { + LOG(LERROR, (filename, e.Msg())); + return {}; + } + + Cities result; + try + { + base::Json root(src.c_str()); + auto const dataArray = json_object_get(root.get(), "data"); + + auto const size = json_array_size(dataArray); + + result.reserve(size); + for (size_t i = 0; i < size; ++i) + { + int64_t id = 0; + auto const obj = json_array_get(dataArray, i); + FromJSONObject(obj, "osmid", id); + + result.emplace(static_cast(id)); + } + } + catch (base::Json::Exception const & e) + { + LOG(LERROR, (e.Msg())); + result.clear(); + } + + return result; +} +} // namespace promo diff --git a/indexer/ftypes_sponsored.cpp b/indexer/ftypes_sponsored.cpp index 5d9bc6ead5..7b972d86b9 100644 --- a/indexer/ftypes_sponsored.cpp +++ b/indexer/ftypes_sponsored.cpp @@ -10,4 +10,10 @@ BaseSponsoredChecker::BaseSponsoredChecker(std::string const & sponsoredType) { m_types.push_back(classif().GetTypeByPath({"sponsored", sponsoredType})); } + +IsSponsoredChecker::IsSponsoredChecker() + : BaseChecker(1) +{ + m_types.push_back(classif().GetTypeByPath({"sponsored"})); +} } // namespace ftypes diff --git a/indexer/ftypes_sponsored.hpp b/indexer/ftypes_sponsored.hpp index bdc7bc2482..6e7f5ac24d 100644 --- a/indexer/ftypes_sponsored.hpp +++ b/indexer/ftypes_sponsored.hpp @@ -12,6 +12,15 @@ protected: explicit BaseSponsoredChecker(std::string const & sponsoredType); }; +class IsSponsoredChecker : public BaseChecker +{ +private: + IsSponsoredChecker(); + +public: + DECLARE_CHECKER_INSTANCE(IsSponsoredChecker); +}; + #define SPONSORED_CHECKER(ClassName, Category) \ class ClassName : public BaseSponsoredChecker { \ ClassName() : BaseSponsoredChecker(Category) {} \ diff --git a/partners_api/partners_api_tests/promo_tests.cpp b/partners_api/partners_api_tests/promo_tests.cpp index 06e52f0c27..0492495a07 100644 --- a/partners_api/partners_api_tests/promo_tests.cpp +++ b/partners_api/partners_api_tests/promo_tests.cpp @@ -136,7 +136,7 @@ UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, Promo_NeedToShowAfterBooking) UNIT_CLASS_TEST(ScopedEyeWithAsyncGuiThread, Promo_GetCityGallery) { - promo::Api api("http://localhost:34568/gallery/city/"); + promo::Api api("http://localhost:34568/"); api.SetDelegate(std::make_unique()); { diff --git a/partners_api/promo_api.cpp b/partners_api/promo_api.cpp index 18c6eb94ab..afbaaf615b 100644 --- a/partners_api/promo_api.cpp +++ b/partners_api/promo_api.cpp @@ -8,10 +8,13 @@ #include "platform/preferred_languages.hpp" #include "platform/settings.hpp" +#include "base/string_utils.hpp" + #include "base/assert.hpp" #include #include +#include #include #include "3party/jansson/myjansson.hpp" @@ -87,12 +90,16 @@ void ParseCityGallery(std::string const & src, promo::CityGallery & result) auto const meta = json_object_get(root.get(), "meta"); FromJSONObject(meta, "more", result.m_moreUrl); + result.m_moreUrl.insert(0, BOOKMARKS_CATALOG_FRONT_URL); } std::string MakeCityGalleryUrl(std::string const & baseUrl, std::string const & id, std::string const & lang) { - return baseUrl + id + "/?lang=" + lang; + ASSERT(!baseUrl.empty(), ()); + ASSERT_EQUAL(baseUrl.back(), '/', ()); + + return baseUrl + "gallery/v1/city/" + id + "/?lang=" + lang; } void GetPromoCityGalleryImpl(std::string const & baseUrl, std::string const & id, @@ -143,7 +150,7 @@ bool WebApi::GetCityGalleryById(std::string const & baseUrl, std::string const & return request.RunHttpRequest(result); } -Api::Api(std::string const & baseUrl /* = "https://routes.maps.me/gallery/v1/city/" */) +Api::Api(std::string const & baseUrl /* = BOOKMARKS_CATALOG_FRONT_URL */) : m_baseUrl(baseUrl) { } diff --git a/partners_api/promo_api.hpp b/partners_api/promo_api.hpp index d106f6b9e5..ff9bd23f9c 100644 --- a/partners_api/promo_api.hpp +++ b/partners_api/promo_api.hpp @@ -10,6 +10,8 @@ #include #include +#include "private.h" + namespace promo { struct Author @@ -61,7 +63,7 @@ public: virtual std::string GetCityId(m2::PointD const & point) = 0; }; - explicit Api(std::string const & baseUrl = "https://routes.maps.me/gallery/v1/city/"); + explicit Api(std::string const & baseUrl = BOOKMARKS_CATALOG_FRONT_URL); void SetDelegate(std::unique_ptr delegate); void OnEnterForeground(); diff --git a/tools/python/ResponseProvider.py b/tools/python/ResponseProvider.py index 61551b5b1c..ee094439cf 100644 --- a/tools/python/ResponseProvider.py +++ b/tools/python/ResponseProvider.py @@ -147,7 +147,7 @@ class ResponseProvider: "/partners/taxi_info": self.partners_yandex_taxi_info, "/partners/get-offers-in-bbox/": self.partners_rent_nearby, "/partners/CalculateByCoords": self.partners_calculate_by_coords, - "/gallery/city/TestId/": self.promo_gallery_city, + "/gallery/v1/city/TestId/": self.promo_gallery_city, }[url]() except: return self.test_404() diff --git a/tools/python/jsons.py b/tools/python/jsons.py index be08c3eb0e..29083b1ab5 100644 --- a/tools/python/jsons.py +++ b/tools/python/jsons.py @@ -543,14 +543,14 @@ PROMO_GALLERY_CITY = """ "access": "public", "lux_category": { "name": null, - "color": "666666" + "color": "000000" }, "tier": null } ], "errors": [], "meta": { - "more": "search?city=666" + "more": "search?city=888" } } """ diff --git a/tools/python/maps_generator/README.md b/tools/python/maps_generator/README.md index e934506097..a4b78b0a9a 100644 --- a/tools/python/maps_generator/README.md +++ b/tools/python/maps_generator/README.md @@ -75,6 +75,7 @@ OSM_TOOLS_PATH: ~/osmctools # Urls for production maps generation. # UGC_URL: # HOTELS_URL: +# PROMO_CATALOG_CITIES: # POPULARITY_URL: # FOOD_URL: # FOOD_TRANSLATIONS_URL: diff --git a/tools/python/maps_generator/generator/env.py b/tools/python/maps_generator/generator/env.py index 0710579267..1a1fdc2414 100644 --- a/tools/python/maps_generator/generator/env.py +++ b/tools/python/maps_generator/generator/env.py @@ -195,6 +195,10 @@ class Env: def hotels_path(self): return os.path.join(self.intermediate_path, "hotels.csv") + @property + def promo_catalog_cities_path(self): + return os.path.join(self.intermediate_path, "promo_catalog_cities.json") + @property def popularity_path(self): return os.path.join(self.intermediate_path, "popular_places.csv") diff --git a/tools/python/maps_generator/generator/gen_tool.py b/tools/python/maps_generator/generator/gen_tool.py index becf2a62fc..440f10dd43 100644 --- a/tools/python/maps_generator/generator/gen_tool.py +++ b/tools/python/maps_generator/generator/gen_tool.py @@ -42,6 +42,7 @@ class GenTool: "version": bool, "planet_version": int, "booking_data": str, + "promo_catalog_cities": str, "brands_data": str, "brands_translations_data": str, "cities_boundaries_data": str, diff --git a/tools/python/maps_generator/generator/settings.py b/tools/python/maps_generator/generator/settings.py index 8df50f2a38..eb387b961d 100644 --- a/tools/python/maps_generator/generator/settings.py +++ b/tools/python/maps_generator/generator/settings.py @@ -45,6 +45,7 @@ PLANET_MD5_URL = PLANET_URL + ".md5" PLANET_COASTS_URL = "" UGC_URL = "" HOTELS_URL = "" +PROMO_CATALOG_CITIES_URL = "" POPULARITY_URL= "" SUBWAY_URL = "" FOOD_URL = "" @@ -116,6 +117,7 @@ PLANET_MD5_URL = _get_opt_path(config, "External", "PLANET_MD5_URL", PLANET_MD5_ PLANET_COASTS_URL = _get_opt_path(config, "External", "PLANET_COASTS_URL", PLANET_COASTS_URL) UGC_URL = _get_opt_path(config, "External", "UGC_URL", UGC_URL) HOTELS_URL = _get_opt_path(config, "External", "HOTELS_URL", HOTELS_URL) +PROMO_CATALOG_CITIES_URL = _get_opt_path(config, "External", "PROMO_CATALOG_CITIES_URL", PROMO_CATALOG_CITIES_URL) POPULARITY_URL = _get_opt_path(config, "External", "POPULARITY_URL", POPULARITY_URL) SUBWAY_URL = _get_opt(config, "External", "SUBWAY_URL", SUBWAY_URL) FOOD_URL = _get_opt(config, "External", "FOOD_URL", FOOD_URL) diff --git a/tools/python/maps_generator/maps_generator.py b/tools/python/maps_generator/maps_generator.py index 15fde3c696..981e776449 100644 --- a/tools/python/maps_generator/maps_generator.py +++ b/tools/python/maps_generator/maps_generator.py @@ -1,12 +1,12 @@ +import datetime +import json import logging +import multiprocessing import os import shutil +from collections import defaultdict from functools import partial from multiprocessing.pool import ThreadPool -from collections import defaultdict -import multiprocessing -import json -import datetime from descriptions.descriptions_downloader import (check_and_get_checker, download_from_wikipedia_tags, @@ -61,9 +61,10 @@ def stage_download_production_external(env, **kwargs): download_external({ settings.UGC_URL: env.ugc_path, settings.HOTELS_URL: env.hotels_path, + settings.PROMO_CATALOG_CITIES_URL: env.promo_catalog_cities_path, settings.POPULARITY_URL: env.popularity_path, settings.FOOD_URL: env.food_paths, - settings.FOOD_TRANSLATIONS_URL: env.food_translations_path + settings.FOOD_TRANSLATIONS_URL: env.food_translations_path, }) @@ -79,6 +80,7 @@ def stage_features(env): extra["idToWikidata"] = env.id_to_wikidata_path if env.is_accepted_stage(stage_download_production_external.__name__): extra["booking_data"] = env.hotels_path + extra["promo_catalog_cities"] = env.promo_catalog_cities_path extra["popular_places_data"] = env.popularity_path extra["brands_data"] = env.food_paths extra["brands_translations_data"] = env.food_translations_path diff --git a/tools/python/maps_generator/var/etc/map_generator.ini.default b/tools/python/maps_generator/var/etc/map_generator.ini.default index 593781d5a0..d2c5a00439 100644 --- a/tools/python/maps_generator/var/etc/map_generator.ini.default +++ b/tools/python/maps_generator/var/etc/map_generator.ini.default @@ -29,6 +29,7 @@ OSM_TOOLS_PATH: ~/osmctools # PLANET_COASTS_URL: # UGC_URL: # HOTELS_URL: +# PROMO_CATALOG_CITIES_URL: # POPULARITY_URL: # SUBWAY_URL: # FOOD_URL: