vigiboard / vigiboard / lib / dateformat.py @ c94dc931
History | View | Annotate | Download (2.77 KB)
1 | 27140946 | Francois POIROTTE | # -*- coding: utf-8 -*-
|
---|---|---|---|
2 | c94dc931 | Francois POIROTTE | # Copyright (C) 2006-2020 CS-SI
|
3 | b373a5de | Aurelien BOMPARD | # License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
|
4 | |||
5 | 27140946 | Francois POIROTTE | """
|
6 | Validateur et convertisseur de dates selon un format.
|
||
7 | """
|
||
8 | from formencode.api import FancyValidator, Invalid |
||
9 | from datetime import datetime |
||
10 | |||
11 | 02c4a1e7 | Francois POIROTTE | from tg.i18n import ugettext as _, get_lang |
12 | 27140946 | Francois POIROTTE | |
13 | 00ece25a | Francois POIROTTE | def get_calendar_lang(): |
14 | import tg |
||
15 | |||
16 | # TODO: Utiliser le champ "language" du modèle pour cet utilisateur ?
|
||
17 | # On récupère la langue du navigateur de l'utilisateur
|
||
18 | lang = get_lang() |
||
19 | if not lang: |
||
20 | lang = tg.config['lang']
|
||
21 | else:
|
||
22 | lang = lang[0]
|
||
23 | |||
24 | # TODO: Il faudrait gérer les cas où tout nous intéresse dans "lang".
|
||
25 | # Si l'identifiant de langage est composé (ex: "fr_FR"),
|
||
26 | # on ne récupère que la 1ère partie.
|
||
27 | lang = lang.replace('_', '-') |
||
28 | lang = lang.split('-')[0] |
||
29 | return lang
|
||
30 | |||
31 | def get_date_format(): |
||
32 | # @HACK: nécessaire car l_() retourne un object LazyString
|
||
33 | # qui n'est pas sérialisable en JSON.
|
||
34 | 24182db6 | Francois POIROTTE | # TRANSLATORS: Format de date et heure Python/JavaScript.
|
35 | # TRANSLATORS: http://www.dynarch.com/static/jscalendar-1.0/doc/html/reference.html#node_sec_5.3.5
|
||
36 | # TRANSLATORS: http://docs.python.org/release/2.5/lib/module-time.html
|
||
37 | 00ece25a | Francois POIROTTE | return _('%Y-%m-%d %I:%M:%S %p').encode('utf-8') |
38 | |||
39 | 27140946 | Francois POIROTTE | class DateFormatConverter(FancyValidator): |
40 | """
|
||
41 | Valide une date selon un format identique à ceux
|
||
42 | acceptés par la fonction strptime().
|
||
43 | """
|
||
44 | messages = { |
||
45 | 'invalid': 'Invalid value', |
||
46 | } |
||
47 | |||
48 | def _to_python(self, value, state): |
||
49 | if not isinstance(value, basestring): |
||
50 | raise Invalid(self.message('invalid', state), value, state) |
||
51 | |||
52 | str_date = value.lower() |
||
53 | if isinstance(str_date, unicode): |
||
54 | str_date = str_date.encode('utf-8')
|
||
55 | |||
56 | try:
|
||
57 | 24182db6 | Francois POIROTTE | # On tente d'interpréter la saisie de l'utilisateur
|
58 | # selon un format date + heure.
|
||
59 | date = datetime.strptime(str_date, get_date_format()) |
||
60 | 8b2edebe | Aurelien BOMPARD | except ValueError: |
61 | 24182db6 | Francois POIROTTE | try:
|
62 | # 2è essai : on essaye d'interpréter uniquement une date.
|
||
63 | # TRANSLATORS: Format de date Python/JavaScript.
|
||
64 | # TRANSLATORS: http://www.dynarch.com/static/jscalendar-1.0/doc/html/reference.html#node_sec_5.3.5
|
||
65 | # TRANSLATORS: http://docs.python.org/release/2.5/lib/module-time.html
|
||
66 | date = datetime.strptime(str_date, _('%Y-%m-%d').encode('utf8')) |
||
67 | except ValueError: |
||
68 | raise Invalid(self.message('invalid', state), value, state) |
||
69 | 27140946 | Francois POIROTTE | return date
|
70 | |||
71 | def _from_python(self, value, state): |
||
72 | if not isinstance(value, datetime): |
||
73 | raise Invalid(self.message('invalid', state), value, state) |
||
74 | |||
75 | # Même format que pour _to_python.
|
||
76 | 24182db6 | Francois POIROTTE | return datetime.strftime(value, get_date_format()).decode('utf-8') |