From 03cd28a7812e4f6f6412ed66dc554d6a53a3676f Mon Sep 17 00:00:00 2001 From: Brian Simpson Date: Tue, 24 Sep 2013 11:15:56 -0400 Subject: [PATCH] VDate: rework to use earliest and latest rather than future and past. More flexible and easier to understand. --- r2/r2/controllers/promotecontroller.py | 15 ++++++------ r2/r2/lib/errors.py | 4 ++-- r2/r2/lib/validator/validator.py | 33 ++++++++++---------------- r2/r2/templates/promotelinkform.html | 4 ++-- 4 files changed, 25 insertions(+), 31 deletions(-) diff --git a/r2/r2/controllers/promotecontroller.py b/r2/r2/controllers/promotecontroller.py index 2c1d656d3..b91a902f0 100644 --- a/r2/r2/controllers/promotecontroller.py +++ b/r2/r2/controllers/promotecontroller.py @@ -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 diff --git a/r2/r2/lib/errors.py b/r2/r2/lib/errors.py index d06bb6322..067657d1f 100644 --- a/r2/r2/lib/errors.py +++ b/r2/r2/lib/errors.py @@ -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)")), diff --git a/r2/r2/lib/validator/validator.py b/r2/r2/lib/validator/validator.py index 0f809d377..7a9fa8019 100644 --- a/r2/r2/lib/validator/validator.py +++ b/r2/r2/lib/validator/validator.py @@ -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) diff --git a/r2/r2/templates/promotelinkform.html b/r2/r2/templates/promotelinkform.html index 299bbb4bb..f3dcc2d63 100644 --- a/r2/r2/templates/promotelinkform.html +++ b/r2/r2/templates/promotelinkform.html @@ -293,9 +293,9 @@ ${self.javascript_setup()} ${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")}