mirror of
https://github.com/reddit-archive/reddit.git
synced 2026-01-28 08:17:58 -05:00
VDate: rework to use earliest and latest rather than future and past.
More flexible and easier to understand.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)")),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user