]> git.ipfire.org Git - ipfire.org.git/blob - webapp/backend/wishlist.py
e94634adab3abf1281b758ac4a8216393bc5bf34
[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 OR (prio <= 5) \
61 ) ORDER BY prio ASC, date_end ASC LIMIT %s"
62
63 return self.get_all_by_query(query, "running", limit)
64
65
66 class Wish(object):
67 def __init__(self, wishlist, id, data=None):
68 self.wishlist = wishlist
69 self.id = id
70
71 self.__data = data
72
73 def __repr__(self):
74 return "<%s %s>" % (self.__class__.__name__, self.title)
75
76 def __cmp__(self, other):
77 return cmp(self.date_end, other.date_end)
78
79 @property
80 def db(self):
81 return self.wishlist.db
82
83 @property
84 def data(self):
85 if self.__data is None:
86 self.__data = self.db.get("SELECT * FROM wishlist WHERE id = %s", self.id)
87 assert self.__data
88
89 return self.__data
90
91 @property
92 def title(self):
93 return self.data.title
94
95 @property
96 def title_short(self):
97 if len(self.title) > 30:
98 return "%s..." % self.title[:30]
99
100 return self.title
101
102 @property
103 def slug(self):
104 return self.data.slug
105
106 @property
107 def tag(self):
108 return self.data.tag
109
110 @property
111 def description(self):
112 return textile.textile(self.data.description)
113
114 @property
115 def goal(self):
116 return self.data.goal
117
118 @property
119 def donated(self):
120 return self.data.donated
121
122 @property
123 def percentage(self):
124 return (self.donated / self.goal) * 100
125
126 @property
127 def percentage_bar(self):
128 if self.percentage > 100:
129 return 100
130
131 return self.percentage
132
133 @property
134 def progressbar_colour(self):
135 if self.is_new():
136 return "bar-success"
137
138 if self.percentage >= 90:
139 return "bar-danger"
140
141 return "bar-warning"
142
143 @property
144 def status(self):
145 if self.data.status == "running" and not self.running:
146 return "closed"
147
148 return self.data.status
149
150 @property
151 def running(self):
152 if self.remaining_days < 0:
153 return False
154
155 return True
156
157 @property
158 def date_start(self):
159 return self.data.date_start
160
161 @property
162 def date_end(self):
163 return self.data.date_end
164
165 @property
166 def running_days(self):
167 today = datetime.datetime.today()
168 today = today.date()
169
170 running = today - self.date_start
171 return running.days
172
173 @property
174 def remaining_days(self):
175 today = datetime.datetime.today()
176 today = today.date()
177
178 remaining = self.date_end - today
179 return remaining.days
180
181 def is_new(self):
182 return self.running_days < 10
183
184 def get_tweet(self, locale):
185 _ = locale.translate
186
187 t = [
188 _("Checkout this crowdfunding wish from #ipfire:"),
189 "http://wishlist.ipfire.org/wish/%s" % self.slug,
190 ]
191
192 return " ".join(t)