63 lines
2.6 KiB
Python
63 lines
2.6 KiB
Python
from app.models.asset import Asset
|
|
from app.models.asset_version import AssetVersion
|
|
from app.models.user import User
|
|
from datetime import datetime
|
|
from app.extensions import db
|
|
from app.util import auth, redislock
|
|
|
|
def CreateNewAssetVersion( Asset : Asset, FileHash : str, ForceNewVersion : bool = False, UploadedBy : User | None = None ) -> AssetVersion:
|
|
"""
|
|
Creates a new asset version for the given asset
|
|
Returns the new asset version
|
|
"""
|
|
AssetLockName = f"createassetversion_{Asset.id}"
|
|
CreateLock = redislock.acquire_lock(AssetLockName, acquire_timeout=20, lock_timeout=1)
|
|
if CreateLock is None:
|
|
return None
|
|
|
|
ExistingAssetVersion : AssetVersion = AssetVersion.query.filter_by( asset_id=Asset.id ).first()
|
|
if ExistingAssetVersion is None:
|
|
NewAssetVersion : AssetVersion = AssetVersion(
|
|
asset_id = Asset.id,
|
|
version = 1,
|
|
content_hash = FileHash,
|
|
created_at = datetime.utcnow(),
|
|
uploaded_by = UploadedBy.id if UploadedBy is not None else None
|
|
)
|
|
db.session.add(NewAssetVersion)
|
|
db.session.commit()
|
|
redislock.release_lock(AssetLockName, CreateLock)
|
|
return NewAssetVersion
|
|
|
|
ExistingAssetVersionWithSameHash : AssetVersion = AssetVersion.query.filter_by( asset_id=Asset.id, content_hash=FileHash ).first()
|
|
if ExistingAssetVersionWithSameHash is not None and not ForceNewVersion:
|
|
redislock.release_lock(AssetLockName, CreateLock)
|
|
return ExistingAssetVersionWithSameHash
|
|
|
|
CurrentVersion : int = AssetVersion.query.filter_by( asset_id=Asset.id ).order_by(AssetVersion.version.desc()).first().version
|
|
NewAssetVersion : AssetVersion = AssetVersion(
|
|
asset_id = Asset.id,
|
|
version = CurrentVersion + 1,
|
|
content_hash = FileHash,
|
|
created_at = datetime.utcnow(),
|
|
uploaded_by = UploadedBy.id if UploadedBy is not None else None
|
|
)
|
|
db.session.add(NewAssetVersion)
|
|
db.session.commit()
|
|
redislock.release_lock(AssetLockName, CreateLock)
|
|
return NewAssetVersion
|
|
|
|
def GetLatestAssetVersion( Asset : Asset ) -> AssetVersion:
|
|
"""
|
|
Gets the latest asset version for the given asset
|
|
Returns the latest asset version
|
|
"""
|
|
return AssetVersion.query.filter_by( asset_id=Asset.id ).order_by(AssetVersion.version.desc()).first()
|
|
|
|
def GetAssetVersion( Asset : Asset, Version : int ) -> AssetVersion:
|
|
"""
|
|
Gets the asset version for the given asset and version
|
|
Returns the asset version
|
|
"""
|
|
return AssetVersion.query.filter_by( asset_id=Asset.id, version=Version ).first()
|