1
+ import json
1
2
import logging
2
3
3
4
from django .core .management .base import BaseCommand
4
5
from tqdm import tqdm
5
6
6
7
from courses import registrar
7
8
from courses .models import Course , Section
8
- from courses .util import get_course_and_section , get_current_semester
9
+ from courses .util import (
10
+ get_course_and_section ,
11
+ get_current_semester ,
12
+ record_update ,
13
+ translate_semester_inv ,
14
+ )
9
15
10
16
11
- def set_all_status (semester = None ):
17
+ def set_all_status (semester = None , add_status_update = False ):
12
18
if semester is None :
13
19
semester = get_current_semester ()
14
20
statuses = registrar .get_all_course_status (semester )
@@ -19,22 +25,56 @@ def set_all_status(semester=None):
19
25
if section_code is None :
20
26
continue
21
27
28
+ course_status = status .get ("status" )
29
+ if course_status is None :
30
+ continue
31
+
32
+ course_term = status .get ("term" )
33
+ if course_term is None :
34
+ continue
35
+ if any (course_term .endswith (s ) for s in ["10" , "20" , "30" ]):
36
+ course_term = translate_semester_inv (course_term )
37
+
38
+ # Ignore sections not in db
22
39
try :
23
40
_ , section = get_course_and_section (section_code , semester )
24
41
except (Section .DoesNotExist , Course .DoesNotExist ):
25
42
continue
26
- section .status = status ["status" ]
27
- section .save ()
43
+
44
+ # Resync database (doesn't need to be atomic)
45
+ last_status_update = section .last_status_update
46
+ current_status = section .status
47
+
48
+ # Change status attribute of section model (might want to use bulk update)
49
+ if current_status != course_status :
50
+ section .status = course_status
51
+ section .save ()
52
+
53
+ # Add corresponding status update object
54
+ if add_status_update and last_status_update .new_status != course_status :
55
+ record_update (
56
+ section ,
57
+ course_term ,
58
+ last_status_update .new_status ,
59
+ course_status ,
60
+ False ,
61
+ json .dumps (status ),
62
+ )
28
63
29
64
30
65
class Command (BaseCommand ):
31
- help = "Load course status for courses in the DB"
66
+ help = "Load course status for courses in the DB. Conditionally adds StatusUpdate objects. "
32
67
33
68
def add_arguments (self , parser ):
34
69
parser .add_argument ("--semester" , default = None , type = str )
70
+ parser .add_argument (
71
+ "--create-status-updates" , action = "store_false" , help = "Create status updates if set"
72
+ )
35
73
36
74
def handle (self , * args , ** kwargs ):
37
75
root_logger = logging .getLogger ("" )
38
76
root_logger .setLevel (logging .DEBUG )
39
77
40
- set_all_status (semester = kwargs ["semester" ])
78
+ set_all_status (
79
+ semester = kwargs ["semester" ], add_status_update = kwargs ["create-status-updates" ]
80
+ )
0 commit comments