forked from cs161-staff/extensions
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathgradescope.py
More file actions
47 lines (38 loc) · 1.84 KB
/
gradescope.py
File metadata and controls
47 lines (38 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from typing import List
from gradescope_api.client import GradescopeClient
from src.environment import Environment
from src.errors import GradescopeError
from src.utils import cast_bool, truncate
class Gradescope:
"""
An interface to apply extensions to Gradescope. This relies on `cs161-staff/gradescope-api`, an unofficial,
minimal Gradescope API wrapper designed specifically for extension management.
"""
def __init__(self) -> None:
email = Environment.get("GRADESCOPE_EMAIL")
password = Environment.get("GRADESCOPE_PASSWORD")
try:
self.client = GradescopeClient(email=email, password=password)
except Exception as err:
raise GradescopeError(f"Failed to sign into Gradescope: {err}")
@staticmethod
def is_enabled():
return cast_bool(Environment.get_extend_gradescope_assignments())
def apply_extension(self, assignment_name: str, assignment_urls: List[str], email: str, num_days: int) -> List[str]:
warnings = []
course_name = Environment.safe_get('COURSE_NAME', '')
for assignment_url in assignment_urls:
prefix = '[{}] [{}{}] [{}] [{}] '.format(
email, course_name + ' ', assignment_name, assignment_url, num_days)
print("Extending: " + prefix)
try:
course = self.client.get_course(course_url=assignment_url)
assignment = course.get_assignment(assignment_url=assignment_url)
assignment.apply_extension(email=email, num_days=num_days)
except Exception as err:
print("GradescopeAPIError: " + str(err))
warnings.append(
prefix
+ f"failed to extend assignment in Gradescope: internal Gradescope error occurred ({truncate(err)})"
)
return warnings