diff --git a/app/core/models/_config.py b/app/core/models/_config.py index 4891d8e..da91357 100644 --- a/app/core/models/_config.py +++ b/app/core/models/_config.py @@ -8,7 +8,7 @@ class ServiceConfigValue(AlchemyBase): id = Column(Integer, autoincrement=True, primary_key=True) key = Column(String(128), nullable=False, unique=True) - packed_value = Column(JSON, nullable=False, default={}) + packed_value = Column(JSON, nullable=False, default=dict) @property def value(self): diff --git a/app/core/models/asset.py b/app/core/models/asset.py index fc2ca5c..886b663 100644 --- a/app/core/models/asset.py +++ b/app/core/models/asset.py @@ -1,5 +1,6 @@ from sqlalchemy import Column, Integer, String, DateTime, JSON, Boolean from sqlalchemy.orm import relationship +from datetime import datetime from app.core._defaults import DEFAULT_ASSET_INITOBJ from app.core.models.base import AlchemyBase @@ -15,10 +16,10 @@ class Asset(AlchemyBase): network = Column(String(32), nullable=True) address = Column(String(1024), nullable=True) - meta = Column(JSON, nullable=False, default={}) - rates = Column(JSON, nullable=False, default={}) + meta = Column(JSON, nullable=False, default=dict) + rates = Column(JSON, nullable=False, default=dict) - created = Column(DateTime, nullable=False, default=0) + created = Column(DateTime, nullable=False, default=datetime.utcnow) is_active = Column(Boolean, nullable=False, default=True) balances = relationship('UserBalance', back_populates='asset') diff --git a/app/core/models/content/user_content.py b/app/core/models/content/user_content.py index 4f1d4e0..f3b6361 100644 --- a/app/core/models/content/user_content.py +++ b/app/core/models/content/user_content.py @@ -3,6 +3,7 @@ from sqlalchemy import Column, BigInteger, Integer, String, ForeignKey, DateTime from sqlalchemy.orm import relationship from app.core.models.base import AlchemyBase from app.core.models.content.indexation_mixins import UserContentIndexationMixin +from datetime import datetime class UserContent(AlchemyBase, UserContentIndexationMixin): @@ -14,12 +15,12 @@ class UserContent(AlchemyBase, UserContentIndexationMixin): owner_address = Column(String(1024), nullable=True) code_hash = Column(String(128), nullable=True) data_hash = Column(String(128), nullable=True) - updated = Column(DateTime, nullable=False, default=0) + updated = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) content_id = Column(Integer, ForeignKey('node_storage.id'), nullable=True) - created = Column(DateTime, nullable=False, default=0) + created = Column(DateTime, nullable=False, default=datetime.utcnow) - meta = Column(JSON, nullable=False, default={}) + meta = Column(JSON, nullable=False, default=dict) user_id = Column(Integer, ForeignKey('users.id'), nullable=False) wallet_connection_id = Column(Integer, ForeignKey('wallet_connections.id'), nullable=True) status = Column(String(64), nullable=False, default='active') # 'transaction_requested' @@ -41,9 +42,8 @@ class UserAction(AlchemyBase): to_address = Column(String(1024), nullable=True) from_address = Column(String(1024), nullable=True) status = Column(String(128), nullable=True) - meta = Column(JSON, nullable=False, default={}) - created = Column(DateTime, nullable=False, default=0) + meta = Column(JSON, nullable=False, default=dict) + created = Column(DateTime, nullable=False, default=datetime.utcnow) user = relationship('User', uselist=False, foreign_keys=[user_id]) content = relationship('StoredContent', uselist=False, foreign_keys=[content_id]) - diff --git a/app/core/models/keys.py b/app/core/models/keys.py index cb55c36..65a18c7 100644 --- a/app/core/models/keys.py +++ b/app/core/models/keys.py @@ -1,5 +1,6 @@ from base58 import b58decode from sqlalchemy import Column, Integer, String, DateTime, JSON +from datetime import datetime from .base import AlchemyBase @@ -15,12 +16,12 @@ class KnownKey(AlchemyBase): public_key_hash = Column(String(64), nullable=False, unique=True) # base58 algo = Column(String(32), nullable=True, default=None) - meta = Column(JSON, nullable=False, default={}) + meta = Column(JSON, nullable=False, default=dict) # { # "I_user_id": TRUSTED_USER_ID, # } - created = Column(DateTime, nullable=False, default=0) + created = Column(DateTime, nullable=False, default=datetime.utcnow) # stored_content = relationship('StoredContent', back_populates='key') diff --git a/app/core/models/my_network.py b/app/core/models/my_network.py index 9dc6c43..9441b46 100644 --- a/app/core/models/my_network.py +++ b/app/core/models/my_network.py @@ -12,9 +12,9 @@ class KnownNode(AlchemyBase): public_key = Column(String(256), nullable=False) codebase_hash = Column(String(512), nullable=True) # Node software version reputation = Column(Integer, nullable=False, default=0) - last_sync = Column(DateTime, nullable=False, default=datetime.now) - meta = Column(JSON, nullable=False, default={}) - located_at = Column(DateTime, nullable=False, default=datetime.now) + last_sync = Column(DateTime, nullable=False, default=datetime.utcnow) + meta = Column(JSON, nullable=False, default=dict) + located_at = Column(DateTime, nullable=False, default=datetime.utcnow) class KnownNodeIncident(AlchemyBase): @@ -28,7 +28,7 @@ class KnownNodeIncident(AlchemyBase): severity = Column(Integer, nullable=False, default=1) # Severity level (1-low to 5-critical) resolved = Column(Boolean, nullable=False, default=False) # Whether the incident has been resolved resolved_at = Column(DateTime, nullable=True) # Timestamp when the incident was resolved - meta = Column(JSON, nullable=False, default={}) # Additional metadata if needed + meta = Column(JSON, nullable=False, default=dict) # Additional metadata if needed class RemoteContentIndex(AlchemyBase): @@ -41,7 +41,6 @@ class RemoteContentIndex(AlchemyBase): decrypted_hash = Column(String(128), nullable=True) # Decrypted content hash, available once permission is granted ton_address = Column(String(128), nullable=True) # TON network address for the content onchain_index = Column(Integer, nullable=True) # Onchain index or reference on a blockchain - meta = Column(JSON, nullable=False, default={}) # Additional metadata for flexible content description + meta = Column(JSON, nullable=False, default=dict) # Additional metadata for flexible content description last_updated = Column(DateTime, nullable=False, default=datetime.utcnow) # Timestamp of the last update created_at = Column(DateTime, nullable=False, default=datetime.utcnow) # Record creation timestamp - diff --git a/app/core/models/node_storage.py b/app/core/models/node_storage.py index 7573afe..2cd6e59 100644 --- a/app/core/models/node_storage.py +++ b/app/core/models/node_storage.py @@ -25,7 +25,8 @@ class StoredContent(AlchemyBase, AudioContentMixin): status = Column(String(32), nullable=True) filename = Column(String(1024), nullable=False) - meta = Column(JSON, nullable=False, default={}) + # Use a factory for JSON default to avoid shared mutable dict + meta = Column(JSON, nullable=False, default=dict) user_id = Column(Integer, ForeignKey('users.id'), nullable=True) owner_address = Column(String(1024), nullable=True) @@ -35,9 +36,11 @@ class StoredContent(AlchemyBase, AudioContentMixin): telegram_cid = Column(String(1024), nullable=True) codebase_version = Column(Integer, nullable=True) - created = Column(DateTime, nullable=False, default=0) - updated = Column(DateTime, nullable=False, default=0) - disabled = Column(DateTime, nullable=False, default=0) + # Use proper datetime defaults; updated also auto-updates on change + created = Column(DateTime, nullable=False, default=datetime.utcnow) + updated = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + # Timestamp of when content was disabled; None means active + disabled = Column(DateTime, nullable=True, default=None) disabled_by = Column(Integer, ForeignKey('users.id'), nullable=True, default=None) encrypted = Column(Boolean, nullable=False, default=False) diff --git a/app/core/models/promo.py b/app/core/models/promo.py index ba4ea00..6756426 100644 --- a/app/core/models/promo.py +++ b/app/core/models/promo.py @@ -13,4 +13,4 @@ class PromoAction(AlchemyBase): action_type = Column(String(64), nullable=False) # Type of action, e.g., 'referral', 'discount' action_ref = Column(String(512), nullable=False) # Reference to the action, e.g., promo code - created = Column(DateTime, nullable=False, default=datetime.now) + created = Column(DateTime, nullable=False, default=datetime.utcnow) diff --git a/app/core/models/tasks.py b/app/core/models/tasks.py index 2590c26..9847c76 100644 --- a/app/core/models/tasks.py +++ b/app/core/models/tasks.py @@ -15,11 +15,11 @@ class BlockchainTask(AlchemyBase): epoch = Column(Integer, nullable=True) seqno = Column(Integer, nullable=True) - created = Column(DateTime, nullable=False, default=datetime.now) - updated = Column(DateTime, nullable=False, default=datetime.now) + created = Column(DateTime, nullable=False, default=datetime.utcnow) + updated = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) user_id = Column(Integer, ForeignKey('users.id'), nullable=True) - meta = Column(JSON, nullable=False, default={}) + meta = Column(JSON, nullable=False, default=dict) status = Column(String(256), nullable=False) transaction_hash = Column(String(1024), nullable=True) diff --git a/app/core/models/transaction.py b/app/core/models/transaction.py index b8a299d..8a6b94e 100644 --- a/app/core/models/transaction.py +++ b/app/core/models/transaction.py @@ -13,8 +13,8 @@ class UserBalance(AlchemyBase): asset_id = Column(Integer, ForeignKey('assets.id'), nullable=False) balance = Column(Float, nullable=False, default=0) - updated = Column(DateTime, nullable=False, default=0) - created = Column(DateTime, nullable=False, default=0) + updated = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) + created = Column(DateTime, nullable=False, default=datetime.utcnow) user = relationship('User', uselist=False, foreign_keys=[user_id], back_populates='balances') asset = relationship('Asset', uselist=False, foreign_keys=[asset_id], back_populates='balances') @@ -32,7 +32,7 @@ class InternalTransaction(AlchemyBase): spent_transaction_id = Column(Integer, ForeignKey('internal_transactions.id'), nullable=True) type = Column(String(256), nullable=False, default="NOT_SPECIFIED") - created = Column(DateTime, nullable=False, default=0) + created = Column(DateTime, nullable=False, default=datetime.utcnow) user = relationship('User', uselist=False, back_populates='internal_transactions', foreign_keys=[user_id]) asset = relationship('Asset', uselist=False, foreign_keys=[asset_id]) diff --git a/app/core/models/user/__init__.py b/app/core/models/user/__init__.py index 35a2d67..447352c 100644 --- a/app/core/models/user/__init__.py +++ b/app/core/models/user/__init__.py @@ -18,7 +18,7 @@ class User(AlchemyBase, DisplayMixin, TranslationCore, AuthenticationMixin_V1, W username = Column(String(512), nullable=True) lang_code = Column(String(8), nullable=False, default="en") - meta = Column(JSON, nullable=False, default={}) + meta = Column(JSON, nullable=False, default=dict) last_use = Column(DateTime, nullable=False, default=datetime.utcnow) updated = Column(DateTime, nullable=False, default=datetime.utcnow) @@ -32,4 +32,3 @@ class User(AlchemyBase, DisplayMixin, TranslationCore, AuthenticationMixin_V1, W def __str__(self): return f"User, {self.id}_{self.telegram_id} | Username: {self.username} " + '\\' - diff --git a/app/core/models/user_activity.py b/app/core/models/user_activity.py index 99f8291..587a83f 100644 --- a/app/core/models/user_activity.py +++ b/app/core/models/user_activity.py @@ -2,6 +2,7 @@ from sqlalchemy import Column, BigInteger, Integer, String, ForeignKey, DateTime, JSON, Boolean from sqlalchemy.orm import relationship from .base import AlchemyBase +from datetime import datetime class UserActivity(AlchemyBase): @@ -9,10 +10,10 @@ class UserActivity(AlchemyBase): id = Column(Integer, autoincrement=True, primary_key=True) type = Column(String(64), nullable=False) - meta = Column(JSON, nullable=False, default={}) + meta = Column(JSON, nullable=False, default=dict) user_id = Column(Integer, ForeignKey('users.id'), nullable=True) user_ip = Column(String(64), nullable=True) - created = Column(DateTime, nullable=False, default=0) + created = Column(DateTime, nullable=False, default=datetime.utcnow) user = relationship('User', uselist=False, foreign_keys=[user_id]) diff --git a/app/core/models/wallet_connection.py b/app/core/models/wallet_connection.py index fd799c0..d8e48b4 100644 --- a/app/core/models/wallet_connection.py +++ b/app/core/models/wallet_connection.py @@ -1,5 +1,6 @@ from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, JSON, Boolean from sqlalchemy.orm import relationship +from datetime import datetime from .base import AlchemyBase @@ -15,11 +16,11 @@ class WalletConnection(AlchemyBase): wallet_address = Column(String(1024), nullable=False) - keys = Column(JSON, nullable=False, default={}) - meta = Column(JSON, nullable=False, default={}) + keys = Column(JSON, nullable=False, default=dict) + meta = Column(JSON, nullable=False, default=dict) - created = Column(DateTime, nullable=False, default=0) - updated = Column(DateTime, nullable=False, default=0) + created = Column(DateTime, nullable=False, default=datetime.utcnow) + updated = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) invalidated = Column(Boolean, nullable=False, default=True) without_pk = Column(Boolean, nullable=False, default=False)