comparison gpp/potd/tools.py @ 515:ae89ba801e8b

For #194, convert the POTD management command to a celery task. Refactored to put the logic for the command into a function, and the command simply calls this function. The task can also just call this function. Added some basic tests for the new function.
author Brian Neal <bgneal@gmail.com>
date Wed, 14 Dec 2011 02:41:15 +0000
parents
children
comparison
equal deleted inserted replaced
514:6d816aa586c1 515:ae89ba801e8b
1 """
2 Tools for the Photo of the Day (potd) application.
3
4 """
5 import random
6 import logging
7
8 from potd.models import Current, Sequence, Photo
9
10
11 logger = logging.getLogger(__name__)
12
13
14 def get_sequence():
15 """
16 Reads the photo sequence object from the database and converts it into a
17 list of photo IDs. If the sequence object is not found, and empty list is
18 returned.
19
20 """
21 try:
22 s = Sequence.objects.get(pk=1)
23 except Sequence.DoesNotExist:
24 return []
25
26 return [int(x) for x in s.seq.split(',')]
27
28
29 def new_sequence():
30 """
31 Generates a new random sequence of photos and saves it to the database.
32 The sequence is returned as a list of photo IDs.
33
34 """
35 ids = list(Photo.objects.values_list('id', flat=True))
36 random.shuffle(ids)
37
38 try:
39 s = Sequence.objects.get(pk=1)
40 except Sequence.DoesNotExist:
41 s = Sequence()
42
43 s.seq = ','.join([str(n) for n in ids])
44 s.save()
45 return ids
46
47
48 def pick_potd():
49 """
50 Chooses the next POTD. Run this command at midnight to update the POTD.
51
52 """
53 # Get the "current" record for the now old POTD:
54 try:
55 c = Current.objects.get(pk=1)
56 current = c.potd.pk
57 except Current.DoesNotExist:
58 c = Current()
59 current = None
60
61 # Get the sequence of photo ID's:
62 seq = get_sequence()
63
64 # If there is no current object, sequence, or if this was the last POTD in
65 # the sequence, generate a new random sequence:
66
67 if current is None or not seq or current == seq[-1]:
68 # time to generate a new random sequence
69 seq = new_sequence()
70 # set current to the first one in the sequence
71 if seq:
72 try:
73 c.potd = Photo.objects.get(pk=seq[0])
74 except Photo.DoesNotExist:
75 logger.error("POTD: missing photo %d", seq[0])
76 else:
77 c.potd.potd_count += 1
78 c.potd.save()
79 c.save()
80 else:
81 # find current in the sequence, pick the next one
82 try:
83 i = seq.index(current)
84 except ValueError:
85 logger.error("POTD: current photo (%d) not in sequence", current)
86 return
87
88 n = i + 1
89 try:
90 c.potd = Photo.objects.get(pk=seq[n])
91 except Photo.DoesNotExist:
92 logger.error("POTD: missing next photo %d", n)
93 else:
94 c.potd.potd_count += 1
95 c.potd.save()
96 c.save()