Skip to content

Instantly share code, notes, and snippets.

@brutus
Last active August 29, 2015 14:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brutus/194e3e4399006387cd70 to your computer and use it in GitHub Desktop.
Save brutus/194e3e4399006387cd70 to your computer and use it in GitHub Desktop.
Django DateTime Validator
from django.core.exceptions import ValidationError
from django.utils.deconstruct import deconstructible
@deconstructible
class DateValidator():
"""
Überprüft ob *ein Datum* vor oder nach einem gegebenen anderen Datum liegt.
Normalerweise wird überprüft, ob das Datum vor dem festgesetzen Zeitpunkt
liegt; es kann aber auch angegeben werden, das es nach dem Zeitpunkt liegen
muss (*after*).
Ausserdem muss das Datum wirklich vor oder nach dem angegebenen Zeitpunkt
liegen, sollen auch gleiche Zeitpunkte akzeptiert werden, muss das extra
angegeben werden (*equal*).
"""
MESSAGE = "Das angegebene Datum (%(value)s) muss {operator} dem '%(date)s' liegen."
MSG_BEFORE = 'vor'
MSG_AFTER = 'nach'
DATETIME_FORMAT = '%Y-%m-%d %H:%M'
def __init__(self, date, after=False, equal=False):
"""
Stores validator config.
*date* must either be a :cls:`datetime.datetime` object, or a callable
that returns such object.
If *after* is set, the checked date must be after the stored *date*
instead of before and if *equal* is set, equality is accepted.
"""
self.date = date
self.after = after
self.equal = equal
self.message = self.MESSAGE.format(
operator=self.MSG_AFTER if after else self.MSG_BEFORE
)
def __eq__(self, other):
if (
self.date == other.date and
self.after == other.after and
self.equal == other.equal
):
return True
return False
def __call__(self, value):
# get min/max date
try:
date = self.date()
except TypeError:
date = self.date
# check
if self.equal and value == date:
return
if self.after:
if value > date:
return
else:
if value < date:
return
raise ValidationError(
self.message, code='invalid', params={
'value': value.strftime(self.DATETIME_FORMAT),
'date': date.strftime(self.DATETIME_FORMAT)
}
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment