Better format for month and week in reports

It is better to manage the formatting of those field on the server side to
ensure it doesn't depend on any local number formatting.
So we extract into an internal Char field the values (to ease searcher code)
and we format the using Python format via a Function field.

issue5274
review20691002
This commit is contained in:
Cédric Krier committed 2016-02-02 19:54:28 +01:00
1 parent 4f72756bd9
commit aedd6ee674
1 file changed
+37 -5
+37 -5
View File
@@ -5,7 +5,7 @@ import datetime
from sql import Literal
from sql.aggregate import Max, Sum
from sql.functions import Extract
from sql.functions import Extract, CharLength
from trytond.model import ModelView, ModelSQL, fields
from trytond.wizard import Wizard, StateView, StateAction, Button
@@ -246,7 +246,9 @@ class HoursEmployeeWeekly(ModelSQL, ModelView):
'Hours per Employee per Week'
__name__ = 'timesheet.hours_employee_weekly'
year = fields.Char('Year', select=True)
week = fields.Integer('Week', select=True)
week_internal = fields.Char('Week', select=True)
week = fields.Function(fields.Char('Week'),
'get_week', searcher='search_week')
employee = fields.Many2One('company.employee', 'Employee', select=True)
duration = fields.TimeDelta('Duration', 'company_work_time')
@@ -264,7 +266,9 @@ class HoursEmployeeWeekly(ModelSQL, ModelView):
line = Line.__table__()
type_name = cls.year.sql_type().base
year_column = Extract('YEAR', line.date).cast(type_name).as_('year')
week_column = Extract('WEEK', line.date).as_('week')
type_name = cls.week_internal.sql_type().base
week_column = Extract('WEEK', line.date).cast(type_name).as_(
'week_internal')
return line.select(
Max(Extract('WEEK', line.date)
+ Extract('YEAR', line.date) * 100
@@ -279,12 +283,26 @@ class HoursEmployeeWeekly(ModelSQL, ModelView):
Sum(line.duration).as_('duration'),
group_by=(year_column, week_column, line.employee))
def get_week(self, name):
return '%02i' % int(self.week_internal)
@classmethod
def search_week(self, name, domain):
return [('week_internal',) + tuple(domain[1:])]
@classmethod
def order_week(cls, tables):
table, _ = tables[None]
return [CharLength(table.week_internal), table.week_internal]
class HoursEmployeeMonthly(ModelSQL, ModelView):
'Hours per Employee per Month'
__name__ = 'timesheet.hours_employee_monthly'
year = fields.Char('Year', select=True)
month = fields.Integer('Month', select=True)
month_internal = fields.Char('Month', select=True)
month = fields.Function(fields.Char('Month'),
'get_month', searcher='search_month')
employee = fields.Many2One('company.employee', 'Employee', select=True)
duration = fields.TimeDelta('Duration', 'company_work_time')
@@ -302,7 +320,9 @@ class HoursEmployeeMonthly(ModelSQL, ModelView):
line = Line.__table__()
type_name = cls.year.sql_type().base
year_column = Extract('YEAR', line.date).cast(type_name).as_('year')
month_column = Extract('MONTH', line.date).as_('month')
type_name = cls.month_internal.sql_type().base
month_column = Extract('MONTH', line.date).cast(type_name).as_(
'month_internal')
return line.select(
Max(Extract('MONTH', line.date)
+ Extract('YEAR', line.date) * 100
@@ -316,3 +336,15 @@ class HoursEmployeeMonthly(ModelSQL, ModelView):
line.employee,
Sum(line.duration).as_('duration'),
group_by=(year_column, month_column, line.employee))
def get_month(self, name):
return '%02i' % int(self.month_internal)
@classmethod
def search_month(self, name, domain):
return [('month_internal',) + tuple(domain[1:])]
@classmethod
def order_month(cls, tables):
table, _ = tables[None]
return [CharLength(table.month_internal), table.month_internal]