Exemplo n.º 1
0
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))
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
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