def value_to_html(self, value, options): if not value: return '' lang = self.user_lang() locale = babel.Locale.parse(lang.code) if isinstance(value, str): value = fields.Datetime.from_string(value) value = fields.Datetime.context_timestamp(self, value) if options and 'format' in options: pattern = options['format'] else: if options and options.get('time_only'): strftime_pattern = (u"%s" % (lang.time_format)) else: strftime_pattern = (u"%s %s" % (lang.date_format, lang.time_format)) pattern = posix_to_ldml(strftime_pattern, locale=locale) if options and options.get('hide_seconds'): pattern = pattern.replace(":ss", "").replace(":s", "") return pycompat.to_text(babel.dates.format_datetime(value, format=pattern, locale=locale))
def attributes(self, record, field_name, options, values): attrs = super(DateTime, self).attributes(record, field_name, options, values) if options.get('inherit_branding'): value = record[field_name] lg = self.env['res.lang']._lang_get( self.env.user.lang) or get_lang(self.env) locale = babel_locale_parse(lg.code) babel_format = value_format = posix_to_ldml( '%s %s' % (lg.date_format, lg.time_format), locale=locale) tz = record.env.context.get('tz') or self.env.user.tz if isinstance(value, str): value = fields.Datetime.from_string(value) if value: # convert from UTC (server timezone) to user timezone value = fields.Datetime.context_timestamp( self.with_context(tz=tz), timestamp=value) value_format = pycompat.to_text( babel.dates.format_datetime(value, format=babel_format, locale=locale)) value = fields.Datetime.to_string(value) attrs['data-oe-original'] = value attrs['data-oe-original-with-format'] = value_format attrs['data-oe-original-tz'] = tz return attrs
def value_to_html(self, value, options): if not value: return '' lang = self.user_lang() locale = babel.Locale.parse(lang.code) if isinstance(value, pycompat.string_types): value = fields.Datetime.from_string(value) value = fields.Datetime.context_timestamp(self, value) if options and 'format' in options: pattern = options['format'] else: if options and options.get('time_only'): strftime_pattern = (u"%s" % (lang.time_format)) else: strftime_pattern = (u"%s %s" % (lang.date_format, lang.time_format)) pattern = posix_to_ldml(strftime_pattern, locale=locale) if options and options.get('hide_seconds'): pattern = pattern.replace(":ss", "").replace(":s", "") return pycompat.to_text(babel.dates.format_datetime(value, format=pattern, locale=locale))
def test_due_list(self, move_type="out_invoice"): move_form = Form( self.env["account.move"].with_context(default_move_type=move_type)) move_form.partner_id = self.partner move_form.invoice_payment_term_id = self.payment_term_normal with move_form.invoice_line_ids.new() as line_form: line_form.product_id = self.product_id line_form.price_unit = 100.0 invoice = move_form.save() self.assertFalse(invoice.multi_due) invoice.invoice_payment_term_id = self.payment_term_multi invoice.action_post() self.assertTrue(invoice.multi_due) self.assertEqual(len(invoice.multi_date_due.split()), 2) due_date = fields.date.today() + timedelta(days=60) lg = self.env["res.lang"]._lang_get(self.env.user.lang) locale = babel.Locale.parse(lg.code) babel_format = posix_to_ldml(lg.date_format, locale=locale) date_due_format = pycompat.to_text( babel.dates.format_date(due_date, format=babel_format, locale=locale)) res = (self.env["ir.actions.report"]._get_report_from_name( "account.report_invoice")._render_qweb_html(invoice.ids)) self.assertRegex(str(res[0]), date_due_format) self.assertRegex(str(res[0]), "75.0")
def attributes(self, record, field_name, options, values): attrs = super(Date, self).attributes(record, field_name, options, values) if options.get('inherit_branding'): attrs['data-oe-original'] = record[field_name] if record._fields[field_name].type == 'datetime': attrs = self.env['ir.qweb.field.datetime'].attributes( record, field_name, options, values) attrs['data-oe-type'] = 'datetime' return attrs lg = self.env['res.lang']._lang_get( self.env.user.lang) or get_lang(self.env) locale = babel_locale_parse(lg.code) babel_format = value_format = posix_to_ldml(lg.date_format, locale=locale) if record[field_name]: date = fields.Date.from_string(record[field_name]) value_format = pycompat.to_text( babel.dates.format_date(date, format=babel_format, locale=locale)) attrs['data-oe-original-with-format'] = value_format return attrs
def test_due_list(self): invoice = self.env['account.invoice'].create({ 'partner_id': self.partner.id, 'payment_term_id': self.payment_term_normal.id, 'type': 'out_invoice', 'account_id': self.account.id, 'invoice_line_ids': [(0, 0, { 'product_id': self.product_id.id, 'price_unit': 100.0, 'account_id': self.other_account.id, 'name': self.product_id.name, })] }) self.assertFalse(invoice.multi_due) invoice.payment_term_id = self.payment_term_multi.id invoice._onchange_payment_term_date_invoice() invoice.action_invoice_open() self.assertTrue(invoice.multi_due) self.assertEqual(len(invoice.multi_date_due.split()), 2) due_date = fields.date.today() + timedelta(days=60) lg = self.env['res.lang']._lang_get(self.env.user.lang) locale = babel.Locale.parse(lg.code) babel_format = posix_to_ldml(lg.date_format, locale=locale) date_due_format = pycompat.to_text( babel.dates.format_date(due_date, format=babel_format, locale=locale)) res = self.env['ir.actions.report']._get_report_from_name( 'account.report_invoice').render_qweb_html(invoice.ids) self.assertRegexpMatches(str(res[0]), date_due_format) self.assertRegexpMatches(str(res[0]), '75.0')
def format_date(env, date, pattern=False): date = datetime.datetime.strptime(date[:10], tools.DEFAULT_SERVER_DATE_FORMAT) lang_code = env.context.get('lang') or 'en_US' if not pattern: lang = env['res.lang']._lang_get(lang_code) pattern = lang.date_format try: locale = babel.Locale.parse(lang_code) pattern = tools.posix_to_ldml(pattern, locale=locale) return babel.dates.format_date(date, format=pattern, locale=locale) except babel.core.UnknownLocaleError: return date.strftime(pattern)
def value_to_html(self, value, options): if not value: return '' options = options or {} lang = self.user_lang() locale = babel_locale_parse(lang.code) format_func = babel.dates.format_datetime if isinstance(value, str): value = fields.Datetime.from_string(value) value = fields.Datetime.context_timestamp(self, value) if options.get('tz_name'): tzinfo = babel.dates.get_timezone(options['tz_name']) else: tzinfo = None if 'format' in options: pattern = options['format'] else: if options.get('time_only'): strftime_pattern = (u"%s" % (lang.time_format)) elif options.get('date_only'): strftime_pattern = (u"%s" % (lang.date_format)) else: strftime_pattern = (u"%s %s" % (lang.date_format, lang.time_format)) pattern = posix_to_ldml(strftime_pattern, locale=locale) if options.get('hide_seconds'): pattern = pattern.replace(":ss", "").replace(":s", "") if options.get('time_only'): format_func = babel.dates.format_time return pycompat.to_text( format_func(value, format=pattern, tzinfo=tzinfo, locale=locale)) if options.get('date_only'): format_func = babel.dates.format_date return pycompat.to_text( format_func(value, format=pattern, locale=locale)) return pycompat.to_text( format_func(value, format=pattern, tzinfo=tzinfo, locale=locale))
def value_to_html(self, value, options): if not value or len(value) < 10: return '' lang = self.user_lang() locale = babel.Locale.parse(lang.code) if isinstance(value, str): value = fields.Datetime.from_string(value[:10]) if options and 'format' in options: pattern = options['format'] else: strftime_pattern = lang.date_format pattern = posix_to_ldml(strftime_pattern, locale=locale) return babel.dates.format_date(value, format=pattern, locale=locale)
def value_to_html(self, value, options): if not value or len(value) < 10: return '' lang = self.user_lang() locale = babel.Locale.parse(lang.code) if isinstance(value, basestring): value = fields.Datetime.from_string(value[:10]) if options and 'format' in options: pattern = options['format'] else: strftime_pattern = lang.date_format pattern = posix_to_ldml(strftime_pattern, locale=locale) return babel.dates.format_date(value, format=pattern, locale=locale)
def value_to_html(self, value, options): if not value or len(value) < 10: return '' lang = self.user_lang() locale = babel.Locale.parse(lang.code) if isinstance(value, basestring): if len(value) > 10: # datetime to be displayed as date value = fields.Datetime.from_string(value) value = fields.Datetime.context_timestamp(self, value) else: value = fields.Datetime.from_string(value) if options and 'format' in options: pattern = options['format'] else: strftime_pattern = lang.date_format pattern = posix_to_ldml(strftime_pattern, locale=locale) return babel.dates.format_date(value, format=pattern, locale=locale)
def value_to_html(self, value, options): if not value: return "" lang = self.user_lang() locale = babel.Locale.parse(lang.code) if isinstance(value, basestring): value = fields.Datetime.from_string(value) value = fields.Datetime.context_timestamp(self, value) if options and "format" in options: pattern = options["format"] else: strftime_pattern = u"%s %s" % (lang.date_format, lang.time_format) pattern = posix_to_ldml(strftime_pattern, locale=locale) if options and options.get("hide_seconds"): pattern = pattern.replace(":ss", "").replace(":s", "") return unicodifier(babel.dates.format_datetime(value, format=pattern, locale=locale))
def get_cmp_periods(self, display=False): if not self.comparison: return [] lang = self.env['res.lang']._lang_get( self._context.get('lang') or 'en_US') locale = babel.Locale.parse(lang.code) dt_to = datetime.strptime(self.date_to, "%Y-%m-%d") if self.get_report_obj().get_report_type().date_range: dt_from = self.date_from and datetime.strptime( self.date_from, "%Y-%m-%d" ) or self.env.user.company_id.compute_fiscalyear_dates( dt_to)['date_from'] columns = [] if self.date_filter_cmp == 'custom': if display: return [_('Comparison<br />') + self.get_cmp_date(), '%'] else: if not self.get_report_obj().get_report_type().date_range: return [[False, self.date_to_cmp]] return [[self.date_from_cmp, self.date_to_cmp]] if self.date_filter_cmp == 'same_last_year': columns = [] for k in xrange(0, self.periods_number): dt_to -= timedelta( days=366 if calendar.isleap(dt_to.year) else 365) if display: if not self.get_report_obj().get_report_type().date_range: columns += [ self.get_full_date_names( dt_to.strftime("%Y-%m-%d")) ] else: dt_from = dt_from.replace(year=dt_from.year - 1) columns += [ self.get_full_date_names( dt_to.strftime("%Y-%m-%d"), dt_from.strftime("%Y-%m-%d")) ] else: if not self.get_report_obj().get_report_type().date_range: columns += [[False, dt_to.strftime("%Y-%m-%d")]] else: dt_from = dt_from.replace(year=dt_from.year - 1) columns += [[ dt_from.strftime("%Y-%m-%d"), dt_to.strftime("%Y-%m-%d") ]] return columns if 'month' in self.date_filter: for k in xrange(0, self.periods_number): dt_to = dt_to.replace(day=1) dt_to -= timedelta(days=1) if display: columns += [ babel.dates.format_date(dt_to, format=posix_to_ldml( '%b %Y', locale=locale), locale=locale) ] else: if not self.get_report_obj().get_report_type().date_range: columns += [[False, dt_to.strftime("%Y-%m-%d")]] else: dt_from -= timedelta(days=1) dt_from = dt_from.replace(day=1) columns += [[ dt_from.strftime("%Y-%m-%d"), dt_to.strftime("%Y-%m-%d") ]] elif 'quarter' in self.date_filter: quarter = (dt_to.month - 1) / 3 + 1 year = dt_to.year for k in xrange(0, self.periods_number): if display: if quarter == 1: quarter = 4 year -= 1 else: quarter -= 1 columns += [ _('Quarter #') + str(quarter) + ' ' + str(year) ] else: if dt_to.month == 12: dt_to = dt_to.replace(month=9, day=30) elif dt_to.month == 9: dt_to = dt_to.replace(month=6, day=30) elif dt_to.month == 6: dt_to = dt_to.replace(month=3, day=31) else: dt_to = dt_to.replace(month=12, day=31, year=dt_to.year - 1) if not self.get_report_obj().get_report_type().date_range: columns += [[False, dt_to.strftime("%Y-%m-%d")]] else: if dt_from.month == 10: dt_from = dt_from.replace(month=7) elif dt_from.month == 7: dt_from = dt_from.replace(month=4) elif dt_from.month == 4: dt_from = dt_from.replace(month=1) else: dt_from = dt_from.replace(month=10, year=dt_from.year - 1) columns += [[ dt_from.strftime("%Y-%m-%d"), dt_to.strftime("%Y-%m-%d") ]] elif 'year' in self.date_filter: dt_to = datetime.strptime(self.date_to, "%Y-%m-%d") for k in xrange(0, self.periods_number): dt_to = dt_to.replace(year=dt_to.year - 1) if display: if dt_to.strftime("%m-%d") == '12-31': columns += [dt_to.year] else: columns += [ str(dt_to.year - 1) + ' - ' + str(dt_to.year) ] else: if not self.get_report_obj().get_report_type().date_range: columns += [[False, dt_to.strftime("%Y-%m-%d")]] else: dt_from = dt_to.replace(year=dt_to.year - 1) + timedelta(days=1) columns += [[ dt_from.strftime("%Y-%m-%d"), dt_to.strftime("%Y-%m-%d") ]] else: if self.get_report_obj().get_report_type().date_range: dt_from = datetime.strptime(self.date_from, "%Y-%m-%d") delta = dt_to - dt_from delta = timedelta(days=delta.days + 1) delta_days = delta.days for k in xrange(0, self.periods_number): dt_from -= delta dt_to -= delta if display: columns += [ _('%s - %s days ago') % ((k + 1) * delta_days, (k + 2) * delta_days) ] else: columns += [[ dt_from.strftime("%Y-%m-%d"), dt_to.strftime("%Y-%m-%d") ]] else: for k in xrange(0, self.periods_number): dt_to -= timedelta( days=calendar.monthrange(dt_to.year, dt_to.month)[1]) if display: columns += [ _('(as of %s)') % babel.dates.format_date( dt_to, format=posix_to_ldml('%d %b %Y', locale=locale), locale=locale) ] else: columns += [[False, dt_to.strftime("%Y-%m-%d")]] return columns