commit a2f2d867d3f8cef97f7a34ce7cca0823aa2b4fbd Author: profitroll Date: Wed Apr 26 16:07:49 2023 +0200 Initial commit diff --git a/main.py b/main.py new file mode 100644 index 0000000..1cc757f --- /dev/null +++ b/main.py @@ -0,0 +1,163 @@ +from datetime import datetime +from os import makedirs, path +from pathlib import Path +from typing import Any +from locale import setlocale, LC_ALL + +from docxtpl import DocxTemplate + +from modules.utils import json_read + + +def local_if_available(data: dict, data_local: dict, *args: str) -> Any: + return + + +def main(): + for lang in config["languages"]: + data = json_read(Path("data", "default.json")) + local_data = json_read(Path("data", f"{lang}.json")) + local_config = json_read(Path("configs", f"{lang}.json")) + setlocale(LC_ALL, local_config["locale"]) + + template = DocxTemplate(Path("templates", f"{lang}.docx")) + + location_birth = None + for alt_name in data["header"]["birth_place"]["alternateNames"]: + if alt_name["lang"] == lang: + location_birth = alt_name["name"] + break + if location_birth is None: + location_birth = data["header"]["birth_place"]["toponymName"] + + location_live = local_config["header"]["formats"]["address"].format( + street=data["header"]["location"]["street"], + number=data["header"]["location"]["number"], + zip=data["header"]["location"]["zip"], + city=data["header"]["location"]["city"], + ) + + out_table_jobs = [] + + for job in data["table_jobs"]: + if job["time_start"] == job["time_end"]: + job_time = local_config["jobs"]["placeholders"]["single"].format( + start=datetime.fromisoformat(job["time_start"]).strftime( + local_config["jobs"]["formats"]["default"] + ) + ) + elif job["time_end"] is None: + job_time = local_config["jobs"]["placeholders"]["ongoing"].format( + start=datetime.fromisoformat(job["time_start"]).strftime( + local_config["jobs"]["formats"]["default"] + ) + ) + else: + job_time = local_config["jobs"]["placeholders"]["from_to"].format( + start=datetime.fromisoformat(job["time_start"]).strftime( + local_config["jobs"]["formats"]["default"] + ), + end=datetime.fromisoformat(job["time_end"]).strftime( + local_config["jobs"]["formats"]["default"] + ), + ) + out_table_jobs.append( + { + "time": job_time, + "description": job["description"] + "\n", + } + ) + + out_table_education = [] + + for education in data["table_education"]: + if education["time_start"] == education["time_end"]: + education_time = local_config["education"]["placeholders"][ + "single" + ].format( + start=datetime.fromisoformat(education["time_start"]).strftime( + local_config["education"]["formats"]["default"] + ) + ) + elif education["time_end"] is None: + education_time = local_config["education"]["placeholders"][ + "ongoing" + ].format( + start=datetime.fromisoformat(education["time_start"]).strftime( + local_config["education"]["formats"]["default"] + ) + ) + else: + education_time = local_config["education"]["placeholders"][ + "from_to" + ].format( + start=datetime.fromisoformat(education["time_start"]).strftime( + local_config["education"]["formats"]["default"] + ), + end=datetime.fromisoformat(education["time_end"]).strftime( + local_config["education"]["formats"]["default"] + ), + ) + out_table_education.append( + { + "time": education_time, + "description": education["description"] + "\n", + } + ) + + context = { + "name": data["header"]["name"], + "surname": data["header"]["surname"], + "birth_data": local_config["header"]["placeholders"][ + "birth_date_place" + ].format( + date=datetime.fromisoformat(data["header"]["birth_date"]).strftime( + local_config["header"]["formats"]["date"] + ), + city=location_birth, + country=data["header"]["birth_place"]["countryName"], + ), + "location": location_live, + "family_status": local_data["header"]["family_status"].title(), + "nationality": local_data["header"]["nationality"].title(), + "email": data["header"]["email"], + "phone": data["header"]["phone"], + "website": data["header"]["website"], + "table_jobs": out_table_jobs, + "table_education": out_table_education, + "skills": data["skills"], + "hobbies": data["hobbies"], + "signature": local_config["footer"]["placeholders"]["signature"].format( + city=signature_location, + date=datetime.now().strftime("%x"), + ), + } + + template.render(context) + + makedirs("output", exist_ok=True) + template.save(Path("output", f"{lang}.docx")) + + print( + f"Created output for '{lang}' and saved to {Path('output', f'{lang}.docx').absolute()}", + flush=True, + ) + + +if __name__ == "__main__": + config = json_read(Path("config.json")) + makedirs(Path(".cache"), exist_ok=True) + if not path.exists(Path(".cache", "location")): + signature_location = input("Please, enter signature location: ") + with open(Path(".cache", "location"), "w", encoding="utf-8") as file: + file.write(signature_location) + else: + with open(Path(".cache", "location"), "r", encoding="utf-8") as file: + cached_location = file.read() + signature_location = input( + f"Please, enter signature location (send Enter to use previous location '{cached_location}'): " + ) + signature_location = ( + cached_location if signature_location == "" else signature_location + ) + main() diff --git a/modules/utils.py b/modules/utils.py new file mode 100644 index 0000000..d3dbd1f --- /dev/null +++ b/modules/utils.py @@ -0,0 +1,9 @@ +from json import loads +from pathlib import Path +from typing import Any, Union + + +def json_read(filepath: Union[str, Path]) -> Any: + with open(str(filepath), "r", encoding="utf-8") as file: + output = loads(file.read()) + return output diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..10f69dc --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +docx==0.2.4 +docxtpl==0.16.6 \ No newline at end of file