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.
		
		
		
		
		
			
		
			
				
					
					
						
							413 lines
						
					
					
						
							17 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							413 lines
						
					
					
						
							17 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#
							 | 
						|
								##############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#    Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
							 | 
						|
								#    Author: Nikhil krishnan(<http://www.cybrosys.com>)
							 | 
						|
								#    you can modify it under the terms of the GNU LESSER
							 | 
						|
								#    GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#    It is forbidden to publish, distribute, sublicense, or sell copies
							 | 
						|
								#    of the Software or modified copies of the Software.
							 | 
						|
								#
							 | 
						|
								#    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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
							 | 
						|
								#    GENERAL PUBLIC LICENSE (LGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								##############################################################################
							 | 
						|
								import pytz
							 | 
						|
								from pytz import timezone
							 | 
						|
								from dateutil.relativedelta import relativedelta
							 | 
						|
								from datetime import datetime
							 | 
						|
								
							 | 
						|
								try:
							 | 
						|
								    import pytemperature
							 | 
						|
								except ImportError:
							 | 
						|
								    print 'pytemperature, this python package is not available. please install by using ' \
							 | 
						|
								          '==> pip install pytemperature'
							 | 
						|
								    pass
							 | 
						|
								
							 | 
						|
								try:
							 | 
						|
								    import simplejson as json
							 | 
						|
								except ImportError:
							 | 
						|
								    import json  # noqa
							 | 
						|
								import urllib
							 | 
						|
								
							 | 
						|
								import odoo
							 | 
						|
								from odoo import models, fields, api
							 | 
						|
								from odoo import tools
							 | 
						|
								from odoo.tools.translate import _
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class UserWeatherMap(models.Model):
							 | 
						|
								    _name = 'user.weather.map'
							 | 
						|
								
							 | 
						|
								    date_weather_update = fields.Datetime(string='Last update')
							 | 
						|
								    name = fields.Char(string='City Name')
							 | 
						|
								    city = fields.Char(string='Original City')
							 | 
						|
								    user_id = fields.Many2one('res.users', string='User Name')
							 | 
						|
								    weather = fields.Char(string='Weather')
							 | 
						|
								    description = fields.Char(string='Description')
							 | 
						|
								    temp = fields.Char(string='Temperature')
							 | 
						|
								    pressure = fields.Char(string='Pressure')
							 | 
						|
								    humidity = fields.Char(string='Humidity')
							 | 
						|
								    min_temp = fields.Char(string='Minimum')
							 | 
						|
								    max_temp = fields.Char(string='Maximum')
							 | 
						|
								    sunset = fields.Char(string='Sunset')
							 | 
						|
								    sunrise = fields.Char(string='Sunrise')
							 | 
						|
								
							 | 
						|
								    def get_weather_data(self, user_id):
							 | 
						|
								        user_list = self.env['res.users'].search([('id', '=', user_id)])
							 | 
						|
								        if user_list.partner_id.tz:
							 | 
						|
								            rec = self.search([('user_id', '=', user_id)], limit=1)
							 | 
						|
								            tz = pytz.timezone(user_list.partner_id.tz)
							 | 
						|
								            now_utc = datetime.now(timezone('UTC'))
							 | 
						|
								            now_pacific = now_utc.astimezone(timezone(str(tz)))
							 | 
						|
								            current_time = now_pacific.strftime('%d %B %Y, %I:%M%p')
							 | 
						|
								            current_date = now_pacific.strftime('%d %B %Y')
							 | 
						|
								            if rec:
							 | 
						|
								                current_date_time = datetime.strptime(current_time, '%d %B %Y, %I:%M%p')
							 | 
						|
								                last_update = datetime.strptime(rec.date_weather_update, '%Y-%m-%d %H:%M:%S')
							 | 
						|
								                new_update_allowed_time = last_update + relativedelta(minutes=1)
							 | 
						|
								                if current_date_time > new_update_allowed_time:
							 | 
						|
								                    get_weather = self.get_weather(user_id)
							 | 
						|
								                    if get_weather:
							 | 
						|
								                        if get_weather['issue'] == 'bad_request':
							 | 
						|
								                            return {
							 | 
						|
								                                'issue': 'Bad Request'
							 | 
						|
								                            }
							 | 
						|
								                        elif get_weather['issue'] == 'internet':
							 | 
						|
								                            return {
							 | 
						|
								                                'issue': 'Connection ERROR.!'
							 | 
						|
								                            }
							 | 
						|
								                        elif get_weather['issue'] == 'localization':
							 | 
						|
								                            return {
							 | 
						|
								                                'issue': 'longitude  and latitude or address issue.'
							 | 
						|
								                            }
							 | 
						|
								                        elif get_weather['issue'] == 'config':
							 | 
						|
								                            return {
							 | 
						|
								                                'issue': 'Weather configuration not set yet.'
							 | 
						|
								                            }
							 | 
						|
								                        elif get_weather['issue'] == 'timezone':
							 | 
						|
								                            return {
							 | 
						|
								                                'issue': 'Timezone is not available'
							 | 
						|
								                            }
							 | 
						|
								                        else:
							 | 
						|
								                            rec = self.search([('user_id', '=', user_id)], limit=1)
							 | 
						|
								                else:
							 | 
						|
								                    pass
							 | 
						|
								
							 | 
						|
								                if rec:
							 | 
						|
								                    vals = {
							 | 
						|
								                        'date_now': current_date,
							 | 
						|
								                        'date_weather_update': rec.date_weather_update,
							 | 
						|
								                        'name': rec.name,
							 | 
						|
								                        'city': rec.city,
							 | 
						|
								                        'user_id': rec.user_id.id,
							 | 
						|
								                        'weather': rec.weather,
							 | 
						|
								                        'description': rec.description,
							 | 
						|
								                        'temp': rec.temp,
							 | 
						|
								                        'pressure': rec.pressure,
							 | 
						|
								                        'humidity': rec.humidity,
							 | 
						|
								                        'min_temp': rec.min_temp,
							 | 
						|
								                        'max_temp': rec.max_temp,
							 | 
						|
								                        'issue': '',
							 | 
						|
								                    }
							 | 
						|
								                    return vals
							 | 
						|
								            else:
							 | 
						|
								                get_weather = self.get_weather(user_id)
							 | 
						|
								                if get_weather['issue'] == 'bad_request':
							 | 
						|
								                    return {
							 | 
						|
								                        'issue': 'Bad Request'
							 | 
						|
								                    }
							 | 
						|
								                elif get_weather['issue'] == 'internet':
							 | 
						|
								                    return {
							 | 
						|
								                        'issue': 'Connection ERROR.!'
							 | 
						|
								                    }
							 | 
						|
								                elif get_weather['issue'] == 'localization':
							 | 
						|
								                    return {
							 | 
						|
								                        'issue': 'Set correct Location'
							 | 
						|
								                    }
							 | 
						|
								                elif get_weather['issue'] == 'config':
							 | 
						|
								                    return {
							 | 
						|
								                        'issue': 'Weather configuration not set yet.'
							 | 
						|
								                    }
							 | 
						|
								                elif get_weather['issue'] == 'timezone':
							 | 
						|
								                    return {
							 | 
						|
								                        'issue': 'Timezone is not available'
							 | 
						|
								                    }
							 | 
						|
								                else:
							 | 
						|
								                    rec = self.search([('user_id', '=', user_id)], limit=1)
							 | 
						|
								                    if rec:
							 | 
						|
								                        vals = {
							 | 
						|
								                            'date_now': current_date,
							 | 
						|
								                            'date_weather_update': rec.date_weather_update,
							 | 
						|
								                            'name': rec.name,
							 | 
						|
								                            'city': rec.city,
							 | 
						|
								                            'user_id': rec.user_id.id,
							 | 
						|
								                            'weather': rec.weather,
							 | 
						|
								                            'description': rec.description,
							 | 
						|
								                            'temp': rec.temp,
							 | 
						|
								                            'pressure': rec.pressure,
							 | 
						|
								                            'humidity': rec.humidity,
							 | 
						|
								                            'min_temp': rec.min_temp,
							 | 
						|
								                            'max_temp': rec.max_temp,
							 | 
						|
								                            'issue': '',
							 | 
						|
								                        }
							 | 
						|
								                        return vals
							 | 
						|
								                    else:
							 | 
						|
								                        return {
							 | 
						|
								                            'issue': 'Bad request'
							 | 
						|
								                        }
							 | 
						|
								
							 | 
						|
								        else:
							 | 
						|
								            return {
							 | 
						|
								                'issue': 'Timezone is not available'
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								    def get_weather(self, user_id):
							 | 
						|
								        rec = self.env['user.weather.map.config'].search([('user_id', '=', user_id)], limit=1)
							 | 
						|
								        if rec:
							 | 
						|
								            weather_path = 'http://api.openweathermap.org/data/2.5/weather?'
							 | 
						|
								            if rec.u_longitude and rec.u_latitude:
							 | 
						|
								                    params = urllib.urlencode(
							 | 
						|
								                        {'lat': rec.u_latitude, 'lon': rec.u_longitude, 'APPID': rec.appid})
							 | 
						|
								            elif rec.city:
							 | 
						|
								                params = urllib.urlencode(
							 | 
						|
								                    {'q': rec.city, 'APPID': rec.appid})
							 | 
						|
								            else:
							 | 
						|
								                return {
							 | 
						|
								                            'issue': 'localization'
							 | 
						|
								                        }
							 | 
						|
								
							 | 
						|
								            url = weather_path + params
							 | 
						|
								            try:
							 | 
						|
								                f = urllib.urlopen(url)
							 | 
						|
								            except Exception:
							 | 
						|
								                f = False
							 | 
						|
								            if f:
							 | 
						|
								                ret = f.read().decode('utf-8')
							 | 
						|
								                result = json.loads(ret)
							 | 
						|
								                if result:
							 | 
						|
								                    if "cod" in result.keys():
							 | 
						|
								                        if result['cod'] == 200:
							 | 
						|
								                            city = False
							 | 
						|
								                            city2 = False
							 | 
						|
								                            if "name" in result.keys():
							 | 
						|
								                                city = result['name']
							 | 
						|
								                            if not city:
							 | 
						|
								                                if rec.method == 'address':
							 | 
						|
								                                    city = rec.city
							 | 
						|
								                            if rec.method == 'address':
							 | 
						|
								                                    city2 = rec.city
							 | 
						|
								
							 | 
						|
								                            temp = pytemperature.k2c(result['main']['temp'])
							 | 
						|
								                            min_temp = pytemperature.k2c(result['main']['temp_min'])
							 | 
						|
								                            max_temp = pytemperature.k2c(result['main']['temp_max'])
							 | 
						|
								                            weather_rec = self.search([('user_id', '=', rec.user_id.id)])
							 | 
						|
								                            now_utc = datetime.now(timezone('UTC'))
							 | 
						|
								                            user_list = self.env['res.users'].search([('id', '=', user_id)])
							 | 
						|
								                            if user_list.partner_id.tz:
							 | 
						|
								                                tz = pytz.timezone(user_list.partner_id.tz)
							 | 
						|
								                                now_pacific = now_utc.astimezone(timezone(str(tz)))
							 | 
						|
								                                current_time = now_pacific.strftime('%d %B %Y, %I:%M%p')
							 | 
						|
								                                vals = {
							 | 
						|
								                                    'date_weather_update': current_time,
							 | 
						|
								                                    'name': city,
							 | 
						|
								                                    'city': city2,
							 | 
						|
								                                    'user_id': user_id,
							 | 
						|
								                                    'weather': result['weather'][0]['main'],
							 | 
						|
								                                    'description': result['weather'][0]['description'],
							 | 
						|
								                                    'temp': temp,
							 | 
						|
								                                    'pressure': result['main']['pressure'],
							 | 
						|
								                                    'humidity': result['main']['humidity'],
							 | 
						|
								                                    'min_temp': min_temp,
							 | 
						|
								                                    'max_temp': max_temp,
							 | 
						|
								                                }
							 | 
						|
								                                if weather_rec:
							 | 
						|
								                                    weather_rec.write(vals)
							 | 
						|
								                                    return {
							 | 
						|
								                                        'issue': ''
							 | 
						|
								                                    }
							 | 
						|
								                                else:
							 | 
						|
								                                    weather_rec.create(vals)
							 | 
						|
								                                    return {
							 | 
						|
								                                        'issue': ''
							 | 
						|
								                                    }
							 | 
						|
								                            else:
							 | 
						|
								                                return {
							 | 
						|
								                                    'issue': 'timezone'
							 | 
						|
								                                }
							 | 
						|
								                        else:
							 | 
						|
								                            return {
							 | 
						|
								                                'issue': 'localization'
							 | 
						|
								                            }
							 | 
						|
								                else:
							 | 
						|
								                    return {
							 | 
						|
								                        'issue': 'bad_request'
							 | 
						|
								                    }
							 | 
						|
								            else:
							 | 
						|
								                return {
							 | 
						|
								                    'issue': 'internet'
							 | 
						|
								                }
							 | 
						|
								        else:
							 | 
						|
								            return {
							 | 
						|
								                'issue': 'config'
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class UserWeatherMapConfig(models.Model):
							 | 
						|
								    _name = 'user.weather.map.config'
							 | 
						|
								    _inherit = 'res.config.settings'
							 | 
						|
								    _rec_name = 'user_id'
							 | 
						|
								
							 | 
						|
								    def _default_street(self):
							 | 
						|
								        rec = self.search([('user_id', '=', self.env.user.id)])
							 | 
						|
								        if rec:
							 | 
						|
								            return rec.street
							 | 
						|
								
							 | 
						|
								    def _default_city(self):
							 | 
						|
								        rec = self.search([('user_id', '=', self.env.user.id)])
							 | 
						|
								        if rec:
							 | 
						|
								            return rec.city
							 | 
						|
								
							 | 
						|
								    def _default_state_id(self):
							 | 
						|
								        rec = self.search([('user_id', '=', self.env.user.id)])
							 | 
						|
								        if rec:
							 | 
						|
								            return rec.state_id.id
							 | 
						|
								
							 | 
						|
								    def _default_country_id(self):
							 | 
						|
								        rec = self.search([('user_id', '=', self.env.user.id)])
							 | 
						|
								        if rec:
							 | 
						|
								            return rec.country_id.id
							 | 
						|
								
							 | 
						|
								    def _default_zip(self):
							 | 
						|
								        rec = self.search([('user_id', '=', self.env.user.id)])
							 | 
						|
								        if rec:
							 | 
						|
								            return rec.zip
							 | 
						|
								
							 | 
						|
								    def _default_appid(self):
							 | 
						|
								        rec = self.search([('user_id', '=', self.env.user.id)])
							 | 
						|
								        if rec:
							 | 
						|
								            return rec.appid
							 | 
						|
								
							 | 
						|
								    def _default_method(self):
							 | 
						|
								        rec = self.search([('user_id', '=', self.env.user.id)])
							 | 
						|
								        if rec:
							 | 
						|
								            return rec.method
							 | 
						|
								        else:
							 | 
						|
								            return 'address'
							 | 
						|
								
							 | 
						|
								    def _default_longitude(self):
							 | 
						|
								        rec = self.search([('user_id', '=', self.env.user.id)])
							 | 
						|
								        if rec:
							 | 
						|
								            if rec.method == 'coordinates':
							 | 
						|
								                return rec.u_longitude
							 | 
						|
								            else:
							 | 
						|
								                return ''
							 | 
						|
								
							 | 
						|
								    def _default_latitude(self):
							 | 
						|
								        rec = self.search([('user_id', '=', self.env.user.id)])
							 | 
						|
								        if rec:
							 | 
						|
								            if rec.method == 'coordinates':
							 | 
						|
								                return rec.u_latitude
							 | 
						|
								            else:
							 | 
						|
								                return ''
							 | 
						|
								
							 | 
						|
								    user_id = fields.Many2one('res.users', string='User Name', readonly=True, default=lambda self: self.env.user.id)
							 | 
						|
								    u_longitude = fields.Char(string='Longitude', default=_default_longitude)
							 | 
						|
								    u_latitude = fields.Char(string='Latitude', default=_default_latitude)
							 | 
						|
								
							 | 
						|
								    street = fields.Char('Street', default=_default_street)
							 | 
						|
								    zip = fields.Char('Zip', size=24, change_default=True, default=_default_zip)
							 | 
						|
								    city = fields.Char('City', default=_default_city)
							 | 
						|
								    state_id = fields.Many2one("res.country.state", string='State', ondelete='restrict', default=_default_state_id)
							 | 
						|
								    country_id = fields.Many2one('res.country', string='Country', ondelete='restrict', default=_default_country_id)
							 | 
						|
								    appid = fields.Char('App id', default=_default_appid, required=True,
							 | 
						|
								                        help="Just sign up the OpenWeatherMap. Generate a Weather Key and provide here.")
							 | 
						|
								    method = fields.Selection([('address', 'By Address'),
							 | 
						|
								                               ('coordinates', 'By geolocation')], string='Type', default=_default_method)
							 | 
						|
								
							 | 
						|
								    @api.multi
							 | 
						|
								    def onchange_state(self, state_id):
							 | 
						|
								        if state_id:
							 | 
						|
								            state = self.env['res.country.state'].browse(state_id)
							 | 
						|
								            return {'value': {'country_id': state.country_id.id}}
							 | 
						|
								        return {}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    @api.multi
							 | 
						|
								    def execute_weather(self):
							 | 
						|
								        val = 0
							 | 
						|
								        recs = self.search([('user_id', '=', self.user_id.id)])
							 | 
						|
								        for rec1 in recs:
							 | 
						|
								            if val < rec1.id:
							 | 
						|
								                val = rec1.id
							 | 
						|
								        for rec2 in recs:
							 | 
						|
								            if val != rec2.id:
							 | 
						|
								                rec2.unlink()
							 | 
						|
								        if self.method == 'address':
							 | 
						|
								            self.geo_localize()
							 | 
						|
								        else:
							 | 
						|
								            pass
							 | 
						|
								        self.env['user.weather.map'].get_weather(self.user_id.id)
							 | 
						|
								        return {
							 | 
						|
								            'type': 'ir.actions.act_url',
							 | 
						|
								            'url': '/web',
							 | 
						|
								            'target': 'self',
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								    def geo_query_address(self, street=None, zip=None, city=None, state=None, country=None):
							 | 
						|
								        if country and ',' in country and (country.endswith(' of') or country.endswith(' of the')):
							 | 
						|
								            # put country qualifier in front, otherwise GMap gives wrong results,
							 | 
						|
								            # e.g. 'Congo, Democratic Republic of the' => 'Democratic Republic of the Congo'
							 | 
						|
								            country = '{1} {0}'.format(*country.split(',', 1))
							 | 
						|
								        return tools.ustr(', '.join(filter(None, [street,
							 | 
						|
								                                                  ("%s %s" % (zip or '', city or '')).strip(),
							 | 
						|
								                                                  state,
							 | 
						|
								                                                  country])))
							 | 
						|
								
							 | 
						|
								    def geo_find(self, addr):
							 | 
						|
								        url = 'https://maps.googleapis.com/maps/api/geocode/json?sensor=false&address='
							 | 
						|
								        url += urllib.quote(addr.encode('utf8'))
							 | 
						|
								        try:
							 | 
						|
								            result = json.load(urllib.urlopen(url))
							 | 
						|
								        except Exception, e:
							 | 
						|
								            raise odoo.exceptions.except_orm(_('Network error'),
							 | 
						|
								                                 _('Cannot contact geolocation servers. '
							 | 
						|
								                                   'Please make sure that your internet connection is up and running (%s).') % e)
							 | 
						|
								        if result['status'] != 'OK':
							 | 
						|
								            return None
							 | 
						|
								
							 | 
						|
								        try:
							 | 
						|
								            geo = result['results'][0]['geometry']['location']
							 | 
						|
								            return float(geo['lat']), float(geo['lng'])
							 | 
						|
								        except (KeyError, ValueError):
							 | 
						|
								            return None
							 | 
						|
								
							 | 
						|
								    @api.one
							 | 
						|
								    def geo_localize(self):
							 | 
						|
								        # Don't pass context to browse()! We need country names in english below
							 | 
						|
								        result = self.geo_find(self.geo_query_address(street=self.street,
							 | 
						|
								                                                      zip=self.zip,
							 | 
						|
								                                                      city=self.city,
							 | 
						|
								                                                      state=self.state_id.name,
							 | 
						|
								                                                      country=self.country_id.name))
							 | 
						|
								        if result:
							 | 
						|
								            self.write({
							 | 
						|
								                           'u_latitude': result[0],
							 | 
						|
								                           'u_longitude': result[1],
							 | 
						|
								                       }, )
							 | 
						|
								        else:
							 | 
						|
								            if self.method == 'address':
							 | 
						|
								                self.write({
							 | 
						|
								                    'u_latitude': '',
							 | 
						|
								                    'u_longitude': '',
							 | 
						|
								                }, )
							 | 
						|
								        return True
							 | 
						|
								
							 |