def fetch_stats(purge=False): from wowfunding.factory import db_session from wowfunding.orm.orm import Proposal, User, Comment from wowfunding.factory import cache cache_key = 'wowfunding_stats' data = cache.get(cache_key) if data and not purge: return data categories = settings.FUNDING_CATEGORIES statuses = settings.FUNDING_STATUSES.keys() for cat in categories: q = db_session.query(Proposal) q = q.filter(Proposal.category == cat) res = q.count() data.setdefault('cats', {}) data['cats'][cat] = res for status in statuses: q = db_session.query(Proposal) q = q.filter(Proposal.status == status) res = q.count() data.setdefault('statuses', {}) data['statuses'][status] = res data.setdefault('users', {}) data['users']['count'] = db_session.query(User.id).count() cache.set(cache_key, data=data, expiry=300) return data
def get_comments(self): from wowfunding.factory import db_session q = db_session.query(Comment) q = q.filter(Comment.proposal_id == self.id) q = q.filter(Comment.replied_to == None) comments = q.all() for c in comments: q = db_session.query(Comment) q = q.filter(Comment.proposal_id == self.id) q = q.filter(Comment.replied_to == c.id) _c = q.all() setattr(c, 'comments', _c) setattr(self, '_comments', comments) return self
def templating(): from flask.ext.login import current_user recent_comments = db_session.query(Comment).filter(Comment.automated == False).order_by(Comment.date_added.desc()).limit(10).all() summary_data = Summary.fetch_stats() return dict(logged_in=current_user.is_authenticated, current_user=current_user, funding_categories=settings.FUNDING_CATEGORIES, funding_statuses=settings.FUNDING_STATUSES, summary_data=summary_data, recent_comments=recent_comments)
def add_comment(cls, pid: int, user_id: int, message: str, cid: int = None, message_id: int = None, automated=False): from flask.ext.login import current_user from wowfunding.factory import db_session if not message: raise Exception("empty message") if current_user.id != user_id and not current_user.admin: raise Exception("no rights to add or modify this comment") if not message_id: proposal = Proposal.find_by_id(pid=pid) if not proposal: raise Exception("no proposal by that id") comment = Comment(user_id=user_id, proposal_id=proposal.id, automated=automated) if cid: parent = Comment.find_by_id(cid=cid) if not parent: raise Exception("cannot reply to a non-existent comment") comment.replied_to = parent.id else: try: user = db_session.query(User).filter( User.id == user_id).first() if not user: raise Exception("no user by that id") comment = next(c for c in user.comments if c.id == message_id) if comment.locked and not current_user.admin: raise Exception("your comment has been locked/removed") except StopIteration: raise Exception("no message by that id") except: raise Exception("unknown error") try: comment.message = message db_session.add(comment) db_session.commit() db_session.flush() except Exception as ex: db_session.rollback() raise Exception(str(ex)) return comment
def find_by_id(cid: int): from wowfunding.factory import db_session return db_session.query(Comment).filter(Comment.id == cid).first()
def get_payouts(proposal_id): return db_session.query(Payout).filter( Payout.proposal_id == proposal_id).all()
def comment_count(self): from wowfunding.factory import db_session q = db_session.query(sa.func.count(Comment.id)) q = q.filter(Comment.proposal_id == self.id) return q.scalar()
def user(name): q = db_session.query(User) q = q.filter(User.username == name) user = q.first() return render_template('user.html', user=user)