Created
September 22, 2017 12:28
-
-
Save ilyasProgrammer/11bbd33020dbb2385b49f2eecfe7db6e to your computer and use it in GitHub Desktop.
BaseModel methods replacement
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class BaseModelExtend(models.AbstractModel): | |
| _name = 'basemodel.extend' | |
| models.BaseModel._navigation = 'id' | |
| def _register_hook(self): | |
| @api.multi | |
| def _read_group_process_groupby(self, gb, query): | |
| split = gb.split(':') | |
| field_type = self._fields[split[0]].type | |
| gb_function = split[1] if len(split) == 2 else None | |
| temporal = field_type in ('date', 'datetime') | |
| tz_convert = field_type == 'datetime' and self._context.get('tz') in pytz.all_timezones | |
| qualified_field = self._inherits_join_calc(self._table, split[0], query) | |
| if temporal: | |
| display_formats = { | |
| # Careful with week/year formats: | |
| # - yyyy (lower) must always be used, *except* for week+year formats | |
| # - YYYY (upper) must always be used for week+year format | |
| # e.g. 2006-01-01 is W52 2005 in some locales (de_DE), | |
| # and W1 2006 for others | |
| # | |
| # Mixing both formats, e.g. 'MMM YYYY' would yield wrong results, | |
| # such as 2006-01-01 being formatted as "January 2005" in some locales. | |
| # Cfr: http://babel.pocoo.org/docs/dates/#date-fields | |
| 'hour': 'HH', # yyyy = normal year | |
| 'day': 'dd MMM yyyy', # yyyy = normal year | |
| 'week': "'W'w YYYY", # w YYYY = ISO week-year | |
| 'month': 'MMMM yyyy', | |
| 'quarter': 'QQQ yyyy', | |
| 'year': 'yyyy', | |
| } | |
| time_intervals = { | |
| 'hour': dateutil.relativedelta.relativedelta(hour=1), | |
| 'day': dateutil.relativedelta.relativedelta(days=1), | |
| 'week': datetime.timedelta(days=7), | |
| 'month': dateutil.relativedelta.relativedelta(months=1), | |
| 'quarter': dateutil.relativedelta.relativedelta(months=3), | |
| 'year': dateutil.relativedelta.relativedelta(years=1) | |
| } | |
| if tz_convert: | |
| qualified_field = "timezone('%s', timezone('UTC',%s))" % (self._context.get('tz', 'UTC'), qualified_field) | |
| qualified_field = "date_trunc('%s', %s)" % (gb_function or 'month', qualified_field) | |
| if field_type == 'boolean': | |
| qualified_field = "coalesce(%s,false)" % qualified_field | |
| return { | |
| 'field': split[0], | |
| 'groupby': gb, | |
| 'type': field_type, | |
| 'display_format': display_formats[gb_function or 'month'] if temporal else None, | |
| 'interval': time_intervals[gb_function or 'month'] if temporal else None, | |
| 'tz_convert': tz_convert, | |
| 'qualified_field': qualified_field | |
| } | |
| models.BaseModel._read_group_process_groupby = _read_group_process_groupby | |
| return super(BaseModelExtend, self)._register_hook() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment