add web
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user