new files types inferred from file names 🟪

This commit is contained in:
Daniel Roth 2026-05-13 13:41:41 +00:00
parent b3a68a264a
commit 39c5fd5769

View file

@ -1,5 +1,5 @@
from enum import Enum
from typing import Optional
from typing import Callable, Optional
from backend.app.db.models.uploaded_file import FileTypeEnum
@ -19,34 +19,51 @@ class CoreFiles(Enum):
RETROFIT_DESIGN_DOC = "Retrofit Design Doc"
CORE_TO_FILETYPE_MAP = {
CoreFiles.PHOTOPACK: FileTypeEnum.PHOTO_PACK.value,
CoreFiles.SITENOTE: FileTypeEnum.SITE_NOTE.value,
CoreFiles.RDSAP_SITENOTE: FileTypeEnum.RD_SAP_SITE_NOTE.value,
CoreFiles.PAS2023_VENTILATION: FileTypeEnum.PAS_2023_VENTILATION.value,
CoreFiles.PAS2023_CONDITION: FileTypeEnum.PAS_2023_CONDITION.value,
CoreFiles.PAS_SIGNIFICANCE: FileTypeEnum.PAS_SIGNIFICANCE.value,
CoreFiles.PAR_PHOTOPACK: FileTypeEnum.PAR_PHOTO_PACK.value,
CoreFiles.PAS2023_PROPERTY: FileTypeEnum.PAS_2023_PROPERTY.value,
CoreFiles.PAS2023_OCCUPANCY: FileTypeEnum.PAS_2023_OCCUPANCY.value,
CoreFiles.IMPROVEMENT_OPTION_EVALUATION: FileTypeEnum.IMPROVEMENT_OPTION_EVALUATION.value,
CoreFiles.MEDIUM_TERM_IMPROVEMENT_PLAN: FileTypeEnum.MEDIUM_TERM_IMPROVEMENT_PLAN.value,
CoreFiles.RETROFIT_DESIGN_DOC: FileTypeEnum.RETROFIT_DESIGN_DOC.value,
}
_MATCHERS: list[tuple[Callable[[str], bool], str]] = [
(lambda f: f.startswith(CoreFiles.PHOTOPACK.value), FileTypeEnum.PHOTO_PACK.value),
(lambda f: f.startswith(CoreFiles.SITENOTE.value), FileTypeEnum.SITE_NOTE.value),
(
lambda f: f.startswith(CoreFiles.RDSAP_SITENOTE.value),
FileTypeEnum.RD_SAP_SITE_NOTE.value,
),
(
lambda f: f.startswith(CoreFiles.PAS2023_VENTILATION.value),
FileTypeEnum.PAS_2023_VENTILATION.value,
),
(
lambda f: f.startswith(CoreFiles.PAS2023_CONDITION.value),
FileTypeEnum.PAS_2023_CONDITION.value,
),
(
lambda f: f.startswith(CoreFiles.PAS_SIGNIFICANCE.value),
FileTypeEnum.PAS_SIGNIFICANCE.value,
),
(
lambda f: f.startswith(CoreFiles.PAR_PHOTOPACK.value),
FileTypeEnum.PAR_PHOTO_PACK.value,
),
(
lambda f: f.startswith(CoreFiles.PAS2023_PROPERTY.value),
FileTypeEnum.PAS_2023_PROPERTY.value,
),
(
lambda f: f.startswith(CoreFiles.PAS2023_OCCUPANCY.value),
FileTypeEnum.PAS_2023_OCCUPANCY.value,
),
(
lambda f: CoreFiles.IMPROVEMENT_OPTION_EVALUATION.value in f,
FileTypeEnum.IMPROVEMENT_OPTION_EVALUATION.value,
),
(
lambda f: CoreFiles.MEDIUM_TERM_IMPROVEMENT_PLAN.value in f,
FileTypeEnum.MEDIUM_TERM_IMPROVEMENT_PLAN.value,
),
(lambda f: "-OSM-" in f and "DR-N-A" in f, FileTypeEnum.RETROFIT_DESIGN_DOC.value),
]
def infer_file_type(filename: str) -> Optional[str]:
for core_file, file_type in CORE_TO_FILETYPE_MAP.items():
if filename.startswith(core_file.value):
for matcher, file_type in _MATCHERS:
if matcher(filename):
return file_type
if CoreFiles.IMPROVEMENT_OPTION_EVALUATION.value in filename:
return CORE_TO_FILETYPE_MAP[CoreFiles.IMPROVEMENT_OPTION_EVALUATION]
if CoreFiles.MEDIUM_TERM_IMPROVEMENT_PLAN.value in filename:
return CORE_TO_FILETYPE_MAP[CoreFiles.MEDIUM_TERM_IMPROVEMENT_PLAN]
if "-OSM-" in filename and "DR-N-A" in filename:
return CORE_TO_FILETYPE_MAP[CoreFiles.RETROFIT_DESIGN_DOC]
return None