]>
Commit | Line | Data |
---|---|---|
7771acea MT |
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): | |
918284e8 | 19 | wish = self.db.get("SELECT * FROM wishlist WHERE slug = %s", slug) |
7771acea MT |
20 | |
21 | if wish: | |
22 | return Wish(self, wish.id) | |
23 | ||
1bf8d482 | 24 | def get_all_by_query(self, query, *args): |
7771acea MT |
25 | wishes = [] |
26 | ||
1bf8d482 | 27 | for row in self.db.query(query, *args): |
918284e8 | 28 | wish = Wish(self, row.id, row) |
7771acea MT |
29 | wishes.append(wish) |
30 | ||
31 | return wishes | |
32 | ||
33 | def get_all_running(self): | |
918284e8 | 34 | return self.get_all_by_query("SELECT * FROM wishlist \ |
1bf8d482 | 35 | WHERE DATE(NOW()) >= date_start AND DATE(NOW()) <= date_end AND status = 'running' \ |
7771acea MT |
36 | ORDER BY prio ASC, date_end ASC") |
37 | ||
1bf8d482 MT |
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) | |
7771acea MT |
52 | |
53 | ||
54 | class Wish(object): | |
918284e8 | 55 | def __init__(self, wishlist, id, data=None): |
7771acea MT |
56 | self.wishlist = wishlist |
57 | self.id = id | |
58 | ||
918284e8 | 59 | self.__data = data |
7771acea MT |
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 | ||
918284e8 MT |
104 | @property |
105 | def percentage_bar(self): | |
106 | if self.percentage > 100: | |
107 | return 100 | |
108 | ||
109 | return self.percentage | |
110 | ||
1bf8d482 MT |
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 | ||
7771acea MT |
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) |