diff --git a/openerp/service/common.py b/openerp/service/common.py index 0e6adae0082..212cb292c6e 100644 --- a/openerp/service/common.py +++ b/openerp/service/common.py @@ -53,9 +53,6 @@ def exp_about(extended=False): return info, openerp.release.version return info -def exp_timezone_get(db, login, password): - return openerp.tools.misc.get_server_timezone() - def exp_set_loglevel(loglevel, logger=None): # TODO Previously, the level was set on the now deprecated # `openerp.netsvc.Logger` class. diff --git a/openerp/tools/config.py b/openerp/tools/config.py index eca4d2a5222..1d0be528cbe 100644 --- a/openerp/tools/config.py +++ b/openerp/tools/config.py @@ -48,16 +48,6 @@ class MyOption (optparse.Option, object): self.my_default = attrs.pop('my_default', None) super(MyOption, self).__init__(*opts, **attrs) - -def check_ssl(): - try: - from OpenSSL import SSL - import socket - - return hasattr(socket, 'ssl') and hasattr(SSL, "Connection") - except: - return False - DEFAULT_LOG_HANDLER = [':INFO'] def _get_default_datadir(): @@ -101,7 +91,6 @@ class configmanager(object): self.misc = {} self.config_file = fname - self.has_ssl = check_ssl() self._LOGLEVELS = dict([ (getattr(loglevels, 'LOG_%s' % x), getattr(logging, x)) @@ -148,24 +137,6 @@ class configmanager(object): help="specify the TCP port for longpolling requests", type="int") parser.add_option_group(group) - # XML-RPC / HTTPS - title = "XML-RPC Secure Configuration" - if not self.has_ssl: - title += " (disabled as ssl is unavailable)" - - group = optparse.OptionGroup(parser, title) - group.add_option("--xmlrpcs-interface", dest="xmlrpcs_interface", my_default='', - help="Specify the TCP IP address for the XML-RPC Secure protocol. The empty string binds to all interfaces.") - group.add_option("--xmlrpcs-port", dest="xmlrpcs_port", my_default=8071, - help="specify the TCP port for the XML-RPC Secure protocol", type="int") - group.add_option("--no-xmlrpcs", dest="xmlrpcs", action="store_false", my_default=True, - help="disable the XML-RPC Secure protocol") - group.add_option("--cert-file", dest="secure_cert_file", my_default='server.cert', - help="specify the certificate file for the SSL connection") - group.add_option("--pkey-file", dest="secure_pkey_file", my_default='server.pkey', - help="specify the private key file for the SSL connection") - parser.add_option_group(group) - # WEB group = optparse.OptionGroup(parser, "Web interface Configuration") group.add_option("--db-filter", dest="dbfilter", my_default='.*', @@ -271,8 +242,6 @@ class configmanager(object): group.add_option('--debug', dest='debug_mode', action='store_true', my_default=False, help='enable debug mode') group.add_option("--stop-after-init", action="store_true", dest="stop_after_init", my_default=False, help="stop the server after its initialization") - group.add_option("-t", "--timezone", dest="timezone", my_default=False, - help="specify reference timezone for the server (e.g. Europe/Brussels") group.add_option("--osv-memory-count-limit", dest="osv_memory_count_limit", my_default=False, help="Force a limit on the maximum number of records kept in the virtual " "osv_memory tables. The default is False, which means no count-based limit.", @@ -399,9 +368,8 @@ class configmanager(object): 'db_port', 'db_template', 'logfile', 'pidfile', 'smtp_port', 'email_from', 'smtp_server', 'smtp_user', 'smtp_password', 'db_maxconn', 'import_partial', 'addons_path', - 'xmlrpc', 'syslog', 'without_demo', 'timezone', - 'xmlrpcs_interface', 'xmlrpcs_port', 'xmlrpcs', - 'secure_cert_file', 'secure_pkey_file', 'dbfilter', 'log_handler', 'log_level', 'log_db', + 'xmlrpc', 'syslog', 'without_demo', + 'dbfilter', 'log_handler', 'log_level', 'log_db', 'geoip_database', ] @@ -422,7 +390,7 @@ class configmanager(object): 'language', 'translate_out', 'translate_in', 'overwrite_existing_translations', 'debug_mode', 'dev_mode', 'smtp_ssl', 'load_language', 'stop_after_init', 'logrotate', 'without_demo', 'xmlrpc', 'syslog', - 'list_db', 'xmlrpcs', 'proxy_mode', + 'list_db', 'proxy_mode', 'test_file', 'test_enable', 'test_commit', 'test_report_directory', 'osv_memory_count_limit', 'osv_memory_age_limit', 'max_cron_threads', 'unaccent', 'data_dir', @@ -468,28 +436,6 @@ class configmanager(object): self.options['translate_modules'] = opt.translate_modules and map(lambda m: m.strip(), opt.translate_modules.split(',')) or ['all'] self.options['translate_modules'].sort() - # TODO checking the type of the parameters should be done for every - # parameters, not just the timezone. - # The call to get_server_timezone() sets the timezone; this should - # probably done here. - if self.options['timezone']: - # Prevent the timezone to be True. (The config file parsing changes - # the string 'True' to the boolean value True. It would be probably - # be better to remove that conversion.) - die(not isinstance(self.options['timezone'], basestring), - "Invalid timezone value in configuration or environment: %r.\n" - "Please fix this in your configuration." %(self.options['timezone'])) - - # If an explicit TZ was provided in the config, make sure it is known - try: - import pytz - pytz.timezone(self.options['timezone']) - except pytz.UnknownTimeZoneError: - die(True, "The specified timezone (%s) is invalid" % self.options['timezone']) - except: - # If pytz is missing, don't check the provided TZ, it will be ignored anyway. - pass - if opt.pg_path: self.options['pg_path'] = opt.pg_path diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py index c3d168663b8..210063a10cb 100644 --- a/openerp/tools/misc.py +++ b/openerp/tools/misc.py @@ -740,90 +740,6 @@ def detect_ip_addr(): ip_addr = 'localhost' return ip_addr -# RATIONALE BEHIND TIMESTAMP CALCULATIONS AND TIMEZONE MANAGEMENT: -# The server side never does any timestamp calculation, always -# sends them in a naive (timezone agnostic) format supposed to be -# expressed within the server timezone, and expects the clients to -# provide timestamps in the server timezone as well. -# It stores all timestamps in the database in naive format as well, -# which also expresses the time in the server timezone. -# For this reason the server makes its timezone name available via the -# common/timezone_get() rpc method, which clients need to read -# to know the appropriate time offset to use when reading/writing -# times. -def get_win32_timezone(): - """Attempt to return the "standard name" of the current timezone on a win32 system. - @return the standard name of the current win32 timezone, or False if it cannot be found. - """ - res = False - if sys.platform == "win32": - try: - import _winreg - hklm = _winreg.ConnectRegistry(None,_winreg.HKEY_LOCAL_MACHINE) - current_tz_key = _winreg.OpenKey(hklm, r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation", 0,_winreg.KEY_ALL_ACCESS) - res = str(_winreg.QueryValueEx(current_tz_key,"StandardName")[0]) # [0] is value, [1] is type code - _winreg.CloseKey(current_tz_key) - _winreg.CloseKey(hklm) - except Exception: - pass - return res - -def detect_server_timezone(): - """Attempt to detect the timezone to use on the server side. - Defaults to UTC if no working timezone can be found. - @return the timezone identifier as expected by pytz.timezone. - """ - try: - import pytz - except Exception: - _logger.warning("Python pytz module is not available. " - "Timezone will be set to UTC by default.") - return 'UTC' - - # Option 1: the configuration option (did not exist before, so no backwards compatibility issue) - # Option 2: to be backwards compatible with 5.0 or earlier, the value from time.tzname[0], but only if it is known to pytz - # Option 3: the environment variable TZ - sources = [ (config['timezone'], 'OpenERP configuration'), - (time.tzname[0], 'time.tzname'), - (os.environ.get('TZ',False),'TZ environment variable'), ] - # Option 4: OS-specific: /etc/timezone on Unix - if os.path.exists("/etc/timezone"): - tz_value = False - try: - f = open("/etc/timezone") - tz_value = f.read(128).strip() - except Exception: - pass - finally: - f.close() - sources.append((tz_value,"/etc/timezone file")) - # Option 5: timezone info from registry on Win32 - if sys.platform == "win32": - # Timezone info is stored in windows registry. - # However this is not likely to work very well as the standard name - # of timezones in windows is rarely something that is known to pytz. - # But that's ok, it is always possible to use a config option to set - # it explicitly. - sources.append((get_win32_timezone(),"Windows Registry")) - - for (value,source) in sources: - if value: - try: - tz = pytz.timezone(value) - _logger.info("Using timezone %s obtained from %s.", tz.zone, source) - return value - except pytz.UnknownTimeZoneError: - _logger.info("The timezone specified in %s (%s) is invalid, ignoring it.", source, value) - - _logger.info("No valid timezone could be detected, using default UTC " - "timezone. You can specify it explicitly with option 'timezone' in " - "the server configuration.") - return 'UTC' - -def get_server_timezone(): - return "UTC" - - DEFAULT_SERVER_DATE_FORMAT = "%Y-%m-%d" DEFAULT_SERVER_TIME_FORMAT = "%H:%M:%S" DEFAULT_SERVER_DATETIME_FORMAT = "%s %s" % ( @@ -945,54 +861,6 @@ def posix_to_ldml(fmt, locale): return ''.join(buf) -def server_to_local_timestamp(src_tstamp_str, src_format, dst_format, dst_tz_name, - tz_offset=True, ignore_unparsable_time=True): - """ - Convert a source timestamp string into a destination timestamp string, attempting to apply the - correct offset if both the server and local timezone are recognized, or no - offset at all if they aren't or if tz_offset is false (i.e. assuming they are both in the same TZ). - - WARNING: This method is here to allow formatting dates correctly for inclusion in strings where - the client would not be able to format/offset it correctly. DO NOT use it for returning - date fields directly, these are supposed to be handled by the client!! - - @param src_tstamp_str: the str value containing the timestamp in the server timezone. - @param src_format: the format to use when parsing the server timestamp. - @param dst_format: the format to use when formatting the resulting timestamp for the local/client timezone. - @param dst_tz_name: name of the destination timezone (such as the 'tz' value of the client context) - @param ignore_unparsable_time: if True, return False if src_tstamp_str cannot be parsed - using src_format or formatted using dst_format. - - @return local/client formatted timestamp, expressed in the local/client timezone if possible - and if tz_offset is true, or src_tstamp_str if timezone offset could not be determined. - """ - if not src_tstamp_str: - return False - - res = src_tstamp_str - if src_format and dst_format: - # find out server timezone - server_tz = get_server_timezone() - try: - # dt_value needs to be a datetime.datetime object (so no time.struct_time or mx.DateTime.DateTime here!) - dt_value = datetime.strptime(src_tstamp_str, src_format) - if tz_offset and dst_tz_name: - try: - import pytz - src_tz = pytz.timezone(server_tz) - dst_tz = pytz.timezone(dst_tz_name) - src_dt = src_tz.localize(dt_value, is_dst=True) - dt_value = src_dt.astimezone(dst_tz) - except Exception: - pass - res = dt_value.strftime(dst_format) - except Exception: - # Normal ways to end up here are if strptime or strftime failed - if not ignore_unparsable_time: - return False - return res - - def split_every(n, iterable, piece_maker=tuple): """Splits an iterable into length-n pieces. The last piece will be shorter if ``n`` does not evenly divide the iterable length.