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

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# 

12 

13from enum import StrEnum 

14from pathlib import Path 

15from typing import Self 

16 

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 

20 

21__all__ = ["AppEmailType"] 

22 

23_USR_DIR = USER_TEMPLATE_SUB_DIR 

24_ADM_DIR = ADMIN_TEMPLATE_SUB_DIR 

25 

26_USR_SUBJ = UserEmailSubject 

27_ADM_SUBJ = AdminEmailSubject 

28 

29 

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] 

41 

42 

43_ADM_TEMPLATE = Literal[ 

44 "contact", 

45 "flag_review", 

46 "app_log", 

47 "admin_report", 

48 "cron_report", 

49 "typesense_report", 

50] 

51 

52 

53# fmt: off 

54class AppEmailType(StrEnum): 

55 

56 template_name: str 

57 template_dir: str 

58 subject: str 

59 

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 

74 

75 

76 @property 

77 def html_name(self) -> str: 

78 return f"{self.template_name}.html.jinja" 

79 

80 @property 

81 def text_name(self) -> str: 

82 return f"{self.template_name}.txt.jinja" 

83 

84 @property 

85 def html_path(self) -> Path: 

86 return self.abs_template_dir / self.html_name 

87 

88 @property 

89 def text_path(self) -> Path: 

90 return self.abs_template_dir / self.text_name 

91 

92 @property 

93 def abs_template_dir(self) -> Path: 

94 return EMAIL_TEMPLATE_DIR / self.template_dir 

95 

96 

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)