Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
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)
Beispiel #4
0
    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
Beispiel #5
0
 def find_by_id(cid: int):
     from wowfunding.factory import db_session
     return db_session.query(Comment).filter(Comment.id == cid).first()
Beispiel #6
0
 def get_payouts(proposal_id):
     return db_session.query(Payout).filter(
         Payout.proposal_id == proposal_id).all()
Beispiel #7
0
 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()
Beispiel #8
0
def user(name):
    q = db_session.query(User)
    q = q.filter(User.username == name)
    user = q.first()
    return render_template('user.html', user=user)