2015-04-25 3 views
3

После нескольких дней поиска и попыток использования pytz и других инструментов я не могу найти решение.GNU Health - ошибки часовых поясов

Когда пользователь создает распечатки из списка лекарства в GNU Здоровье дается ошибка:

====== ERROR=======================     
Traceback (most recent call last): 
File "/trytond/protocols/jsonrpc.py", line 150, in _marshaled_dispatch 
response['result'] = dispatch_method(method, params) 
File "/trytond/protocols/jsonrpc.py", line 179, in _dispatch 
res = dispatch(*args) 
File "/trytond/protocols/dispatcher.py", line 161, in dispatch 
result = rpc.result(meth(*c_args, **c_kwargs)) 
File "/trytond/report/report.py", line 144, in execute 
type, data = cls.parse(action_report, records, data, {}) 
File "/trytond/modules/health/report/health_report.py", line 62, in   parse 
localcontext['print_date'] = get_print_date() 
File "/trytond/modules/health/report/health_report.py", line 42, in get_print_date 
return datetime.astimezone((dt.replace(tzinfo=None)) 
TypeError: astimezone() argument 1 must be datetime.tzinfo, not None     
============END================= 

Я не знаю, как исправить эту проблему

+1

что 'datetime.astimezone ((dt.replace (tzinfo = None))' должен делать –

+0

? @PadraicCunningham: Я бы понял, нужно ли поднимать: 'ValueError: astimezone() нельзя применить к наивному datetime', тогда это будет эквивалентно ' dt.replace (tzinfo = None) .astimezone() 'but' TypeError' предлагает 'datetime.now (timezone.utc) .astimezone (tz = None)' как код (до Python 3.3+ , где пустой аргумент помечен как локальный часовой пояс: ['.astimezone (tz)': * Изменено в версии 3.3: tz теперь можно опустить *] (https://docs.python.org/3/library/datetime.html#datetime.dateti me.astimezone). Во всяком случае, это плохой стиль для использования 'klass.method (obj, * args)' вместо 'obj.method (* args)'. – jfs

ответ

1

Вот the current code for get_print_date():

def get_print_date(): 
    Company = Pool().get('company.company') 

    timezone = None 
    company_id = Transaction().context.get('company') 
    if company_id: 
     company = Company(company_id) 
     if company.timezone: 
      timezone = pytz.timezone(company.timezone) 

    dt = datetime.now() 
    return datetime.astimezone(dt.replace(tzinfo=pytz.utc), timezone) 

Кажется, он пытается (неправильно, если TZ=UTC - вы должны представить отчет об ошибке), чтобы сделать следующее:

import tzlocal # $ pip install tzlocal 

def get_print_date(): 
    Company = Pool().get('company.company') 
    company_id = Transaction().context.get('company') 
    company = company_id and Company(company_id) 
    timezone = company and company.timezone and pytz.timezone(company.timezone) 
    return datetime.now(timezone or tzlocal.get_localzone()) 

т. Е. Оно либо возвращает текущее время в часовой пояс company, либо в ваш местный часовой пояс.

+0

Это имеет смысл, я не мог следить за тем, что происходило вообще в трассе. –

0

Вы настроили часовой пояс своего учреждения/компании?

Вы можете проверить/установить часовой пояс компании в партии -> Конфигурация -> Предприятии -> Timezone