From 4e159bc4d5e34ebd4985af9038ffc4e3a2e2735d Mon Sep 17 00:00:00 2001 From: Nicolas Joyard Date: Fri, 10 Feb 2017 11:55:36 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20formats=20de=20date=20suppl=C3=A9mentai?= =?UTF-8?q?res?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- parlapi/rest/endpoint.py | 19 ++++++++++++++++++- parlapi/templates/rest_api_doc.html | 4 ++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/parlapi/rest/endpoint.py b/parlapi/rest/endpoint.py index d7c51ec..9d64da8 100644 --- a/parlapi/rest/endpoint.py +++ b/parlapi/rest/endpoint.py @@ -11,6 +11,22 @@ from sqlalchemy.sql import not_ from .schema import SchemaFactory +def parse_datetime(string): + formats = [ + '%Y-%m-%d', + '%Y-%m-%dT%H:%M', + '%Y-%m-%dT%H:%M:%S' + ] + + for f in formats: + try: + return datetime.strptime(string, f) + except ValueError, exc: + pass + + raise exc + + class EndpointException(Exception): pass @@ -21,7 +37,8 @@ class Endpoint(object): 'Integer': int, 'Unicode': lambda x: x, 'Boolean': lambda x: x.lower() in ('true', 'yes', '1'), - 'Date': lambda x: datetime.strptime(x, '%Y-%m-%d').date() + 'Date': lambda x: parse_datetime(x).date(), + 'DateTime': lambda x: parse_datetime(x), } def __init__(self, api, ma, model, description=None, hidden=False): diff --git a/parlapi/templates/rest_api_doc.html b/parlapi/templates/rest_api_doc.html index e2e7b6a..614cbc3 100644 --- a/parlapi/templates/rest_api_doc.html +++ b/parlapi/templates/rest_api_doc.html @@ -11,7 +11,7 @@ Suivant les champs utilisés, différents types de valeurs sont requis : * Pour les champs de type texte, n'importe quelle chaine de caractère peut être utilisée * Pour les champs numériques, seuls des chiffres peuvent être utilisés -* Pour les champs de type date, la date doit être au format `AAAA-MM-JJ` +* Pour les champs de type date, la date doit être dans l'un des formats `aaaa-mm-jj`, `aaaa-mm-jjThh:mm` ou `aaaa-mm-jjThh:mm:ss` * Pour les champs de type booléen, les valeurs `true`, `yes`, `1` sont considérées comme vraies, toutes les autres comme fausses Il est possible de spécifier un opérateur de comparaison sous la forme `champ__operateur=valeur`. Les opérateurs suivants sont disponibles : @@ -24,7 +24,7 @@ Il est possible de spécifier un opérateur de comparaison sous la forme `champ_ * `in`, `nin`: valeur parmi une liste ou absente d'une liste (les valeurs doivent alors être séparées par des virgules) * `like`, `ilike`: comparaison de chaine avec jokers ; `ilike` est insensible à la casse (par exemple `prenom__ilike=jean%` cherche tous les prénoms commençant par "Jean") -La requête suivante permet par exemple de lister les acteurs décédés, dont le prénom contient "Jean", et nés après le 1er janvier 1945 : [`/rest/an/acteurs/?prenom__ilike=%jean%&date_deces__isnull=false&date_naissance__gt=1945-01-01`](/rest/an/acteurs/?prenom__ilike=%jean%&date_deces__isnull=false&date_naissance__gt=1945-01-01) +La requête suivante permet par exemple de lister les acteurs décédés, dont le prénom contient "Jean", et nés après le 1er janvier 1945 à midi : [`/rest/an/acteurs/?prenom__ilike=%jean%&date_deces__isnull=false&date_naissance__gt=1945-01-01T12:00`](/rest/an/acteurs/?prenom__ilike=%jean%&date_deces__isnull=false&date_naissance__gt=1945-01-01T12:00) ##### Recherche *full-text* -- 2.26.2