Esempio n. 1
0
 def funds_target_usd(self):
     from wowfunding.bin.utils import Summary, wow_to_usd
     prices = Summary.fetch_prices()
     if not prices:
         return
     return wow_to_usd(wows=self.funds_target,
                       btc_per_wow=prices['wow-btc'],
                       usd_per_btc=prices['btc-usd'])
Esempio n. 2
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)
Esempio n. 3
0
    def balance(self):
        """This property retrieves the current funding status
        of this proposal. It uses Redis cache to not spam the
        wownerod too much. Returns a nice dictionary containing
        all relevant proposal funding info"""
        from wowfunding.bin.utils import Summary, wow_to_usd
        from wowfunding.factory import cache, db_session
        rtn = {'sum': 0.0, 'txs': [], 'pct': 0.0}

        cache_key = 'wow_balance_pid_%d' % self.id
        data = cache.get(cache_key)
        if not data:
            from wowfunding.bin.daemon import WowneroDaemon
            try:
                data = WowneroDaemon().get_transfers_in(index=self.id)
                if not isinstance(data, dict):
                    print('error; get_transfers; %d' % self.id)
                    return rtn
                cache.set(cache_key, data=data, expiry=300)
            except:
                print('error; get_transfers; %d' % self.id)
                return rtn

        prices = Summary.fetch_prices()
        for tx in data['txs']:
            if prices:
                tx['amount_usd'] = wow_to_usd(wows=tx['amount_human'],
                                              btc_per_wow=prices['wow-btc'],
                                              usd_per_btc=prices['btc-usd'])
            tx['datetime'] = datetime.fromtimestamp(tx['timestamp'])

        if data.get('sum', 0.0):
            data['pct'] = 100 / float(self.funds_target / data.get('sum', 0.0))
            data['remaining'] = data['sum'] - self.funds_withdrew
        else:
            data['pct'] = 0.0
            data['remaining'] = 0.0

        if data['pct'] != self.funds_progress:
            self.funds_progress = data['pct']
            db_session.commit()
            db_session.flush()

        if data['remaining']:
            data['remaining_pct'] = 100 / float(
                data['sum'] / data['remaining'])
        else:
            data['remaining_pct'] = 0.0

        return data
Esempio n. 4
0
def api_wow_usd(wow):
    from wowfunding.bin.utils import Summary, wow_to_usd
    prices = Summary.fetch_prices()
    return jsonify(usd=wow_to_usd(wows=wow,
                                  btc_per_wow=prices['wow-btc'],
                                  usd_per_btc=prices['btc-usd']))
Esempio n. 5
0
def proposal_api_add(title, content, pid, funds_target, addr_receiving,
                     category, status):
    import markdown2

    if current_user.is_anonymous:
        return make_response(jsonify('err'), 500)

    if len(title) <= 10:
        return make_response(jsonify('title too short'), 500)
    if len(content) <= 20:
        return make_response(jsonify('content too short'), 500)

    if category and category not in settings.FUNDING_CATEGORIES:
        return make_response(jsonify('unknown category'), 500)

    if status not in settings.FUNDING_STATUSES.keys():
        make_response(jsonify('unknown status'), 500)

    if status != 1 and not current_user.admin:
        return make_response(jsonify('no rights to change status'), 500)

    try:
        from wowfunding.bin.anti_xss import such_xss
        content_escaped = such_xss(content)
        html = markdown2.markdown(content_escaped, safe_mode=True)
    except Exception as ex:
        return make_response(jsonify('markdown error'), 500)

    if pid:
        p = Proposal.find_by_id(pid=pid)
        if not p:
            return make_response(jsonify('proposal not found'), 500)

        if p.user.id != current_user.id and not current_user.admin:
            return make_response(jsonify('no rights to edit this proposal'),
                                 500)

        p.headline = title
        p.content = content
        p.html = html
        if addr_receiving:
            p.addr_receiving = addr_receiving
        if category:
            p.category = category

        # detect if an admin moved a proposal to a new status and auto-comment
        if p.status != status and current_user.admin:
            msg = "Moved to status \"%s\"." % settings.FUNDING_STATUSES[
                status].capitalize()
            try:
                Comment.add_comment(user_id=current_user.id,
                                    message=msg,
                                    pid=pid,
                                    automated=True)
            except:
                pass

        p.status = status
        p.last_edited = datetime.now()
    else:
        if funds_target <= 1:
            return make_response(
                jsonify('proposal asking less than 1 error :)'), 500)
        if len(addr_receiving) != 97:
            return make_response(
                jsonify(
                    'faulty addr_receiving address, should be of length 72'),
                500)

        p = Proposal(headline=title,
                     content=content,
                     category='misc',
                     user=current_user)
        p.html = html
        p.last_edited = datetime.now()
        p.funds_target = funds_target
        p.addr_receiving = addr_receiving
        p.category = category
        p.status = status
        db_session.add(p)

    db_session.commit()
    db_session.flush()

    # reset cached statistics
    from wowfunding.bin.utils import Summary
    Summary.fetch_stats(purge=True)

    return make_response(jsonify({'url': url_for('proposal', pid=p.id)}))