def index(request): """ View for the front page. Only responds to GET requests. """ render_start = datetime.datetime.now() querymanager = get_frontpage_querymanager(request) page = get_pagenum(request) front_page = get_paginator_page(querymanager, page) header = 'Front Page' next = get_next_with_pages(reverse('news.views.news_items.index'), page) this = reverse('news.views.news_items.index') render_end = datetime.datetime.now() return render_to_response('news/news_item_list.html', {'news_item_list': front_page.object_list, 'paginator_page': front_page, 'header': header, #'render_time': render_end - render_start, 'next': next, 'this': this}, context_instance=RequestContext(request))
def testGetFrontpageQuerymanager(self): """ Test get_frontpage_querymanager(). """ front_querymanager = get_frontpage_querymanager() expected_querymanager = \ NewsItem.objects.filter(date_posted__gt=(datetime_ago(weeks=4))) expected_querymanager = expected_querymanager.order_by('-ranking') for item in front_querymanager: self.assert_(item in expected_querymanager)
def update_ranking(milliseconds=500, daemonize=False): """ Update a random rankable every arg milliseconds. """ from random import randint import time import os, sys, fcntl from news.models import Rankable from news.helpers import get_frontpage_querymanager from news.conf import NEWS_UPDATE_RANKING_LOCKFILE from django import db # if this is a daemon, make sure it can only be run once try: fp = open(NEWS_UPDATE_RANKING_LOCKFILE, 'w') except IOError: print >>sys.stderr, "Error! Could not open lockfile " + NEWS_UPDATE_RANKING_LOCKFILE sys.exit(1) try: fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB) except IOError: print >>sys.stderr, "Error! Could not lock lockfile " + NEWS_UPDATE_RANKING_LOCKFILE sys.exit(1) if daemonize: if os.fork() == 0: # This is what the child does. # # I might need to call os.setsid() to set the # session id, so that this doesn't get exited # if I close the controlling terminal. Just # like the code below. # #os.setsid() #if os.fork() == 0: # pass #else: # os._exit(0) pass else: # This is what the parent does. os._exit(0) # trying to see if I could call this from another process to get the # correct name #import sys #sys.argv[0] = "news name" #print "sys.argv = " + str(sys.argv) #print "__name__ = " + __name__ def do_update(rankable): """ Do the update and pause for the set time. """ rankable.update_ranking() if not daemonize: print >>sys.stderr, "Updated " + unicode(rankable) time.sleep(milliseconds / float(1000)) def do_random_update_from_query(querymanager): """ Update a random rankable within querymanager. """ num_rankables = querymanager.count() random_rankable = querymanager[randint(0, num_rankables-1)] do_update(random_rankable) while True: try: # update a random rankable do_random_update_from_query(Rankable.objects.all()) # update least recently ranked rankable old_rankable = Rankable.objects.all().order_by('last_ranked_date')[0] do_update(old_rankable) # update random top 50 frontpage rankable do_random_update_from_query(get_frontpage_querymanager()) # this is needed to Django doesn't hog memory if we are running under # DEBUG = True db.reset_queries() except KeyboardInterrupt: # exit gracefully on ctrl-c if not daemonize: print >>sys.stderr, "" sys.exit(0) except: # Print stack trace and just keep going for any other type of exception if not daemonize: print >>sys.stderr, "\nException in update_ranking.py:" print >>sys.stderr, '-'*60 traceback.print_exc(file=sys.stderr) print >>sys.stderr, '-'*60