VDate: rework to use earliest and latest rather than future and past.

More flexible and easier to understand.
This commit is contained in:
Brian Simpson
2013-09-24 11:15:56 -04:00
parent 2f1746aaa0
commit 03cd28a781
4 changed files with 25 additions and 31 deletions

View File

@@ -107,8 +107,8 @@ from r2.models import (
def _check_dates(dates):
params = ('startdate', 'enddate')
error_types = (errors.BAD_DATE,
errors.BAD_FUTURE_DATE,
errors.BAD_PAST_DATE,
errors.DATE_TOO_EARLY,
errors.DATE_TOO_LATE,
errors.BAD_DATE_RANGE,
errors.DATE_RANGE_TOO_LARGE)
for error_case in itertools.product(error_types, params):
@@ -509,7 +509,7 @@ class PromoteController(ListingController):
@validatedForm(VSponsor('link_id'),
VModhash(),
dates=VDateRange(['startdate', 'enddate'],
future=1,
earliest=promote.promo_datetime_now(offset=1),
reference_date=promote.promo_datetime_now,
business_days=True,
sponsor_override=True),
@@ -539,14 +539,15 @@ class PromoteController(ListingController):
future = make_offset_date(now, g.min_promote_future,
business_days=True)
if start < future.date():
c.errors.add(errors.BAD_FUTURE_DATE,
msg_params=dict(day=g.min_promote_future),
day = promote.promo_datetime_now(offset=g.min_promote_future)
day = date.strftime("%m/%d/%Y")
c.errors.add(errors.DATE_TOO_EARLY, msg_params=dict(day=day),
field="startdate")
if (form.has_errors('startdate', errors.BAD_DATE,
errors.BAD_FUTURE_DATE) or
errors.DATE_TOO_EARLY) or
form.has_errors('enddate', errors.BAD_DATE,
errors.BAD_FUTURE_DATE, errors.BAD_DATE_RANGE)):
errors.DATE_TOO_EARLY, errors.BAD_DATE_RANGE)):
return
# Limit the number of PromoCampaigns a Link can have

View File

@@ -83,8 +83,8 @@ error_list = dict((
('BAD_DATE', _('please provide a date of the form mm/dd/yyyy')),
('BAD_DATE_RANGE', _('the dates need to be in order and not identical')),
('DATE_RANGE_TOO_LARGE', _('you must choose a date range of less than %(days)s days')),
('BAD_FUTURE_DATE', _('please enter a date at least %(day)s days in the future')),
('BAD_PAST_DATE', _('please enter a date at least %(day)s days in the past')),
('DATE_TOO_LATE', _('please enter a date %(day)s or earlier')),
('DATE_TOO_EARLY', _('please enter a date %(day)s or later')),
('BAD_ADDRESS', _('address problem: %(message)s')),
('BAD_CARD', _('card problem: %(message)s')),
('TOO_LONG', _("this is too long (max: %(max_length)s)")),

View File

@@ -1809,24 +1809,21 @@ class VDate(Validator):
"""
Date checker that accepts string inputs.
Optional parameters include 'past' and 'future' which specify how
far (in days) into the past or future the date must be to be
acceptable.
NOTE: the 'future' param will have precidence during evaluation.
Optional parameters 'earliest' and 'latest' specify the acceptable date
range (dates are inclusive).
Error conditions:
* BAD_DATE on mal-formed date strings (strptime parse failure)
* BAD_FUTURE_DATE and BAD_PAST_DATE on respective range errors.
* DATE_TOO_EARLY and DATE_TOO_LATE on range errors.
"""
def __init__(self, param, future=None, past = None,
def __init__(self, param, earliest=None, latest=None,
sponsor_override = False,
reference_date = lambda : datetime.now(g.tz),
business_days = False,
format = "%m/%d/%Y"):
self.future = future
self.past = past
self.earliest = earliest
self.latest = latest
# are weekends to be exluded from the interval?
self.business_days = business_days
@@ -1846,17 +1843,13 @@ class VDate(Validator):
try:
date = datetime.strptime(date, self.format)
if not override:
# can't put in __init__ since we need the date on the fly
future = utils.make_offset_date(now, self.future,
business_days = self.business_days)
past = utils.make_offset_date(now, self.past, future = False,
business_days = self.business_days)
if self.future is not None and date.date() < future.date():
self.set_error(errors.BAD_FUTURE_DATE,
{"day": self.future})
elif self.past is not None and date.date() > past.date():
self.set_error(errors.BAD_PAST_DATE,
{"day": self.past})
if self.earliest and not date.date() >= self.earliest.date():
self.set_error(errors.DATE_TOO_EARLY,
{'day': self.earliest.strftime(self.format)})
if (self.latest and not date.date() <= self.latest.date()):
self.set_error(errors.DATE_TOO_LATE,
{'day': self.latest.strftime(self.format)})
return date.replace(tzinfo=g.tz)
except (ValueError, TypeError):
self.set_error(errors.BAD_DATE)

View File

@@ -293,9 +293,9 @@ ${self.javascript_setup()}
</%self:datepicker>
${error_field("BAD_DATE", "startdate", "div")}
${error_field("BAD_FUTURE_DATE", "startdate", "div")}
${error_field("DATE_TOO_EARLY", "startdate", "div")}
${error_field("BAD_DATE", "enddate", "div")}
${error_field("BAD_FUTURE_DATE", "enddate", "div")}
${error_field("DATE_TOO_EARLY", "enddate", "div")}
${error_field("BAD_DATE_RANGE", "enddate", "div")}
</td>
</tr>