Skip to content

Commit edaec6a

Browse files
committed
rework class Environment to accomodate required/optional param
1 parent 23bf251 commit edaec6a

6 files changed

Lines changed: 63 additions & 28 deletions

File tree

src/email.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,21 +86,22 @@ def fmt_date(dt: datetime):
8686
body += "\n\n"
8787
body += "Best,"
8888
body += "\n\n"
89-
body += Environment.get(ENV_EMAIL_SIGNATURE)
89+
body += Environment.get_email_signature()
9090
body += "\n\n"
9191
body += (
9292
"Disclaimer: This is an auto-generated email. We may follow up with you in"
9393
+ " this thread, and feel free to reply to this thread if you'd like to follow up with us!"
9494
)
9595

96-
cc_emails = cast_list_str(Environment.safe_get(ENV_EMAIL_CC, ""))
96+
cc_emails = Environment.get_email_cc()
97+
cc_emails = cast_list_str(cc_emails) if cc_emails else []
9798

9899
return cls(
99100
to_email=student.get_email(),
100-
from_email=Environment.get(ENV_EMAIL_FROM),
101+
from_email=Environment.get_email_from(),
101102
cc_emails=cc_emails,
102-
reply_to_email=Environment.get(ENV_EMAIL_REPLY_TO),
103-
subject=Environment.get(ENV_EMAIL_SUBJECT),
103+
reply_to_email=Environment.get_email_reply_to(),
104+
subject=Environment.get_email_subject(),
104105
body=body,
105106
)
106107

@@ -140,7 +141,7 @@ def send(self) -> None:
140141
smtp_password = os.environ['SMTP_PASSWORD']
141142
sender_email = os.environ['SENDER_EMAIL']
142143

143-
SENDERNAME = Environment.get(ENV_EMAIL_FROM)
144+
SENDERNAME = Environment.get_email_from()
144145
receiver_email = self.to_email
145146
cc_emails = self.cc_emails
146147
reply_to_email = self.reply_to_email

src/gradescope.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ class Gradescope:
1313
"""
1414

1515
def __init__(self) -> None:
16-
email = Environment.get("GRADESCOPE_EMAIL")
17-
password = Environment.get("GRADESCOPE_PASSWORD")
16+
email = Environment.get_gradescope_email()
17+
password = Environment.get_gradescope_password()
1818

1919
try:
2020
self.client = GradescopeClient(email=email, password=password)
@@ -23,15 +23,15 @@ def __init__(self) -> None:
2323

2424
@staticmethod
2525
def is_enabled():
26-
return cast_bool(Environment.safe_get("EXTEND_GRADESCOPE_ASSIGNMENTS", "No"))
26+
return Environment.get_extend_gradescope_assignments()
2727

2828
def apply_extension(self, assignment_name: str, assignment_urls: List[str], email: str, num_days: int) -> List[str]:
2929
warnings = []
30-
course_name = Environment.safe_get('COURSE_NAME', '')
30+
course_name = Environment.get_course_name()
3131

3232
for assignment_url in assignment_urls:
3333
prefix = '[{}] [{}{}] [{}] [{}] '.format(
34-
email, course_name + ' ', assignment_name, assignment_url, num_days)
34+
email, course_name + ' ' if course_name else '', assignment_name, assignment_url, num_days)
3535
print("Extending: " + prefix)
3636
try:
3737
course = self.client.get_course(course_url=assignment_url)

src/record.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,20 +163,20 @@ def apply_extensions(self, assignments: AssignmentList, gradescope: Gradescope)
163163
warnings = []
164164
for assignment in assignments:
165165
num_days = self.get_request(assignment_id=assignment.get_id())
166-
course_name = Environment.safe_get("COURSE_NAME", "")
166+
course_name = Environment.get_course_name()
167167

168168
if num_days:
169169

170170
if len(assignment.get_gradescope_assignment_urls()) == 0:
171171
print(
172172
"[{}{}] could not extend assignment deadline for {} (assignment URL's not set).".format(
173-
course_name + " ", assignment.get_name(), self.get_email()))
173+
course_name + ' ' if course_name else '', assignment.get_name(), self.get_email()))
174174
continue
175175

176176
elif not assignment.get_due_date():
177177
warnings.append(
178-
"[{} {}] could not extend assignment deadline for {} (deadline not set).".format(
179-
course_name + " ", assignment.get_name(), self.get_email()))
178+
"[{}{}] could not extend assignment deadline for {} (deadline not set).".format(
179+
course_name + ' ' if course_name else '', assignment.get_name(), self.get_email()))
180180
continue
181181

182182
else:

src/slack.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@ def __init__(self) -> None:
2020
self.warnings = []
2121
self.silent = False
2222

23-
if Environment.contains("SLACK_ENDPOINT"):
24-
self.webhooks.append(WebhookClient(Environment.get("SLACK_ENDPOINT")))
25-
if Environment.contains("SLACK_ENDPOINT_DEBUG"):
26-
if Environment.get("SLACK_ENDPOINT_DEBUG") != Environment.get("SLACK_ENDPOINT"):
27-
self.webhooks.append(WebhookClient(Environment.get("SLACK_ENDPOINT_DEBUG")))
23+
webhook = Environment.get_slack_endpoint()
24+
debug_webhook = Environment.get_slack_debug_endpoint()
25+
26+
if webhook:
27+
self.webhooks.append(WebhookClient(webhook))
28+
if debug_webhook and debug_webhook != webhook:
29+
self.webhooks.append(WebhookClient(debug_webhook))
30+
2831
# after Slack configuration if there is no webhook then suppress any Slack action
2932
if not self.webhooks:
3033
# TODO: send warning that no slack endpoint is set up, printing log to GCP instead
@@ -83,7 +86,7 @@ def send_message(self, message: str) -> None:
8386

8487
@staticmethod
8588
def get_tags() -> str:
86-
slack_tags = Environment.safe_get("SLACK_TAG_LIST")
89+
slack_tags = Environment.get_slack_tag_list()
8790
prefix = ""
8891
if slack_tags:
8992
uids = cast_list_str(slack_tags)
@@ -137,7 +140,7 @@ def send_student_update(self, message: str, autoapprove: bool = False) -> None:
137140
{
138141
"type": "button",
139142
"text": {"type": "plain_text", "text": "View Spreadsheet"},
140-
"url": Environment.get("SPREADSHEET_URL"),
143+
"url": Environment.get_spreadsheet_url(),
141144
},
142145
],
143146
},

src/submission.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def __init__(self, form_payload: Dict[str, Any], question_sheet: Sheet, assignme
3232
self.responses[key] = str(form_payload[question][0])
3333

3434
self.responses["Timestamp"] = form_payload["Timestamp"][0]
35-
self.responses["Course Name"] = Environment.get_course_name()
35+
# self.responses["Course Name"] = Environment.get_course_name()
3636
print(self.responses)
3737

3838
def get_timestamp(self) -> str:

src/utils.py

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111

1212
PST = timezone("US/Pacific")
1313

14+
DEFAULT_EMAIL_SIGNATURE = "DATA 000 Staff"
15+
DEFAULT_EMAIL_SUBJECT = "[DATA 000] Extension Request Update"
16+
1417

1518
def cast_bool(cell: str) -> bool:
1619
cell = str(cell).strip()
@@ -83,18 +86,22 @@ def get(key: str) -> Any:
8386
@staticmethod
8487
def get_email_from() -> str:
8588
return str(Environment.get("EMAIL_FROM"))
89+
90+
@staticmethod
91+
def get_email_cc() -> Optional[str]:
92+
return Environment.safe_get("EMAIL_CC")
8693

8794
@staticmethod
8895
def get_email_signature() -> str:
89-
return str(Environment.safe_get("EMAIL_SIGNATURE", "Data 000 Staff"))
96+
return Environment.safe_get("EMAIL_SIGNATURE", DEFAULT_EMAIL_SIGNATURE)
9097

9198
@staticmethod
9299
def get_email_subject() -> str:
93-
return str(Environment.safe_get("EMAIL_SUBJECT", "[DATA 000] Extension Request Update"))
100+
return Environment.safe_get("EMAIL_SUBJECT", DEFAULT_EMAIL_SUBJECT)
94101

95102
@staticmethod
96103
def get_email_reply_to() -> str:
97-
return str(Environment.get("EMAIL_REPLY_TO"))
104+
return Environment.get("EMAIL_REPLY_TO")
98105

99106
@staticmethod
100107
def get_auto_approve_threshold() -> int:
@@ -114,14 +121,38 @@ def get_max_total_requested_extensions_threshold() -> int:
114121
# If this number is 0, then reject all extensions.
115122
# If this number is > 0, then reject extensions if the total number of extensions requested exceeds this number.
116123
return int(Environment.safe_get("MAX_TOTAL_REQUESTED_EXTENSIONS_THRESHOLD", default=-1))
124+
125+
@staticmethod
126+
def get_slack_endpoint() -> Optional[str]:
127+
return Environment.safe_get("SLACK_ENDPOINT")
128+
129+
@staticmethod
130+
def get_slack_debug_endpoint() -> Optional[str]:
131+
return Environment.safe_get("SLACK_DEBUG_ENDPOINT")
132+
133+
@staticmethod
134+
def get_slack_tag_list() -> Optional[str]:
135+
return Environment.safe_get("SLACK_TAG_LIST")
117136

118137
@staticmethod
119138
def get_extend_gradescope_assignments() -> bool:
120139
return cast_bool(Environment.safe_get("EXTEND_GRADESCOPE_ASSIGNMENTS", "No"))
140+
141+
@staticmethod
142+
def get_gradescope_email() -> Optional[str]:
143+
return Environment.safe_get("GRADESCOPE_EMAIL")
144+
145+
@staticmethod
146+
def get_gradescope_password() -> Optional[str]:
147+
return Environment.safe_get("GRADESCOPE_PASSWORD")
148+
149+
@staticmethod
150+
def get_spreadsheet_url() -> Optional[str]:
151+
return Environment.safe_get("SPREADSHEET_URL")
121152

122153
@staticmethod
123-
def get_course_name() -> str:
124-
return str(Environment.safe_get("COURSE_NAME", ""))
154+
def get_course_name() -> Optional[str]:
155+
return Environment.safe_get("COURSE_NAME")
125156

126157
@staticmethod
127158
def configure_env_vars(sheet: Sheet):

0 commit comments

Comments
 (0)