Coverage for functions \ flipdare \ mailer \ app_email_type.py: 100%
68 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
1#!/usr/bin/env python
2# Copyright (c) 2026 Flipdare Pty Ltd. All rights reserved.
3#
4# This file is part of Flipdare's proprietary software and contains
5# confidential and copyrighted material. Unauthorised copying,
6# modification, distribution, or use of this file is strictly
7# prohibited without prior written permission from Flipdare Pty Ltd.
8#
9# This software includes third-party components licensed under MIT,
10# BSD, and Apache 2.0 licences. See THIRD_PARTY_NOTICES for details.
11#
13from enum import StrEnum
14from pathlib import Path
15from typing import Self
17from typing import Literal
18from flipdare.constants import ADMIN_TEMPLATE_SUB_DIR, EMAIL_TEMPLATE_DIR, USER_TEMPLATE_SUB_DIR
19from flipdare.message.email_subject import AdminEmailSubject, UserEmailSubject
21__all__ = ["AppEmailType"]
23_USR_DIR = USER_TEMPLATE_SUB_DIR
24_ADM_DIR = ADMIN_TEMPLATE_SUB_DIR
26_USR_SUBJ = UserEmailSubject
27_ADM_SUBJ = AdminEmailSubject
30_USER_TEMPLATE = Literal[
31 "signup_code",
32 "password_reset",
33 "delete_account",
34 "invite",
35 "dared",
36 "user_summary",
37 "voting",
38 "flag",
39 "flag_removed",
40]
43_ADM_TEMPLATE = Literal[
44 "contact",
45 "flag_review",
46 "app_log",
47 "admin_report",
48 "cron_report",
49 "typesense_report",
50]
53# fmt: off
54class AppEmailType(StrEnum):
56 template_name: str
57 template_dir: str
58 subject: str
60 def __new__(
61 cls,
62 code: str,
63 template_name: _USER_TEMPLATE | _ADM_TEMPLATE,
64 template_dir: str,
65 subject: str,
66 ) -> Self:
67 obj = str.__new__(cls, code)
68 obj._value_ = code
69 obj.template_name = template_name
70 obj.template_dir = template_dir
71 obj.subject = subject
72 return obj
73 # fmt: on
76 @property
77 def html_name(self) -> str:
78 return f"{self.template_name}.html.jinja"
80 @property
81 def text_name(self) -> str:
82 return f"{self.template_name}.txt.jinja"
84 @property
85 def html_path(self) -> Path:
86 return self.abs_template_dir / self.html_name
88 @property
89 def text_path(self) -> Path:
90 return self.abs_template_dir / self.text_name
92 @property
93 def abs_template_dir(self) -> Path:
94 return EMAIL_TEMPLATE_DIR / self.template_dir
97 #
98 # USER EMAILS
99 #
100 # admin
101 USR_SIGNUP_CODE = ("signup_code", "signup_code", _USR_DIR, _USR_SUBJ.SIGNUP_CODE)
102 USR_PASSWORD_RESET = ("password_reset", "password_reset", _USR_DIR, _USR_SUBJ.PASSWORD_RESET)
103 USR_DELETE_ACCOUNT = ("delete_account", "delete_account", _USR_DIR, _USR_SUBJ.DELETE_ACCOUNT)
104 USR_DELETE_ACCOUNT_COMPLETE = ("delete_account_complete", "delete_account", _USR_DIR, _USR_SUBJ.DELETE_ACCOUNT_COMPLETE)
105 # invite
106 USR_INVITE = ("invite", "invite", _USR_DIR, _USR_SUBJ.INVITE_TMPL)
107 USR_INVITE_REMINDER = ("invite_reminder", "invite", _USR_DIR, _USR_SUBJ.INVITE_REMINDER)
108 # dare
109 USR_DARED = ("dared", "dared", _USR_DIR, _USR_SUBJ.DARED_TMPL)
110 USR_DARED_RESPONSE = ("dared_response", "dared", _USR_DIR, _USR_SUBJ.DARED_RESPONSE_TMPL)
111 USR_DARED_COMPLETE = ("dared_complete", "dared", _USR_DIR, _USR_SUBJ.DARED_COMPLETE_TMPL)
112 USR_GROUP_DARED = ("group_dared", "dared", _USR_DIR, _USR_SUBJ.GROUP_DARED_TMPL)
113 USR_GROUP_DARED_RESPONSE = ("group_dared_response", "dared", _USR_DIR, _USR_SUBJ.GROUP_DARED_RESPONSE_TMPL)
114 USR_GROUP_DARED_COMPLETE = ("group_dared_complete", "dared", _USR_DIR, _USR_SUBJ.GROUP_DARED_COMPLETE_TMPL)
115 # misc
116 USR_USER_SUMMARY = ("user_summary", "user_summary", _USR_DIR, _USR_SUBJ.USER_SUMMARY_TMPL)
117 # voting
118 USR_VOTE_STARTED = ("vote_started", "voting", _USR_DIR, _USR_SUBJ.VOTE_STARTED_TMPL)
119 USR_VOTE_REMINDER = ("vote_reminder", "voting", _USR_DIR, _USR_SUBJ.VOTE_REMINDER_TMPL)
120 USR_VOTE_DECISION = ("vote_decision", "voting", _USR_DIR, _USR_SUBJ.VOTE_DECISION_TMPL)
121 # flag
122 USR_FLAG_REVIEW = ("flag_review", "flag", _USR_DIR, _USR_SUBJ.FLAG_REVIEW)
123 USR_FLAG_RECIPIENT = ("flag_recipient", "flag", _USR_DIR, _USR_SUBJ.FLAG_RECIPIENT)
124 USR_FLAG_RESTRICTION_APPLIED = ("flag_restriction_applied", "flag", _USR_DIR, _USR_SUBJ.FLAG_RESTRICTION_APPLIED)
125 USR_FLAG_RESTRICTION_REMOVED = ("flag_restriction_removed", "flag_removed", _USR_DIR, _USR_SUBJ.FLAG_RESTRICTION_REMOVED)
126 USR_SUMMARY = ("user_summary", "user_summary", _USR_DIR, _USR_SUBJ.USER_SUMMARY_TMPL)
127 #
128 # ADMIN
129 #
130 ADM_CONTACT = ("adm_contact", "contact", _ADM_DIR, _ADM_SUBJ.CONTACT)
131 ADM_FLAG_REVIEW = ("adm_flag_review", "flag_review", _ADM_DIR, _ADM_SUBJ.FLAG_REVIEW)
132 ADM_FLAG_NEW_SEVERE = ("adm_flag_new_severe", "flag_review", _ADM_DIR, _ADM_SUBJ.FLAG_NEW_SEVERE)
133 ADM_FLAG_NEW_MAJOR = ("adm_flag_new_major", "flag_review", _ADM_DIR, _ADM_SUBJ.FLAG_NEW_MAJOR)
134 ADM_APP_LOG = ("adm_app_log", "app_log", _ADM_DIR, _ADM_SUBJ.APP_LOG)
135 ADM_REPORT = ("adm_admin_report", "admin_report", _ADM_DIR, _ADM_SUBJ.ADMIN_REPORT)
136 ADM_TYPESENSE_REPORT = ("adm_typesense_report", "typesense_report", _ADM_DIR, _ADM_SUBJ.COMMAND)
137 ADM_CRON_REPORT = ("adm_cron_report", "cron_report", _ADM_DIR, _ADM_SUBJ.CRON_REPORT)