You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							113 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							113 lines
						
					
					
						
							4.2 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ################################################################################ | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |
| #    Author: Ansil pv (odoo@cybrosys.com) | |
| # | |
| #    You can modify it under the terms of the GNU AFFERO | |
| #    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | |
| # | |
| #    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 (AGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |
| #    (AGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ################################################################################ | |
| """ | |
|  Install geopy package to decoding geocodes and vise versa | |
| """ | |
| import json | |
| import pytz | |
| from geopy import Nominatim | |
| from odoo import http | |
| from odoo.http import request, route | |
| 
 | |
| from odoo.addons.portal.controllers.portal import CustomerPortal | |
| 
 | |
| 
 | |
| class PortalGeolocation(CustomerPortal): | |
|     @route() | |
|     def account(self, **post): | |
|         """ Super CustomerPortal class function and pass the api key value | |
|         from settings using params to website view file""" | |
|         res = super(PortalGeolocation, self).account(**post) | |
|         params = request.env['ir.config_parameter'].sudo() | |
|         values = params.get_param('base_geolocalize.google_map_api_key') | |
|         res.qcontext.update({ | |
|             'api': values | |
|         }) | |
|         return res | |
| 
 | |
|     @http.route(['/geo/change/<coordinates>'], type='json', auth="none", | |
|                 website=False, csrf=False) | |
|     def geo_changer(self, coordinates): | |
|         """Controller function for get address details  from latitude and | |
|         longitude that we pinpointed in map using geopy package from python | |
|  | |
|         Parameters ---------- coordinates :The stringify value from map that | |
|         contains latitude and longitude | |
|  | |
|         Returns ------- Returning the address details back to view file from | |
|         the converted Latitude and longitude | |
|         """ | |
|         res = json.loads(coordinates) | |
|         geolocator = Nominatim(user_agent="my-app") | |
|         location = geolocator.reverse(f'{res.get("lat")},{res.get("lng")}') | |
|         city = "Undefined" | |
|         suburb = "Undefined" | |
|         state = "Undefined" | |
|         country = "Undefined" | |
|         p_code = "Undefined" | |
|         if location: | |
|             addresses = location.raw['address'] | |
|             if addresses.get('village'): | |
|                 city = addresses.get('village') | |
|             if addresses.get('suburb'): | |
|                 suburb = addresses.get('suburb') | |
|             state = addresses.get('state') | |
|             country_code = addresses.get('country_code') | |
|             country = pytz.country_names[country_code] | |
|             if addresses.get('postcode'): | |
|                 p_code = addresses.get('postcode') | |
|         return { | |
|             'city': city, | |
|             'suburb': suburb, | |
|             'state': state, | |
|             'country': country, | |
|             'p_code': p_code, | |
|         } | |
| 
 | |
|     @http.route(['/geo/location/<address>'], type='json', auth="none", | |
|                 website=False, csrf=False) | |
|     def geo_location(self, address): | |
|         """ Get value from city field in 'my_account' page and convert into | |
|         lat and long and return back to website and set the map and fields | |
|         Parameters ---------- address : The city name that in city field in | |
|         website | |
|  | |
|         Returns | |
|         ------- | |
|         Pass the value to website view and set required fields and map | |
|  | |
|         """ | |
|         locator = Nominatim(user_agent='my-app') | |
|         location = locator.geocode(address) | |
|         location_country = locator.reverse(f'{location.latitude},{location.longitude}') | |
|         addresses = location_country.raw['address'] | |
|         country_code = addresses.get('country_code') | |
|         country = pytz.country_names[country_code] | |
|         p_code = "undefined" | |
|         if addresses.get('postcode'): | |
|             p_code = addresses.get('postcode') | |
|         return { | |
|             'lat': location.latitude, | |
|             'lng': location.longitude, | |
|             'country': country, | |
|             'p_code': p_code | |
|         }
 | |
| 
 |