Skip to content

Instantly share code, notes, and snippets.

@dangayle
Created October 9, 2015 21:32
Show Gist options
  • Select an option

  • Save dangayle/7a4823895f0463a50349 to your computer and use it in GitHub Desktop.

Select an option

Save dangayle/7a4823895f0463a50349 to your computer and use it in GitHub Desktop.
def get_date_tree():
"""
Get all dates with stories, store in Redis. Cached for 1 day.
Returns an OrderedDict, with datetime objects as keys.
OrderedDict([(
datetime.date(1963, 1, 1), OrderedDict([(
datetime.date(1963, 11, 1), [
datetime.date(1963, 11, 22),
datetime.date(1963, 11, 23),
datetime.date(1963, 11, 24)
]
)])
)])
Think of it more like a regular dict:
date_tree = {
datetime.date(1963, 1, 1): {
datetime.date(1963, 11, 1): [
datetime.date(1963, 11, 22),
datetime.date(1963, 11, 23),
datetime.date(1963, 11, 24)
]
}
}
Access it like a normal dict, with datetimes as keys:
To get all the months in in 1963:
>>date_tree = get_date_tree()
>>months = date_tree[date(1963,1,1)].keys()
To get all the days in November, 1963:
>>date_tree = get_date_tree()
>>days = date_tree[date(1963,1,1)][date(1963,11,1)]
"""
key = "date_tree"
try:
date_tree = get_redis_cache(key)
except:
date_tree = None
if not date_tree:
all_dates = Story.live_objects.all().dates('pubdate', 'day').distinct()
date_tree = OrderedDict()
for dt in all_dates:
# create a tree of all dates, keys are datetime objects
date_tree.setdefault(
date(dt.year, 1, 1), OrderedDict()).setdefault(
date(dt.year, dt.month, 1), []).append(dt.date())
set_redis_cache(key, date_tree, expires=86400) # expire key in 24 hours
return date_tree
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment