annotate sat/tools/common/date_utils.py @ 3728:b15644cae50d

component AP gateway: JID/node ⟺ AP outbox conversion: - convert a combination of JID and optional pubsub node to AP actor handle (see `getJIDAndNode` for details) and vice versa - the gateway now provides a Pubsub service - retrieve pubsub node and convert it to AP collection, AP pagination is converted to RSM - do the opposite: convert AP collection to pubsub and handle RSM request. Due to ActivityStream collection pagination limitations, some RSM request produce inefficient requests, but caching should be used most of the time in the future and avoid the problem. - set specific name to HTTP Server - new `local_only` setting (`True` by default) to indicate if the gateway can request or not XMPP Pubsub nodes from other servers - disco info now specifies important features such as Pubsub RSM, and nodes metadata ticket 363
author Goffi <goffi@goffi.org>
date Tue, 25 Jan 2022 17:54:06 +0100
parents bef32f3ccc06
children 92482cc80d0b
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
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
22 from sat.core.constants import Const as C
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
23 from sat.core.i18n import _
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
2797
7968c8b7b5e1 tools (common): fixed dateutil.parser import
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
25 from dateutil import tz, parser
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
26 from dateutil.relativedelta import relativedelta
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
27 from dateutil.utils import default_tzinfo
3629
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
28 from dateutil.parser import ParserError
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
29 from babel import dates
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
30 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
31 import time
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
32 import re
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
33
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
34 RELATIVE_RE = re.compile(r"(?P<date>.*?)(?P<direction>[-+]?) *(?P<quantity>\d+) *"
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
35 r"(?P<unit>(second|sec|s|minute|min|month|mo|m|hour|hr|h|day|d"
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
36 r"|week|w|year|yr|y))s?"
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
37 r"(?P<ago> +ago)?", re.I)
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
38 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
39 "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
40 "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
41 "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
42 "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
43 "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
44 "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
45 "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
46 "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
47 "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
48 "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
49 "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
50 }
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
51 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
52 TZ_UTC = tz.tzutc()
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
53 TZ_LOCAL = tz.gettz()
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
54 # used to replace values when something is missing
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
55 DEFAULT_DATETIME = datetime.datetime(2000, 0o1, 0o1)
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
56
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
57
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
58 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
59 """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
60
2797
7968c8b7b5e1 tools (common): fixed dateutil.parser import
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
61 @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
62 @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
63 @return (int): timestamp
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
64 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
65 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
66 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
67
3629
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
68 try:
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
69 dt = default_tzinfo(
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
70 parser.parse(value, default=DEFAULT_DATETIME, dayfirst=dayfirst),
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
71 default_tz)
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
72 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
73 if value == "now":
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
74 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
75 else:
025ea418032f tools (common/date_utils): parse `now` alone (when used without relative delta)
Goffi <goffi@goffi.org>
parents: 3518
diff changeset
76 raise e
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
77 return calendar.timegm(dt.utctimetuple())
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
78
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
79 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
80 """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
81
2797
7968c8b7b5e1 tools (common): fixed dateutil.parser import
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
82 @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
83 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
84 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
85 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
86 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
87 "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
88 @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
89 @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
90 """
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
91 m = RELATIVE_RE.match(value)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
92 if m is None:
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
93 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
94
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
95 if m.group("direction") and m.group("ago"):
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
96 raise ValueError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
97 _("You can't use a direction (+ or -) and \"ago\" at the same time"))
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
98
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
99 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
100 direction = -1
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
101 else:
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
102 direction = 1
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
103
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
104 date = m.group("date").strip().lower()
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
105 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
106 dt = datetime.datetime.now(tz.tzutc())
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
107 else:
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
108 dt = default_tzinfo(parser.parse(date, dayfirst=True), default_tz)
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
109
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2825
diff changeset
110 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
111 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
112 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
113 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
114 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
115 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
116 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
117 dt = dt + relativedelta(**delta_kw)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
118 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
119
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
120
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
121 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
122 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
123 """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
124
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
125 @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
126 @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
127 - 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
128 - 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
129 - 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
130 - 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
131 - 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
132 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
133 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
134 - 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
135 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
136 - 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
137 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
138 - 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
139 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
140 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
141 (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
142 @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
143 @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
144 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
145 @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
146 @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
147 than limit
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
148 @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
149 @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
150
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 """
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
152 timestamp = float(timestamp)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
153 if fmt == "auto_day":
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
154 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
155 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
156 if auto_limit == 0:
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
157 now = datetime.datetime.now(tz_info)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
158 # 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
159 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
160 tzinfo=now.tzinfo)
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
161 today = calendar.timegm(today.utctimetuple())
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
162 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
163 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
164 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
165 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
166 else:
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
167 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
168 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
169 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
170 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
171 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
172
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
173 if fmt == "relative":
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
174 delta = timestamp - time.time()
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
175 return dates.format_timedelta(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
176 delta, granularity="minute", add_direction=True, locale=locale_str
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
177 )
3518
b258dce27d6d tools (common/date_utils): fix `date_only` for `short`, `long` and `full` format
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
178 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
179 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
180 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
181 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
182 else:
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
183 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
184 tzinfo=tz_info)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
185 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
186 if date_only:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
187 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
188 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
189 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
190 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
191 else:
2703
3ba53b1cd1e6 tools (common/date_utils): date_parse_ext + timezone handling:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
192 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
193 tzinfo=tz_info)