X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=webapp%2Fbackend%2Fwishlist.py;h=8743809ffb63a17616b4bbebbb9d3ecdf2ba7611;hb=60b0917c10ad148bab706776c518bd3f3b8a3d24;hp=e94634adab3abf1281b758ac4a8216393bc5bf34;hpb=11ed5673a0f3376945363b909b80ea13fd08fdf7;p=ipfire.org.git diff --git a/webapp/backend/wishlist.py b/webapp/backend/wishlist.py index e94634ad..8743809f 100644 --- a/webapp/backend/wishlist.py +++ b/webapp/backend/wishlist.py @@ -5,16 +5,9 @@ from __future__ import division import datetime import textile -from databases import Databases -from misc import Singleton - -class Wishlist(object): - __metaclass__ = Singleton - - @property - def db(self): - return Databases().webapp +from misc import Object +class Wishlist(Object): def get(self, slug): wish = self.db.get("SELECT * FROM wishlist WHERE slug = %s", slug) @@ -32,36 +25,68 @@ class Wishlist(object): def get_all_running(self): return self.get_all_by_query("SELECT * FROM wishlist \ - WHERE DATE(NOW()) >= date_start AND DATE(NOW()) <= date_end AND status = 'running' \ + WHERE (CASE \ + WHEN date_end IS NULL THEN \ + NOW() >= date_start AND goal >= donated \ + ELSE \ + NOW() BETWEEN date_start AND date_end \ + END) AND status = 'running' \ ORDER BY prio ASC, date_end ASC") def get_all_finished(self, limit=5, offset=None): - query = "SELECT * FROM wishlist WHERE DATE(NOW()) > date_end AND status IS NOT NULL \ + query = "SELECT * FROM wishlist \ + WHERE (CASE \ + WHEN date_end IS NULL THEN \ + donated >= goal \ + ELSE \ + NOW() > date_end \ + END) AND status IS NOT NULL \ ORDER BY date_end DESC" args = [] if limit: + query += " LIMIT %s" + args.append(limit) + if offset: - query += " LIMIT %s,%s" - args += [limit, offset] - else: - query += " LIMIT %s" - args.append(limit) + query += " OFFSET %s" + args.append(offset) return self.get_all_by_query(query, *args) def get_hot_wishes(self, limit=3): query = "SELECT * FROM wishlist \ - WHERE status = %s AND DATE(NOW()) BETWEEN date_start AND date_end AND ( \ - ((UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date_start)) <= 864000) \ - OR ((UNIX_TIMESTAMP(date_end) - UNIX_TIMESTAMP()) <= 1209600) \ - OR ((donated / goal) >= 0.9) \ - OR (goal >= 3000) \ - OR (prio <= 5) \ - ) ORDER BY prio ASC, date_end ASC LIMIT %s" + WHERE \ + status = %s \ + AND \ + date_start <= NOW() \ + AND \ + (CASE WHEN date_end IS NOT NULL THEN \ + NOW() BETWEEN date_start AND date_end \ + ELSE \ + TRUE \ + END) \ + AND \ + (AGE(NOW(), date_start) <= INTERVAL '10 days' \ + OR \ + AGE(date_end, NOW()) <= INTERVAL '14 days' \ + OR \ + (donated / goal) >= 0.85 \ + OR \ + goal >= 3000 \ + OR \ + prio <= 5 \ + ) \ + ORDER BY prio ASC, date_end ASC LIMIT %s" return self.get_all_by_query(query, "running", limit) + def get_hottest_wish(self): + wishes = self.get_hot_wishes(limit=1) + + if wishes: + return wishes[0] + class Wish(object): def __init__(self, wishlist, id, data=None): @@ -149,8 +174,13 @@ class Wish(object): @property def running(self): - if self.remaining_days < 0: - return False + if self.date_end: + if self.remaining_days and self.remaining_days < 0: + return False + + else: + if self.donated >= self.goal: + return False return True @@ -164,19 +194,14 @@ class Wish(object): @property def running_days(self): - today = datetime.datetime.today() - today = today.date() - - running = today - self.date_start + running = datetime.datetime.today() - self.date_start return running.days @property def remaining_days(self): - today = datetime.datetime.today() - today = today.date() - - remaining = self.date_end - today - return remaining.days + if self.date_end: + remaining = self.date_end - datetime.datetime.today() + return remaining.days def is_new(self): return self.running_days < 10