def fetch_stats(purge=False): from funding.factory import db_session from funding.orm.orm import Proposal, User, Comment from funding.factory import cache cache_key = 'funding_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 edit(email: str, password: str): from funding.factory import db_session from funding.factory import bcrypt try: db_session.query(User).filter(User.email == email).update({ 'password': bcrypt.generate_password_hash(password).decode('utf8') }) db_session.commit() db_session.flush() except Exception as ex: db_session.rollback() raise
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(8).all() summary_data = Summary.fetch_stats() newest_users = db_session.query(User).filter(User.admin == False).order_by( User.registered_on.desc()).limit(5).all() 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, newest_users=newest_users)
def get_comments(self): from funding.factory import db_session q = db_session.query(Comment) q = q.filter(Comment.proposal_id == self.id) q = q.filter(Comment.replied_to == None) q = q.order_by(Comment.date_added.desc()) 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 edit(cid: int, pid: int, message: str, user_id: int): from funding.factory import db_session from flask_login import current_user if current_user.id != user_id and not current_user.admin: raise Exception("no rights to remove this comment") comment = Comment.find_by_id(cid=cid) if not comment.locked: try: db_session.query(Comment).filter(Comment.id == cid).update( {'message': message}) db_session.commit() db_session.flush() except: db_session.rollback() raise else: raise Exception("Comment is locked and can not be edited")
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 funding.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 passResetStart(email): if request.method == 'GET': return make_response(render_template('reset.html')) xquery = db_session.query(User) searchQ = xquery.filter_by(email=email).first() if searchQ is None: return else: key = URLSafeTimedSerializer(settings.SECRET, salt='passwordreset') token = key.dumps({'email': searchQ.email}) msg = Message("Password Reset Request", sender="settings.USER_EMAIL_SENDER_EMAIL", recipients=[email]) msg.body = "Hi, we received a request to reset your password on the {coincode} Funding System ({siteurl}).\n\n Please click this link to reset your password: {siteurl}account/password/reset/{token}".format( siteurl=settings.SITE_URL, coincode=settings.COINCODE, token=token) flash('Password reset email sent') mail.send(msg) return make_response(render_template('reset.html'))
def find_by_id(cid: int): from funding.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 funding.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)
def get_payouts(proposal_id): from funding.factory import db_session return db_session.query(Payout).filter(Payout.proposal_id == proposal_id).all()