HR-ATS-Portal/backend/global_cities.py

248 lines
13 KiB
Python

"""Global country → cities dataset for residence canonicalization.
Pakistan is one country in this map, not a special case. The employment-agent
prompt receives `countries_prompt_block()` so the model can map a messy
locality to exactly one city name. `canonical_city` uses the same index.
"""
from __future__ import annotations
import re
Countries={
"Afghanistan":["Kabul","Kandahar","Herat","Mazar-i-Sharif","Jalalabad"],
"Albania":["Tirana","Durres","Vlore","Shkoder"],
"Algeria":["Algiers","Oran","Constantine","Annaba"],
"Andorra":["Andorra la Vella"],
"Angola":["Luanda","Huambo","Lobito","Benguela"],
"Argentina":["Buenos Aires","Cordoba","Rosario","Mendoza","La Plata"],
"Armenia":["Yerevan","Gyumri","Vanadzor"],
"Australia":["Sydney","Melbourne","Brisbane","Perth","Adelaide","Canberra","Gold Coast","Hobart","Darwin"],
"Austria":["Vienna","Graz","Linz","Salzburg","Innsbruck"],
"Azerbaijan":["Baku","Ganja","Sumqayit"],
"Bahamas":["Nassau","Freeport"],
"Bahrain":["Manama","Riffa","Muharraq"],
"Bangladesh":["Dhaka","Chittagong","Khulna","Rajshahi","Sylhet","Gazipur","Narayanganj"],
"Belarus":["Minsk","Gomel","Mogilev","Vitebsk"],
"Belgium":["Brussels","Antwerp","Ghent","Charleroi","Liege","Bruges"],
"Belize":["Belmopan","Belize City"],
"Benin":["Porto-Novo","Cotonou"],
"Bhutan":["Thimphu","Phuntsholing"],
"Bolivia":["La Paz","Santa Cruz","Cochabamba","Sucre"],
"Bosnia and Herzegovina":["Sarajevo","Banja Luka","Mostar","Tuzla"],
"Botswana":["Gaborone","Francistown"],
"Brazil":["Sao Paulo","Rio de Janeiro","Brasilia","Salvador","Fortaleza","Belo Horizonte","Manaus","Curitiba","Recife","Porto Alegre"],
"Brunei":["Bandar Seri Begawan"],
"Bulgaria":["Sofia","Plovdiv","Varna","Burgas"],
"Burkina Faso":["Ouagadougou","Bobo-Dioulasso"],
"Burundi":["Gitega","Bujumbura"],
"Cambodia":["Phnom Penh","Siem Reap","Sihanoukville"],
"Cameroon":["Yaounde","Douala","Garoua"],
"Canada":["Toronto","Montreal","Vancouver","Calgary","Ottawa","Edmonton","Winnipeg","Quebec City","Hamilton","Halifax"],
"Cape Verde":["Praia","Mindelo"],
"Central African Republic":["Bangui"],
"Chad":["N'Djamena","Moundou"],
"Chile":["Santiago","Valparaiso","Concepcion","Antofagasta"],
"China":["Beijing","Shanghai","Guangzhou","Shenzhen","Chengdu","Chongqing","Tianjin","Wuhan","Hangzhou","Nanjing","Xi'an","Suzhou","Dongguan","Qingdao","Dalian"],
"Colombia":["Bogota","Medellin","Cali","Barranquilla","Cartagena"],
"Comoros":["Moroni"],
"Congo":["Brazzaville","Pointe-Noire"],
"Costa Rica":["San Jose","Alajuela","Cartago"],
"Croatia":["Zagreb","Split","Rijeka","Osijek"],
"Cuba":["Havana","Santiago de Cuba","Camaguey"],
"Cyprus":["Nicosia","Limassol","Larnaca","Paphos"],
"Czech Republic":["Prague","Brno","Ostrava","Plzen"],
"Democratic Republic of the Congo":["Kinshasa","Lubumbashi","Mbuji-Mayi"],
"Denmark":["Copenhagen","Aarhus","Odense","Aalborg"],
"Djibouti":["Djibouti"],
"Dominican Republic":["Santo Domingo","Santiago"],
"Ecuador":["Quito","Guayaquil","Cuenca"],
"Egypt":["Cairo","Alexandria","Giza","Shubra El Kheima","Port Said","Suez","Luxor"],
"El Salvador":["San Salvador","Santa Ana","San Miguel"],
"Equatorial Guinea":["Malabo","Bata"],
"Eritrea":["Asmara"],
"Estonia":["Tallinn","Tartu"],
"Eswatini":["Mbabane","Manzini"],
"Ethiopia":["Addis Ababa","Dire Dawa","Mekelle"],
"Fiji":["Suva","Nadi"],
"Finland":["Helsinki","Espoo","Tampere","Oulu","Turku"],
"France":["Paris","Marseille","Lyon","Toulouse","Nice","Nantes","Strasbourg","Bordeaux","Lille","Rennes"],
"Gabon":["Libreville"],
"Gambia":["Banjul","Serekunda"],
"Georgia":["Tbilisi","Batumi","Kutaisi"],
"Germany":["Berlin","Hamburg","Munich","Cologne","Frankfurt","Stuttgart","Dusseldorf","Dortmund","Essen","Leipzig","Dresden","Hanover","Nuremberg"],
"Ghana":["Accra","Kumasi","Tamale","Takoradi"],
"Greece":["Athens","Thessaloniki","Patras","Heraklion"],
"Guatemala":["Guatemala City","Quetzaltenango"],
"Guinea":["Conakry"],
"Guyana":["Georgetown"],
"Haiti":["Port-au-Prince","Cap-Haitien"],
"Honduras":["Tegucigalpa","San Pedro Sula"],
"Hungary":["Budapest","Debrecen","Szeged","Miskolc"],
"Iceland":["Reykjavik"],
"India":["Mumbai","Delhi","Bengaluru","Hyderabad","Ahmedabad","Chennai","Kolkata","Pune","Jaipur","Surat","Lucknow","Kanpur","Nagpur","Indore","Bhopal","Patna","Chandigarh","Noida","Gurgaon","Kochi","Coimbatore"],
"Indonesia":["Jakarta","Surabaya","Bandung","Medan","Bekasi","Depok","Tangerang","Semarang","Makassar","Palembang"],
"Iran":["Tehran","Mashhad","Isfahan","Karaj","Shiraz","Tabriz","Qom","Ahvaz"],
"Iraq":["Baghdad","Basra","Mosul","Erbil","Najaf","Karbala","Sulaymaniyah"],
"Ireland":["Dublin","Cork","Limerick","Galway","Waterford"],
"Israel":["Jerusalem","Tel Aviv","Haifa","Rishon LeZion","Petah Tikva"],
"Italy":["Rome","Milan","Naples","Turin","Palermo","Genoa","Bologna","Florence","Venice","Bari"],
"Ivory Coast":["Yamoussoukro","Abidjan"],
"Jamaica":["Kingston","Montego Bay"],
"Japan":["Tokyo","Yokohama","Osaka","Nagoya","Sapporo","Fukuoka","Kobe","Kyoto","Kawasaki","Saitama","Hiroshima","Sendai"],
"Jordan":["Amman","Zarqa","Irbid","Aqaba"],
"Kazakhstan":["Astana","Almaty","Shymkent","Aktobe"],
"Kenya":["Nairobi","Mombasa","Kisumu","Nakuru"],
"Kuwait":["Kuwait City","Hawalli","Salmiya","Jahra"],
"Kyrgyzstan":["Bishkek","Osh"],
"Laos":["Vientiane","Luang Prabang"],
"Latvia":["Riga","Daugavpils"],
"Lebanon":["Beirut","Tripoli","Sidon","Zahle"],
"Lesotho":["Maseru"],
"Liberia":["Monrovia"],
"Libya":["Tripoli","Benghazi","Misrata"],
"Liechtenstein":["Vaduz"],
"Lithuania":["Vilnius","Kaunas","Klaipeda"],
"Luxembourg":["Luxembourg"],
"Madagascar":["Antananarivo","Toamasina"],
"Malawi":["Lilongwe","Blantyre"],
"Malaysia":["Kuala Lumpur","George Town","Johor Bahru","Ipoh","Shah Alam","Petaling Jaya","Kota Kinabalu","Kuching","Malacca"],
"Maldives":["Male"],
"Mali":["Bamako"],
"Malta":["Valletta","Birkirkara"],
"Mauritania":["Nouakchott"],
"Mauritius":["Port Louis"],
"Mexico":["Mexico City","Guadalajara","Monterrey","Puebla","Tijuana","Leon","Juarez","Merida","Cancun","Queretaro"],
"Moldova":["Chisinau"],
"Monaco":["Monaco"],
"Mongolia":["Ulaanbaatar"],
"Montenegro":["Podgorica","Niksic"],
"Morocco":["Rabat","Casablanca","Fes","Marrakesh","Tangier","Agadir","Meknes"],
"Mozambique":["Maputo","Beira","Nampula"],
"Myanmar":["Naypyidaw","Yangon","Mandalay"],
"Namibia":["Windhoek","Walvis Bay"],
"Nepal":["Kathmandu","Pokhara","Lalitpur","Biratnagar"],
"Netherlands":["Amsterdam","Rotterdam","The Hague","Utrecht","Eindhoven","Groningen"],
"New Zealand":["Auckland","Wellington","Christchurch","Hamilton","Dunedin"],
"Nicaragua":["Managua"],
"Niger":["Niamey"],
"Nigeria":["Abuja","Lagos","Kano","Ibadan","Port Harcourt","Benin City","Kaduna"],
"North Korea":["Pyongyang"],
"North Macedonia":["Skopje"],
"Norway":["Oslo","Bergen","Trondheim","Stavanger"],
"Oman":["Muscat","Salalah","Sohar","Nizwa"],
"Pakistan":[
"Karachi","Lahore","Islamabad","Rawalpindi","Peshawar","Quetta","Faisalabad",
"Multan","Hyderabad","Sialkot","Gujranwala","Sargodha","Bahawalpur",
"Sukkur","Larkana","Sheikhupura","Rahim Yar Khan","Sahiwal","Jhang","Okara",
"Gujrat","Kasur","Dera Ghazi Khan","Mardan","Abbottabad","Mingora","Nawabshah",
"Mirpur","Muzaffarabad","Gilgit","Skardu","Wah","Attock","Jhelum","Chakwal",
"Taxila","Kamra","Haripur","Mansehra","Kohat","Bannu","Dera Ismail Khan",
"Charsadda","Nowshera","Swat","Chitral","Swabi","Jacobabad","Khairpur","Thatta",
"Gwadar","Turbat","Hub","Kotri","Jamshoro","Shikarpur","Dadu","Badin","Khuzdar",
"Chaman","Kamoke","Muridke","Hafizabad","Narowal","Pakpattan","Vehari","Khanewal",
"Layyah","Burewala","Gojra","Chiniot","Bhakkar","Mianwali","Khushab","Murree",
"Kotli","Bhimber","Rawalakot","Toba Tek Singh","Mandi Bahauddin","Muzaffargarh",
"Mirpur Khas","Hasan Abdal",
],
"Palestine":["Gaza","Ramallah","Hebron","Nablus"],
"Panama":["Panama City","Colon"],
"Papua New Guinea":["Port Moresby"],
"Paraguay":["Asuncion","Ciudad del Este"],
"Peru":["Lima","Arequipa","Trujillo","Cusco"],
"Philippines":["Manila","Quezon City","Davao","Cebu","Zamboanga","Taguig","Pasig","Cagayan de Oro"],
"Poland":["Warsaw","Krakow","Lodz","Wroclaw","Poznan","Gdansk","Szczecin"],
"Portugal":["Lisbon","Porto","Braga","Coimbra","Faro"],
"Qatar":["Doha","Al Rayyan","Al Wakrah"],
"Romania":["Bucharest","Cluj-Napoca","Timisoara","Iasi","Constanta","Brasov"],
"Russia":["Moscow","Saint Petersburg","Novosibirsk","Yekaterinburg","Kazan","Nizhny Novgorod","Chelyabinsk","Samara","Rostov-on-Don","Ufa"],
"Rwanda":["Kigali"],
"Saudi Arabia":["Riyadh","Jeddah","Mecca","Medina","Dammam","Khobar","Dhahran","Tabuk","Abha","Taif"],
"Senegal":["Dakar","Touba","Thies"],
"Serbia":["Belgrade","Novi Sad","Nis"],
"Seychelles":["Victoria"],
"Sierra Leone":["Freetown"],
"Singapore":["Singapore"],
"Slovakia":["Bratislava","Kosice"],
"Slovenia":["Ljubljana","Maribor"],
"Somalia":["Mogadishu","Hargeisa"],
"South Africa":["Johannesburg","Cape Town","Durban","Pretoria","Port Elizabeth","Bloemfontein","East London","Soweto"],
"South Korea":["Seoul","Busan","Incheon","Daegu","Daejeon","Gwangju","Suwon","Ulsan"],
"South Sudan":["Juba"],
"Spain":["Madrid","Barcelona","Valencia","Seville","Zaragoza","Malaga","Murcia","Palma","Bilbao","Alicante"],
"Sri Lanka":["Colombo","Kandy","Galle","Jaffna","Negombo"],
"Sudan":["Khartoum","Omdurman","Port Sudan"],
"Suriname":["Paramaribo"],
"Sweden":["Stockholm","Gothenburg","Malmo","Uppsala"],
"Switzerland":["Zurich","Geneva","Basel","Bern","Lausanne","Lucerne"],
"Syria":["Damascus","Aleppo","Homs","Latakia"],
"Taiwan":["Taipei","Kaohsiung","Taichung","Tainan"],
"Tajikistan":["Dushanbe"],
"Tanzania":["Dodoma","Dar es Salaam","Mwanza","Arusha","Zanzibar"],
"Thailand":["Bangkok","Chiang Mai","Pattaya","Phuket","Nonthaburi","Hat Yai"],
"Togo":["Lome"],
"Trinidad and Tobago":["Port of Spain","San Fernando"],
"Tunisia":["Tunis","Sfax","Sousse"],
"Turkey":["Istanbul","Ankara","Izmir","Bursa","Antalya","Adana","Gaziantep","Konya","Mersin"],
"Turkmenistan":["Ashgabat"],
"Uganda":["Kampala","Gulu"],
"Ukraine":["Kyiv","Kharkiv","Odesa","Dnipro","Lviv","Zaporizhzhia"],
"United Arab Emirates":["Dubai","Abu Dhabi","Sharjah","Ajman","Ras Al Khaimah","Fujairah","Al Ain","Umm Al Quwain"],
"United Kingdom":["London","Birmingham","Manchester","Glasgow","Liverpool","Leeds","Sheffield","Edinburgh","Bristol","Leicester","Newcastle","Cardiff","Belfast","Nottingham","Southampton"],
"United States":[
"New York","Los Angeles","Chicago","Houston","Phoenix","Philadelphia","San Antonio",
"San Diego","Dallas","San Jose","Austin","Jacksonville","Fort Worth","Columbus",
"Charlotte","San Francisco","Indianapolis","Seattle","Denver","Washington",
"Boston","Nashville","Detroit","Portland","Las Vegas","Baltimore","Milwaukee",
"Albuquerque","Atlanta","Miami","Minneapolis","Tampa","Orlando","Cleveland",
"Pittsburgh","Cincinnati","Kansas City","St. Louis","Raleigh","Salt Lake City",
],
"Uruguay":["Montevideo"],
"Uzbekistan":["Tashkent","Samarkand","Bukhara"],
"Venezuela":["Caracas","Maracaibo","Valencia"],
"Vietnam":["Hanoi","Ho Chi Minh City","Da Nang","Hai Phong","Can Tho"],
"Yemen":["Sanaa","Aden","Taiz"],
"Zambia":["Lusaka","Ndola","Kitwe"],
"Zimbabwe":["Harare","Bulawayo"],
}
def _city_index():
"""First spelling of each city name wins. Longest names are matched first."""
out={}
for cities in Countries.values():
for city in cities:
name=(city or "").strip()
if not name:
continue
out.setdefault(name.lower(),name)
return out
CITY_BY_KEY=_city_index()
CITY_RE=re.compile(
r"\b(?:"+"|".join(
re.escape(name) for name in sorted(CITY_BY_KEY,key=len,reverse=True)
)+r")\b",
)
def countries_prompt_block():
"""Compact country → cities block fed into the employment-agent prompt."""
lines=[]
for country,cities in Countries.items():
names=[c.strip() for c in cities if (c or "").strip()]
if not names:
continue
# De-dupe while keeping order — Pakistan lists Peshawar twice above.
seen=set()
unique=[]
for name in names:
key=name.lower()
if key in seen:
continue
seen.add(key)
unique.append(name)
lines.append(f"{country}: {', '.join(unique)}")
return "\n".join(lines)