def test_formats_other_years(self): testdate = datetime.strptime("1984/10/10", "%Y/%m/%d") expected = "October 10th, 1984" self.assertEquals(fuzzydate(testdate), expected)
def test_formats_current_year(self): now = datetime.now() testdate = datetime.strptime("%s/10/10" % now.year, "%Y/%m/%d") expected = "October 10th" self.assertEquals(fuzzydate(testdate, 1), expected)
def test_returns_tomorrow(self): tomorrow = datetime.now() + timedelta(hours=24) self.assertEquals(fuzzydate(tomorrow), "tomorrow")
def test_returns_today(self): today = datetime.now() self.assertEquals(fuzzydate(today), "today")
def test_returns_yesterday(self): yesterday = datetime.now() - timedelta(hours=24) self.assertEquals(fuzzydate(yesterday), "yesterday") two_days_ago = datetime.now() - timedelta(hours=48) self.assertNotEquals(fuzzydate(two_days_ago), "yesterday")
def super_fuzzydate(value): try: value = date(value.year, value.month, value.day) except AttributeError: # Passed value wasn't a date object return value except ValueError: # Date arguments out of range return value # today today = date.today() delta = value - today # get the easy values out of the way if delta.days == 0: return u"Today" elif delta.days == -1: return u"Yesterday" elif delta.days == 1: return u"Tomorrow" # if we're in the future... if value > today: end_of_week = today + timedelta(days=7 - today.isoweekday()) if value <= end_of_week: # return the name of the day (Wednesday) return u'this %s' % template.defaultfilters.date(value, "l") end_of_next_week = end_of_week + timedelta(weeks=1) if value <= end_of_next_week: # return the name of the day(Next Wednesday) return u"next %s" % template.defaultfilters.date(value, "l") end_of_month = today + timedelta(calendar.monthrange(today.year, today.month)[1] - today.day) if value <= end_of_month: # return the number of weeks (in two weeks) if value <= end_of_next_week + timedelta(weeks=1): return u"in two weeks" elif value <= end_of_next_week + timedelta(weeks=2): return u"in three weeks" elif value <= end_of_next_week + timedelta(weeks=3): return u"in four weeks" elif value <= end_of_next_week + timedelta(weeks=4): return u"in five weeks" if today.month == 12: next_month = 1 else: next_month = today.month + 1 end_of_next_month = date(today.year, next_month, calendar.monthrange(today.year, today.month)[1]) if value <= end_of_next_month: # if we're in next month return u'next month' # the last day of the year end_of_year = date(today.year, 12, 31) if value <= end_of_year: # return the month name (March) return template.defaultfilters.date(value, "F") # the last day of next year end_of_next_year = date(today.year + 1, 12, 31) if value <= end_of_next_year: return u'next %s' % template.defaultfilters.date(value, "F") return template.defaultfilters.date(value, "Y") else: # TODO add the past return fuzzydate(value)