]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - webapp/backend/wishlist.py
Add wishlist to front page.
[people/shoehn/ipfire.org.git] / webapp / backend / wishlist.py
1 #!/usr/bin/python
2
3 from __future__ import division
4
5 import datetime
6 import textile
7
8 from databases import Databases
9 from misc import Singleton
10
11 class Wishlist(object):
12 __metaclass__ = Singleton
13
14 @property
15 def db(self):
16 return Databases().webapp
17
18 def get(self, slug):
19 wish = self.db.get("SELECT * FROM wishlist WHERE slug = %s", slug)
20
21 if wish:
22 return Wish(self, wish.id)
23
24 def get_all_by_query(self, query, *args):
25 wishes = []
26
27 for row in self.db.query(query, *args):
28 wish = Wish(self, row.id, row)
29 wishes.append(wish)
30
31 return wishes
32
33 def get_all_running(self):
34 return self.get_all_by_query("SELECT * FROM wishlist \
35 WHERE DATE(NOW()) >= date_start AND DATE(NOW()) <= date_end AND status = 'running' \
36 ORDER BY prio ASC, date_end ASC")
37
38 def get_all_finished(self, limit=5, offset=None):
39 query = "SELECT * FROM wishlist WHERE DATE(NOW()) > date_end AND status IS NOT NULL \
40 ORDER BY date_end DESC"
41 args = []
42
43 if limit:
44 if offset:
45 query += " LIMIT %s,%s"
46 args += [limit, offset]
47 else:
48 query += " LIMIT %s"
49 args.append(limit)
50
51 return self.get_all_by_query(query, *args)
52
53 def get_hot_wishes(self, limit=3):
54 query = "SELECT * FROM wishlist \
55 WHERE status = %s AND DATE(NOW()) BETWEEN date_start AND date_end AND ( \
56 ((UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date_start)) <= 864000) \
57 OR ((UNIX_TIMESTAMP(date_end) - UNIX_TIMESTAMP()) <= 1209600) \
58 OR ((donated / goal) >= 0.9) \
59 OR (goal >= 3000) \
60 ) ORDER BY prio ASC, date_end ASC LIMIT %s"
61
62 return self.get_all_by_query(query, "running", limit)
63
64
65 class Wish(object):
66 def __init__(self, wishlist, id, data=None):
67 self.wishlist = wishlist
68 self.id = id
69
70 self.__data = data
71
72 def __repr__(self):
73 return "<%s %s>" % (self.__class__.__name__, self.title)
74
75 def __cmp__(self, other):
76 return cmp(self.date_end, other.date_end)
77
78 @property
79 def db(self):
80 return self.wishlist.db
81
82 @property
83 def data(self):
84 if self.__data is None:
85 self.__data = self.db.get("SELECT * FROM wishlist WHERE id = %s", self.id)
86 assert self.__data
87
88 return self.__data
89
90 @property
91 def title(self):
92 return self.data.title
93
94 @property
95 def title_short(self):
96 if len(self.title) > 30:
97 return "%s..." % self.title[:30]
98
99 return self.title
100
101 @property
102 def slug(self):
103 return self.data.slug
104
105 @property
106 def tag(self):
107 return self.data.tag
108
109 @property
110 def description(self):
111 return textile.textile(self.data.description)
112
113 @property
114 def goal(self):
115 return self.data.goal
116
117 @property
118 def donated(self):
119 return self.data.donated
120
121 @property
122 def percentage(self):
123 return (self.donated / self.goal) * 100
124
125 @property
126 def percentage_bar(self):
127 if self.percentage > 100:
128 return 100
129
130 return self.percentage
131
132 @property
133 def progressbar_colour(self):
134 if self.is_new():
135 return "bar-success"
136
137 if self.percentage >= 90:
138 return "bar-danger"
139
140 return "bar-warning"
141
142 @property
143 def status(self):
144 if self.data.status == "running" and not self.running:
145 return "closed"
146
147 return self.data.status
148
149 @property
150 def running(self):
151 if self.remaining_days < 0:
152 return False
153
154 return True
155
156 @property
157 def date_start(self):
158 return self.data.date_start
159
160 @property
161 def date_end(self):
162 return self.data.date_end
163
164 @property
165 def running_days(self):
166 today = datetime.datetime.today()
167 today = today.date()
168
169 running = today - self.date_start
170 return running.days
171
172 @property
173 def remaining_days(self):
174 today = datetime.datetime.today()
175 today = today.date()
176
177 remaining = self.date_end - today
178 return remaining.days
179
180 def is_new(self):
181 return self.running_days <= 10
182
183 def get_tweet(self, locale):
184 _ = locale.translate
185
186 t = [
187 _("Checkout this crowdfunding wish from #ipfire:"),
188 "http://wishlist.ipfire.org/wish/%s" % self.slug,
189 ]
190
191 return " ".join(t)