2018-10-20 00:11:54 +00:00
|
|
|
import os
|
|
|
|
import json
|
2018-06-26 21:48:25 +00:00
|
|
|
from datetime import datetime, date
|
2018-10-20 00:11:54 +00:00
|
|
|
|
|
|
|
import pyqrcode
|
2018-07-12 00:39:49 +00:00
|
|
|
import requests
|
2018-10-20 00:11:54 +00:00
|
|
|
from flask import g, request
|
2018-07-12 00:39:49 +00:00
|
|
|
from flask.json import JSONEncoder
|
2018-10-20 00:11:54 +00:00
|
|
|
|
2018-07-12 00:39:49 +00:00
|
|
|
import settings
|
|
|
|
|
2018-10-20 00:11:54 +00:00
|
|
|
|
2018-06-26 21:48:25 +00:00
|
|
|
def json_encoder(obj):
|
|
|
|
if isinstance(obj, (datetime, date)):
|
|
|
|
return obj.isoformat()
|
|
|
|
raise TypeError ("Type %s not serializable" % type(obj))
|
2018-07-12 00:39:49 +00:00
|
|
|
|
2018-10-20 00:11:54 +00:00
|
|
|
|
2018-07-12 00:39:49 +00:00
|
|
|
class Summary:
|
|
|
|
@staticmethod
|
|
|
|
def fetch_prices():
|
2018-09-05 22:27:26 +00:00
|
|
|
if hasattr(g, 'funding_prices') and g.coin_prices:
|
|
|
|
return g.coin_prices
|
|
|
|
from funding.factory import cache
|
|
|
|
cache_key = 'funding_prices'
|
2018-07-12 00:39:49 +00:00
|
|
|
data = cache.get(cache_key)
|
|
|
|
if data:
|
|
|
|
return data
|
|
|
|
data = {
|
2018-09-05 22:27:26 +00:00
|
|
|
'coin-btc': coin_btc_value(),
|
2018-07-12 00:39:49 +00:00
|
|
|
'btc-usd': price_cmc_btc_usd()
|
|
|
|
}
|
2018-10-20 12:52:45 +00:00
|
|
|
cache.set(cache_key, data=data, expiry=1200)
|
2018-09-05 22:27:26 +00:00
|
|
|
g.coin_prices = data
|
2018-07-12 00:39:49 +00:00
|
|
|
return data
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def fetch_stats(purge=False):
|
2018-09-05 22:27:26 +00:00
|
|
|
from funding.factory import db_session
|
|
|
|
from funding.orm.orm import Proposal, User, Comment
|
|
|
|
from funding.factory import cache
|
|
|
|
cache_key = 'funding_stats'
|
2018-07-12 00:39:49 +00:00
|
|
|
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
|
|
|
|
|
2018-10-20 00:11:54 +00:00
|
|
|
|
2018-07-12 00:39:49 +00:00
|
|
|
def price_cmc_btc_usd():
|
|
|
|
headers = {'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0'}
|
|
|
|
try:
|
2018-10-20 00:11:54 +00:00
|
|
|
print('request coinmarketcap')
|
2018-07-12 00:39:49 +00:00
|
|
|
r = requests.get('https://api.coinmarketcap.com/v2/ticker/1/?convert=USD', headers=headers)
|
|
|
|
r.raise_for_status()
|
|
|
|
return r.json().get('data', {}).get('quotes', {}).get('USD', {}).get('price')
|
|
|
|
except:
|
|
|
|
return
|
|
|
|
|
2018-10-20 00:11:54 +00:00
|
|
|
|
2018-09-05 22:27:26 +00:00
|
|
|
def coin_btc_value():
|
2018-07-12 00:39:49 +00:00
|
|
|
headers = {'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0'}
|
|
|
|
try:
|
2018-10-20 00:11:54 +00:00
|
|
|
print('request TO')
|
2018-07-12 00:39:49 +00:00
|
|
|
r = requests.get('https://tradeogre.com/api/v1/ticker/BTC-WOW', headers=headers)
|
|
|
|
r.raise_for_status()
|
|
|
|
return float(r.json().get('high'))
|
|
|
|
except:
|
|
|
|
return
|
|
|
|
|
2018-10-20 00:11:54 +00:00
|
|
|
|
2018-09-05 22:27:26 +00:00
|
|
|
def coin_to_usd(amt: float, usd_per_btc: float, btc_per_coin: float):
|
2018-07-12 00:39:49 +00:00
|
|
|
try:
|
2018-09-05 22:27:26 +00:00
|
|
|
return round(usd_per_btc / (1.0 / (amt * btc_per_coin)), 2)
|
2018-07-12 00:39:49 +00:00
|
|
|
except:
|
2018-10-20 00:11:54 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
def get_ip():
|
|
|
|
return request.headers.get('X-Forwarded-For') or request.remote_addr
|