annotate sat/tools/common/date_utils.py @ 3983:31c3d6652115

component AP gateway: ignore actor delection notifications: When a `Delete` activity was received and the object was the emitting actor itself, the signature checking was failing if the actor was unknown (due to the impossibility to retrieve the actor public key, as it is no more accessible). To avoid that, those notifications are ignored for now. In the future they should clean the cache linked to this actor.
author Goffi <goffi@goffi.org>
date Tue, 15 Nov 2022 18:15:16 +0100
parents 92482cc80d0b
children 883db2790b11
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
3
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # SAT: a jabber client
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
6
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
11
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
16
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
19
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
20 """tools to help manipulating time and dates"""
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
21
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
22 from typing import Union
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
23 import calendar
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
24 import datetime
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
25 import re
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
26 import time
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
27
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
28 from babel import dates
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
29 from dateutil import parser, tz
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
30 from dateutil.parser import ParserError
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
31 from dateutil.relativedelta import relativedelta
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
32 from dateutil.utils import default_tzinfo
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
33
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
34 from sat.core import exceptions
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
35 from sat.core.constants import Const as C
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
36 from sat.core.i18n import _
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
37
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
38 RELATIVE_RE = re.compile(
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
39 r"\s*(?P<in>\bin\b)?"
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
40 r"(?P<date>[^+-].+[^\s+-])?\s*(?P<direction>[-+])?\s*"
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
41 r"\s*(?P<quantity>\d+)\s*"
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
42 r"(?P<unit>(second|sec|s|minute|min|month|mo|m|hour|hr|h|day|d|week|w|year|yr|y))s?"
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
43 r"(?P<ago>\s+ago)?\s*",
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
44 re.I
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
45 )
3599
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
46 TIME_SYMBOL_MAP = {
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
47 "s": "second",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
48 "sec": "second",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
49 "m": "minute",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
50 "min": "minute",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
51 "h": "hour",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
52 "hr": "hour",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
53 "d": "day",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
54 "w": "week",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
55 "mo": "month",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
56 "y": "year",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
57 "yr": "year",
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
58 }
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
59 YEAR_FIRST_RE = re.compile(r"\d{4}[^\d]+")
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
60 TZ_UTC = tz.tzutc()
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
61 TZ_LOCAL = tz.gettz()
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
62
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
63
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
64 def date_parse(value, default_tz=TZ_UTC):
2612
3e4e78de9cca tools (date_utils): moved date_parse to common.date_utils, because it can be used in frontends
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
65 """Parse a date and return corresponding unix timestamp
3e4e78de9cca tools (date_utils): moved date_parse to common.date_utils, because it can be used in frontends
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
66
2797
7968c8b7b5e1 tools (common): fixed dateutil.parser import
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
67 @param value(unicode): date to parse, in any format supported by parser
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
68 @param default_tz(datetime.tzinfo): default timezone
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
69 @return (int): timestamp
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
70 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
71 value = str(value).strip()
2825
1b6547fb80da tools(common/date_utils): fixed order on year first + set default date for date_parse
Goffi <goffi@goffi.org>
parents: 2797
diff changeset
72 dayfirst = False if YEAR_FIRST_RE.match(value) else True
1b6547fb80da tools(common/date_utils): fixed order on year first + set default date for date_parse
Goffi <goffi@goffi.org>
parents: 2797
diff changeset
73
3629
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
74 try:
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
75 dt = default_tzinfo(
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
76 parser.parse(value, dayfirst=dayfirst),
3629
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
77 default_tz)
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
78 except ParserError as e:
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
79 if value == "now":
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
80 dt = datetime.datetime.now(tz.tzutc())
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
81 else:
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
82 try:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
83 # the date may already be a timestamp
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
84 return int(value)
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
85 except ValueError:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
86 raise e
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
87 return calendar.timegm(dt.utctimetuple())
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
88
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
89 def date_parse_ext(value, default_tz=TZ_UTC):
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
90 """Extended date parse which accept relative date
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
91
2797
7968c8b7b5e1 tools (common): fixed dateutil.parser import
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
92 @param value(unicode): date to parse, in any format supported by parser
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
93 and with the hability to specify X days/weeks/months/years in the past or future.
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
94 Relative date are specified either with something like `[main_date] +1 week`
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
95 or with something like `3 days ago`, and it is case insensitive. [main_date] is
2797
7968c8b7b5e1 tools (common): fixed dateutil.parser import
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
96 a date parsable by parser, or empty to specify current date/time.
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
97 "now" can also be used to specify current date/time.
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
98 @param default_tz(datetime.tzinfo): same as for date_parse
2612
3e4e78de9cca tools (date_utils): moved date_parse to common.date_utils, because it can be used in frontends
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
99 @return (int): timestamp
3e4e78de9cca tools (date_utils): moved date_parse to common.date_utils, because it can be used in frontends
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
100 """
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
101 m = RELATIVE_RE.match(value)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
102 if m is None:
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
103 return date_parse(value, default_tz=default_tz)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
104
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
105 if sum(1 for g in ("direction", "in", "ago") if m.group(g)) > 1:
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
106 raise ValueError(
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
107 _('You can use only one of direction (+ or -), "in" and "ago"'))
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
108
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
109 if m.group("direction") == '-' or m.group("ago"):
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
110 direction = -1
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
111 else:
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
112 direction = 1
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
113
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
114 date = m.group("date")
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
115 if date is not None:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
116 date = date.strip()
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
117 if not date or date == "now":
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
118 dt = datetime.datetime.now(tz.tzutc())
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
119 else:
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
120 try:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
121 dt = default_tzinfo(parser.parse(date, dayfirst=True), default_tz)
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
122 except ParserError as e:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
123 try:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
124 timestamp = int(date)
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
125 except ValueError:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
126 raise e
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
127 else:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
128 dt = datetime.datetime.fromtimestamp(timestamp, tz.tzutc())
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
129
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
130 quantity = int(m.group("quantity"))
3599
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
131 unit = m.group("unit").lower()
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
132 try:
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
133 unit = TIME_SYMBOL_MAP[unit]
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
134 except KeyError:
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
135 pass
ab1fe6b25631 tools (common/date_utils): accept more units (shortcuts) + fix timezone when date with relative delta is used
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
136 delta_kw = {f"{unit}s": direction * quantity}
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
137 dt = dt + relativedelta(**delta_kw)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
138 return calendar.timegm(dt.utctimetuple())
2612
3e4e78de9cca tools (date_utils): moved date_parse to common.date_utils, because it can be used in frontends
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
139
3e4e78de9cca tools (date_utils): moved date_parse to common.date_utils, because it can be used in frontends
Goffi <goffi@goffi.org>
parents: 2599
diff changeset
140
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
141 def date_fmt(timestamp, fmt="short", date_only=False, auto_limit=7, auto_old_fmt="short",
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
142 auto_new_fmt="relative", locale_str=C.DEFAULT_LOCALE, tz_info=TZ_UTC):
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
143 """format date according to locale
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
144
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
145 @param timestamp(basestring, float): unix time
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
146 @param fmt(str): one of:
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
147 - short: e.g. u'31/12/17'
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
148 - medium: e.g. u'Apr 1, 2007'
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
149 - long: e.g. u'April 1, 2007'
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
150 - full: e.g. u'Sunday, April 1, 2007'
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
151 - relative: format in relative time
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
152 e.g.: 3 hours
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
153 note that this format is not precise
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
154 - iso: ISO 8601 format
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
155 e.g.: u'2007-04-01T19:53:23Z'
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
156 - auto: use auto_old_fmt if date is older than auto_limit
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
157 else use auto_new_fmt
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
158 - auto_day: shorcut to set auto format with change on day
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
159 old format will be short, and new format will be time only
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
160 or a free value which is passed to babel.dates.format_datetime
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
161 (see http://babel.pocoo.org/en/latest/dates.html?highlight=pattern#pattern-syntax)
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
162 @param date_only(bool): if True, only display date (not datetime)
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
163 @param auto_limit (int): limit in days before using auto_old_fmt
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
164 use 0 to have a limit at last midnight (day change)
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
165 @param auto_old_fmt(unicode): format to use when date is older than limit
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
166 @param auto_new_fmt(unicode): format to use when date is equal to or more recent
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
167 than limit
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
168 @param locale_str(unicode): locale to use (as understood by babel)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
169 @param tz_info(datetime.tzinfo): time zone to use
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
170
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
171 """
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
172 timestamp = float(timestamp)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
173 if fmt == "auto_day":
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
174 fmt, auto_limit, auto_old_fmt, auto_new_fmt = "auto", 0, "short", "HH:mm"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
175 if fmt == "auto":
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
176 if auto_limit == 0:
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
177 now = datetime.datetime.now(tz_info)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
178 # we want to use given tz_info, so we don't use date() or today()
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
179 today = datetime.datetime(year=now.year, month=now.month, day=now.day,
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
180 tzinfo=now.tzinfo)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
181 today = calendar.timegm(today.utctimetuple())
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
182 if timestamp < today:
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
183 fmt = auto_old_fmt
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
184 else:
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
185 fmt = auto_new_fmt
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
186 else:
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
187 days_delta = (time.time() - timestamp) / 3600
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
188 if days_delta > (auto_limit or 7):
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
189 fmt = auto_old_fmt
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
190 else:
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
191 fmt = auto_new_fmt
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
192
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
193 if fmt == "relative":
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
194 delta = timestamp - time.time()
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
195 return dates.format_timedelta(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
196 delta, granularity="minute", add_direction=True, locale=locale_str
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
197 )
3518
b258dce27d6d tools (common/date_utils): fix `date_only` for `short`, `long` and `full` format
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
198 elif fmt in ("short", "long", "full"):
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
199 if date_only:
3518
b258dce27d6d tools (common/date_utils): fix `date_only` for `short`, `long` and `full` format
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
200 dt = datetime.datetime.fromtimestamp(timestamp, tz_info)
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
201 return dates.format_date(dt, format=fmt, locale=locale_str)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
202 else:
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
203 return dates.format_datetime(timestamp, format=fmt, locale=locale_str,
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
204 tzinfo=tz_info)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
205 elif fmt == "iso":
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
206 if date_only:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
207 fmt = "yyyy-MM-dd"
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
208 else:
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
209 fmt = "yyyy-MM-ddTHH:mm:ss'Z'"
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
210 return dates.format_datetime(timestamp, format=fmt)
2599
5b26033c49a8 tools (common): moved date_fmt function from template filters to new date_utils module, so it can be used everywhere.
Goffi <goffi@goffi.org>
parents:
diff changeset
211 else:
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
212 return dates.format_datetime(timestamp, format=fmt, locale=locale_str,
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
213 tzinfo=tz_info)
3905
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
214
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
215
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
216 def delta2human(start_ts: Union[float, int], end_ts: Union[float, int]) -> str:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
217 """Convert delta of 2 unix times to human readable text
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
218
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
219 @param start_ts: timestamp of starting time
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
220 @param end_ts: timestamp of ending time
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
221 """
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
222 if end_ts < start_ts:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
223 raise exceptions.InternalError(
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
224 "end timestamp must be bigger or equal to start timestamp !"
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
225 )
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
226 rd = relativedelta(
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
227 datetime.datetime.fromtimestamp(end_ts),
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
228 datetime.datetime.fromtimestamp(start_ts)
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
229 )
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
230 text_elems = []
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
231 for unit in ("years", "months", "days", "hours", "minutes"):
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
232 value = getattr(rd, unit)
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
233 if value == 1:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
234 # we remove final "s" when there is only 1
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
235 text_elems.append(f"1 {unit[:-1]}")
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
236 elif value > 1:
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
237 text_elems.append(f"{value} {unit}")
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
238
92482cc80d0b tools (common/date_utils) handle timestamp and `in` + `delta2human`:
Goffi <goffi@goffi.org>
parents: 3631
diff changeset
239 return ", ".join(text_elems)