NewsBlur/utils/story_functions.py

103 lines
4.1 KiB
Python
Raw Normal View History

2009-06-16 03:08:55 +00:00
from django.utils.dateformat import DateFormat
import datetime
2009-12-18 20:47:44 +00:00
from django.utils.http import urlquote
from django.conf import settings
def story_score(story, bottom_delta=None):
# A) Date - Assumes story is unread and within unread range
if not bottom_delta:
bottom_delta = datetime.timedelta(days=settings.DAYS_OF_UNREAD)
now = datetime.datetime.utcnow()
date_delta = now - story['story_date']
seconds = lambda td: td.seconds + (td.days * 86400)
date_score = 1 - (seconds(date_delta) / float(seconds(bottom_delta)))
# B) Statistics
statistics_score = 0
# C) Intelligence
intelligence_score = .5
# print "%s - %s" % (story['story_date'], date_score)
return 1/3. * (date_score + statistics_score + intelligence_score)
2009-06-16 03:08:55 +00:00
def format_story_link_date__short(date, now=None):
if not now: now = datetime.datetime.now()
diff = date.date() - now.date()
if diff.days == 0:
return date.strftime('%I:%M%p').lstrip('0').lower()
elif diff.days == 1:
return 'Yesterday, ' + date.strftime('%I:%M%p').lstrip('0').lower()
2009-06-16 03:08:55 +00:00
else:
return date.strftime('%d %b %Y, ') + date.strftime('%I:%M%p').lstrip('0').lower()
2009-06-16 03:08:55 +00:00
def format_story_link_date__long(date, now=None):
if not now: now = datetime.datetime.utcnow()
diff = now.date() - date.date()
parsed_date = DateFormat(date)
if diff.days == 0:
return 'Today, ' + parsed_date.format('F jS ') + date.strftime('%I:%M%p').lstrip('0').lower()
elif diff.days == 1:
return 'Yesterday, ' + parsed_date.format('F jS g:ia').replace('.','')
elif date.date().timetuple()[7] == now.date().timetuple()[7]:
2009-06-16 03:08:55 +00:00
return parsed_date.format('l, F jS g:ia').replace('.','')
else:
return parsed_date.format('l, F jS, Y g:ia').replace('.','')
def _extract_date_tuples(date):
parsed_date = DateFormat(date)
date_tuple = datetime.datetime.timetuple(date)[:3]
today_tuple = datetime.datetime.timetuple(datetime.datetime.utcnow())[:3]
2009-06-16 03:08:55 +00:00
today = datetime.datetime.today()
yesterday_tuple = datetime.datetime.timetuple(today - datetime.timedelta(1))[:3]
2009-12-18 20:47:44 +00:00
return parsed_date, date_tuple, today_tuple, yesterday_tuple
def pre_process_story(entry):
2010-09-17 13:33:11 -04:00
publish_date = entry.get('published_parsed', entry.get('updated_parsed'))
entry['published'] = datetime.datetime(*publish_date[:6]) if publish_date else datetime.datetime.utcnow()
2009-12-18 20:47:44 +00:00
entry_link = entry.get('link', '')
protocol_index = entry_link.find("://")
if protocol_index != -1:
entry['link'] = (entry_link[:protocol_index+3]
+ urlquote(entry_link[protocol_index+3:]))
else:
entry['link'] = urlquote(entry_link)
if isinstance(entry.get('guid'), dict):
entry['guid'] = unicode(entry['guid'])
return entry
class bunch(dict):
"""Example of overloading __getatr__ and __setattr__
This example creates a dictionary where members can be accessed as attributes
"""
def __init__(self, indict=None, attribute=None):
if indict is None:
indict = {}
# set any attributes here - before initialisation
# these remain as normal attributes
self.attribute = attribute
dict.__init__(self, indict)
self.__initialised = True
# after initialisation, setting attributes is the same as setting an item
def __getattr__(self, item):
"""Maps values to attributes.
Only called if there *isn't* an attribute with this name
"""
try:
return self.__getitem__(item)
except KeyError:
return None
def __setattr__(self, item, value):
"""Maps attributes to values.
Only if we are initialised
"""
if not self.__dict__.has_key('_bunch__initialised'): # this test allows attributes to be set in the __init__ method
return dict.__setattr__(self, item, value)
elif self.__dict__.has_key(item): # any normal attributes are handled normally
dict.__setattr__(self, item, value)
else:
self.__setitem__(item, value)