Example #1
0
    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))
Example #2
0
    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
Example #3
0
    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))
Example #4
0
 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")
Example #5
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
Example #6
0
 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')
Example #7
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)
Example #8
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)
Example #9
0
    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))
Example #10
0
    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)
Example #11
0
    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)
Example #12
0
    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)
Example #13
0
    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