bitvend/models: turn user balance into column_property
parent
e5f4fbb999
commit
f0859c9592
|
@ -2,6 +2,7 @@ from flask import current_app as app
|
|||
from flask_sqlalchemy import SQLAlchemy
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy.orm import column_property
|
||||
from sqlalchemy.ext.hybrid import hybrid_property
|
||||
from sqlalchemy.sql import func, select, and_
|
||||
|
||||
|
@ -16,6 +17,41 @@ class NoFunds(TransferException):
|
|||
pass
|
||||
|
||||
|
||||
class Transaction(db.Model):
|
||||
__tablename__ = "transactions"
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
tx_hash = db.Column(db.String)
|
||||
uid = db.Column(db.String(64), db.ForeignKey("users.uid"))
|
||||
|
||||
amount = db.Column(db.Integer)
|
||||
|
||||
type = db.Column(db.String(32), default="manual")
|
||||
|
||||
related = db.Column(db.String)
|
||||
related_user = db.relationship(
|
||||
"User", foreign_keys=[related], primaryjoin="Transaction.related == User.uid"
|
||||
)
|
||||
|
||||
created = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
|
||||
|
||||
@hybrid_property
|
||||
def value(self):
|
||||
return self.amount
|
||||
|
||||
product_id = db.Column(db.Integer)
|
||||
product_value = db.Column(db.Integer)
|
||||
|
||||
@hybrid_property
|
||||
def finished(self):
|
||||
return (self.type != "purchase") | (self.product_id != None)
|
||||
|
||||
__mapper_args__ = {"order_by": created.desc()}
|
||||
|
||||
def __repr__(self):
|
||||
return "<Transaction {0.uid} {0.type} {0.amount} {0.created}>".format(self)
|
||||
|
||||
|
||||
class User(db.Model):
|
||||
__tablename__ = "users"
|
||||
|
||||
|
@ -28,17 +64,11 @@ class User(db.Model):
|
|||
def __repr__(self):
|
||||
return "<User {0.uid} {0.balance}>".format(self)
|
||||
|
||||
@hybrid_property
|
||||
def balance(self):
|
||||
return sum((_.amount or 0) for _ in self.transactions)
|
||||
|
||||
@balance.expression
|
||||
def balance(self):
|
||||
return (
|
||||
select([func.sum(Transaction.amount)])
|
||||
.where(Transaction.uid == User.uid)
|
||||
.label("balance")
|
||||
)
|
||||
balance = column_property(
|
||||
select([func.sum(Transaction.amount)])
|
||||
.where(Transaction.uid == uid)
|
||||
.correlate_except(Transaction)
|
||||
)
|
||||
|
||||
@hybrid_property
|
||||
def purchase_count(self):
|
||||
|
@ -100,39 +130,3 @@ class User(db.Model):
|
|||
@classmethod
|
||||
def find(cls, uid):
|
||||
return cls.query.filter(func.lower(cls.uid) == func.lower(uid)).first()
|
||||
|
||||
|
||||
class Transaction(db.Model):
|
||||
__tablename__ = "transactions"
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
tx_hash = db.Column(db.String)
|
||||
uid = db.Column(db.String(64), db.ForeignKey("users.uid"))
|
||||
|
||||
amount = db.Column(db.Integer)
|
||||
|
||||
type = db.Column(db.String(32), default="manual")
|
||||
|
||||
related = db.Column(db.String)
|
||||
related_user = db.relationship(
|
||||
"User", foreign_keys=[related], primaryjoin=related == User.uid
|
||||
)
|
||||
|
||||
created = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
|
||||
|
||||
# value = db.Column(db.Integer)
|
||||
@hybrid_property
|
||||
def value(self):
|
||||
return self.amount
|
||||
|
||||
product_id = db.Column(db.Integer)
|
||||
product_value = db.Column(db.Integer)
|
||||
|
||||
@hybrid_property
|
||||
def finished(self):
|
||||
return (self.type != "purchase") | (self.product_id != None)
|
||||
|
||||
__mapper_args__ = {"order_by": created.desc()}
|
||||
|
||||
def __repr__(self):
|
||||
return "<Transaction {0.uid} {0.type} {0.amount} {0.created}>".format(self)
|
||||
|
|
Loading…
Reference in New Issue