""" Contains the legacy models of files for url redirect support. Going
forward, onegov.file and onegov.org.models.file is used.
"""
import base64
from onegov.core.filestorage import FilestorageFile
from onegov.core import utils
from typing import Any, TYPE_CHECKING
if TYPE_CHECKING:
from datetime import date as date_t
from onegov.org.app import OrgApp
from typing import Self
[docs]
class LegacyFileCollection:
def __init__(self, app: 'OrgApp') -> None:
assert app.has_filestorage and app.filestorage is not None
[docs]
self.path_prefix = 'files/'
[docs]
self.file_storage = utils.makeopendir(app.filestorage, 'files')
[docs]
def get_file_by_filename(self, filename: str) -> 'LegacyFile | None':
if self.file_storage.exists(filename):
return LegacyFile(filename)
return None
[docs]
class LegacyImageCollection:
def __init__(self, app: 'OrgApp') -> None:
assert app.has_filestorage and app.filestorage is not None
[docs]
self.path_prefix = 'images/'
[docs]
self.file_storage = utils.makeopendir(app.filestorage, 'images')
[docs]
def get_file_by_filename(self, filename: str) -> 'LegacyImage | None':
if self.file_storage.exists(filename):
return LegacyImage(filename)
return None
[docs]
class LegacyFile(FilestorageFile):
""" A filestorage file that points to an uploaded image or file. """
def __init__(self, filename: str, info: dict[str, Any] | None = None):
[docs]
self.filename = filename
@property
[docs]
def date(self) -> 'date_t | None':
if 'modified_time' in self.info:
return self.info['modified_time'].date()
return None
@property
[docs]
def path(self) -> str: # type:ignore[override]
return 'files/' + self.filename
@property
[docs]
def original_name(self) -> bytes | None:
if '-' in self.filename:
name = str(self.filename.split('-')[0])
return base64.urlsafe_b64decode(name).strip()
return None
@classmethod
[docs]
def from_url(cls, url: str) -> 'Self':
return cls(url.split('/')[-1])
[docs]
class LegacyImage(LegacyFile):
""" A filestorage file that points to a full image (not a thumbnail). """
@property
[docs]
def path(self) -> str: # type:ignore[override]
return 'images/' + self.filename