]> git.ipfire.org Git - ipfire.org.git/blob - www/webapp/backend/wishlist.py
a45f3a7ce68ad06f35dce3137e596b5f28575de4
[ipfire.org.git] / www / 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
54 class Wish(object):
55 def __init__(self, wishlist, id, data=None):
56 self.wishlist = wishlist
57 self.id = id
58
59 self.__data = data
60
61 def __cmp__(self, other):
62 return cmp(self.date_end, other.date_end)
63
64 @property
65 def db(self):
66 return self.wishlist.db
67
68 @property
69 def data(self):
70 if self.__data is None:
71 self.__data = self.db.get("SELECT * FROM wishlist WHERE id = %s", self.id)
72 assert self.__data
73
74 return self.__data
75
76 @property
77 def title(self):
78 return self.data.title
79
80 @property
81 def slug(self):
82 return self.data.slug
83
84 @property
85 def tag(self):
86 return self.data.tag
87
88 @property
89 def description(self):
90 return textile.textile(self.data.description)
91
92 @property
93 def goal(self):
94 return self.data.goal
95
96 @property
97 def donated(self):
98 return self.data.donated
99
100 @property
101 def percentage(self):
102 return (self.donated / self.goal) * 100
103
104 @property
105 def percentage_bar(self):
106 if self.percentage > 100:
107 return 100
108
109 return self.percentage
110
111 @property
112 def status(self):
113 if self.data.status == "running" and not self.running:
114 return "closed"
115
116 return self.data.status
117
118 @property
119 def running(self):
120 if self.remaining_days < 0:
121 return False
122
123 return True
124
125 @property
126 def date_start(self):
127 return self.data.date_start
128
129 @property
130 def date_end(self):
131 return self.data.date_end
132
133 @property
134 def running_days(self):
135 today = datetime.datetime.today()
136 today = today.date()
137
138 running = today - self.date_start
139 return running.days
140
141 @property
142 def remaining_days(self):
143 today = datetime.datetime.today()
144 today = today.date()
145
146 remaining = self.date_end - today
147 return remaining.days
148
149 def get_tweet(self, locale):
150 _ = locale.translate
151
152 t = [
153 _("Checkout this crowdfunding wish from #ipfire:"),
154 "http://wishlist.ipfire.org/wish/%s" % self.slug,
155 ]
156
157 return " ".join(t)