bitvend/models: turn user balance into column_property

master
informatic 2023-07-15 22:26:40 +02:00
parent e5f4fbb999
commit f0859c9592
1 changed files with 41 additions and 47 deletions

View File

@ -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)