Skip to content

Commit 40935f5

Browse files
authored
Merge pull request #2972 from uw-it-aca/qa
Clean up dupplicate entries (#2971)
2 parents 9f12f3f + 87471cf commit 40935f5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+405
-149
lines changed

docker/prod-values.yml

+45-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ mountedSecrets:
122122
cronjob:
123123
enabled: true
124124
jobs:
125-
- name: load-section-status-changes
125+
- name: load-section-status
126126
schedule: "*/1 * * * *"
127127
command: ["/scripts/management_command.sh"]
128128
args: ["load_section_status_changes"]
@@ -177,6 +177,50 @@ cronjob:
177177
requests:
178178
cpu: 25m
179179
memory: 64Mi
180+
- name: course-cleanup
181+
schedule: "1 2 * * 2"
182+
command: ["/scripts/management_command.sh"]
183+
args: ["db-cleanup", "course"]
184+
resources:
185+
limits:
186+
cpu: 150m
187+
memory: 2048Mi
188+
requests:
189+
cpu: 50m
190+
memory: 1280Mi
191+
- name: seenreg-cleanup
192+
schedule: "1 2 * * 3"
193+
command: ["/scripts/management_command.sh"]
194+
args: ["db-cleanup", "seenreg"]
195+
resources:
196+
limits:
197+
cpu: 150m
198+
memory: 2048Mi
199+
requests:
200+
cpu: 50m
201+
memory: 1280Mi
202+
- name: notice-cleanup
203+
schedule: "1 2 * * 4"
204+
command: ["/scripts/management_command.sh"]
205+
args: ["db-cleanup", "notice"]
206+
resources:
207+
limits:
208+
cpu: 150m
209+
memory: 4096Mi
210+
requests:
211+
cpu: 50m
212+
memory: 1280Mi
213+
- name: linkvisit-cleanup
214+
schedule: "1 2 * * 5"
215+
command: ["/scripts/management_command.sh"]
216+
args: ["db-cleanup", "linkvisit"]
217+
resources:
218+
limits:
219+
cpu: 150m
220+
memory: 4096Mi
221+
requests:
222+
cpu: 50m
223+
memory: 1280Mi
180224
environmentVariables:
181225
- name: AUTH
182226
value: SAML

myuw/dao/admin.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
import logging
55
import traceback
6-
from myuw.util.settings import get_myuw_astra_group_stem,\
7-
get_myuw_admin_group, get_myuw_override_group
6+
from myuw.util.settings import (
7+
get_myuw_astra_group_stem,
8+
get_myuw_admin_group, get_myuw_override_group)
89
from myuw.dao import get_netid_of_original_user, log_err
910
from myuw.dao.gws import gws
1011

myuw/dao/grad.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313
from uw_grad.leave import get_leave_by_syskey
1414
from uw_grad.petition import get_petition_by_syskey
1515
from myuw.dao.pws import get_student_system_key_of_current_user
16-
from myuw.dao.term import get_comparison_datetime,\
17-
get_eod_specific_quarter_after, get_eod_specific_quarter,\
18-
get_eod_specific_quarter_last_instruction
16+
from myuw.dao.term import (
17+
get_comparison_datetime,
18+
get_eod_specific_quarter_after, get_eod_specific_quarter,
19+
get_eod_specific_quarter_last_instruction)
1920

2021

2122
logger = logging.getLogger(__name__)

myuw/dao/iasystem.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
import logging
1010
import traceback
1111
from uw_iasystem.evaluation import search_evaluations
12-
from myuw.dao.pws import get_student_number_of_current_user,\
13-
get_person_by_employee_id
12+
from myuw.dao.pws import (
13+
get_student_number_of_current_user,
14+
get_person_by_employee_id)
1415
from myuw.dao import log_err
1516
from myuw.dao.term import (
1617
get_comparison_datetime, get_comparison_datetime_with_tz,

myuw/dao/instructor.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
from uw_sws.section import get_last_section_by_instructor_and_terms
88
from myuw.dao import is_using_file_dao, log_err
99
from myuw.dao.pws import get_person_of_current_user
10-
from myuw.dao.term import get_term_before, get_previous_quarter,\
11-
get_current_quarter, get_specific_term
10+
from myuw.dao.term import (
11+
get_term_before, get_previous_quarter,
12+
get_current_quarter, get_specific_term)
1213
from myuw.dao.user import get_user_model
1314

1415
logger = logging.getLogger(__name__)

myuw/dao/instructor_mini_course_card.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
from myuw.models import UserCourseDisplay
5-
from myuw.dao.instructor_schedule import check_section_instructor,\
6-
get_section_by_label
5+
from myuw.dao.instructor_schedule import (
6+
check_section_instructor, get_section_by_label)
77
from myuw.dao.pws import get_person_of_current_user
88
from myuw.dao.user import get_user_model
99

myuw/dao/library.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import logging
1010
import traceback
1111
from uw_libraries.mylib import get_account
12-
from uw_libraries.subject_guides import get_subject_guide_for_section,\
13-
get_default_subject_guide
12+
from uw_libraries.subject_guides import (
13+
get_subject_guide_for_section, get_default_subject_guide)
1414
from restclients_core.exceptions import DataFailureException
1515
from myuw.dao import log_err
1616
from myuw.dao.pws import get_netid_of_current_user

myuw/dao/mailman.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
import logging
99
import re
1010
from django.core.mail import send_mail
11-
from uw_sws.section import get_section_by_label,\
12-
is_valid_section_label
11+
from uw_sws.section import (
12+
get_section_by_label, is_valid_section_label)
1313
from uw_mailman.basic_list import get_admin_url
14-
from uw_mailman.course_list import get_course_list_name,\
15-
exists_course_list, get_section_secondary_combined_list_name,\
16-
exists_section_secondary_combined_list, get_section_list_name
17-
from uw_mailman.instructor_term_list import\
18-
get_instructor_term_list_name, exists_instructor_term_list
14+
from uw_mailman.course_list import (
15+
exists_course_list, get_course_list_name,
16+
get_section_secondary_combined_list_name,
17+
exists_section_secondary_combined_list, get_section_list_name)
18+
from uw_mailman.instructor_term_list import (
19+
get_instructor_term_list_name, exists_instructor_term_list)
1920
from myuw.util.thread import ThreadWithResponse
2021
from myuw.util.settings import get_mailman_courserequest_recipient
2122
from myuw.logger.logresp import log_info

myuw/dao/thrive.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
import logging
77
import os
88
from myuw.dao.gws import in_fyp_group, in_au_xfer_group, in_wi_xfer_group
9-
from myuw.dao.term import get_comparison_date, get_current_quarter,\
10-
get_bod_current_term_class_start
9+
from myuw.dao.term import (
10+
get_comparison_date, get_current_quarter,
11+
get_bod_current_term_class_start)
1112

1213
logger = logging.getLogger(__name__)
1314
TARGET_FYP = "fyp"

myuw/dao/user_pref.py

-2
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ def get_migration_preference(request):
2424
pref = MigrationPreference.objects.get(user=user)
2525
except MigrationPreference.DoesNotExist:
2626
pref = MigrationPreference(user=user,
27-
use_legacy_site=False,
2827
display_onboard_message=True)
29-
3028
request.migration_preference = pref
3129
return pref
3230

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# Copyright 2023 UW-IT, University of Washington
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
"""
5+
Clean up the entries no longer useful
6+
"""
7+
8+
import logging
9+
import time
10+
from datetime import timedelta
11+
from django.db import connection
12+
from django.core.management.base import BaseCommand, CommandError
13+
from uw_sws import sws_now, SWS_TIMEZONE
14+
from myuw.models import (
15+
VisitedLinkNew, SeenRegistration, UserNotices, UserCourseDisplay)
16+
from myuw.logger.timer import Timer
17+
18+
logger = logging.getLogger(__name__)
19+
batch_size = 1000
20+
21+
22+
class Command(BaseCommand):
23+
24+
def add_arguments(self, parser):
25+
parser.add_argument('name', choices=[
26+
'course', 'notice', 'seenreg', 'linkvisit'],
27+
help="The table to check ")
28+
29+
def handle(self, *args, **options):
30+
self.action = options['name']
31+
32+
if self.action == 'course':
33+
self.course_display()
34+
if self.action == 'notice':
35+
self.notice_read()
36+
if self.action == 'seenreg':
37+
self.registration_seen()
38+
if self.action == 'linkvisit':
39+
self.link_visited()
40+
41+
def get_cut_off_date(self, days_delta=364):
42+
# default is 52 weeks (364 days)
43+
now = SWS_TIMEZONE.localize(sws_now())
44+
return now - timedelta(days=days_delta)
45+
46+
def deletion(self, ids_to_delete, queryf):
47+
try:
48+
while ids_to_delete and len(ids_to_delete) > 0:
49+
batch_ids = ids_to_delete[:batch_size]
50+
with connection.cursor() as cursor:
51+
placeholders = ','.join(
52+
str(id) for id in batch_ids)
53+
cursor.execute(
54+
queryf.format(placeholders))
55+
time.sleep(2)
56+
ids_to_delete = ids_to_delete[batch_size:]
57+
except Exception as ex:
58+
logger.error("{} {}\n".format(queryf, ex))
59+
raise CommandError(ex)
60+
61+
def course_display(self):
62+
# clean up after one year
63+
timer = Timer()
64+
queryf = "DELETE FROM user_course_display_pref WHERE id IN ({})"
65+
for y in range(2000, 2023):
66+
for q in ["winter", "spring", "summer", "autumn"]:
67+
if y == 2022 and q == "autumn":
68+
break
69+
for c in range(1, 9):
70+
qset = UserCourseDisplay.objects.filter(
71+
year=y, quarter=q, color_id=c)
72+
if qset.exists():
73+
ids_to_delete = qset.values_list('id', flat=True)
74+
self.deletion(ids_to_delete, queryf)
75+
logger.info(
76+
"Delete UserCourseDisplay {} {}, Time: {} sec\n".format(
77+
y, q, timer.get_elapsed()))
78+
79+
def notice_read(self):
80+
# clean up after 180 days
81+
timer = Timer()
82+
queryf = "DELETE FROM myuw_mobile_usernotices WHERE id IN ({})"
83+
cut_off_dt = self.get_cut_off_date(180)
84+
qset = UserNotices.objects.filter(first_viewed__lt=cut_off_dt)
85+
if qset.exists():
86+
ids_to_delete = qset.values_list('id', flat=True)
87+
self.deletion(ids_to_delete, queryf)
88+
logger.info(
89+
"Delete UserNotices viewed before {} Time: {} sec\n".format(
90+
cut_off_dt, timer.get_elapsed()))
91+
92+
def registration_seen(self):
93+
# clean up after the quarter ends
94+
timer = Timer()
95+
queryf = "DELETE FROM myuw_mobile_seenregistration WHERE id IN ({})"
96+
for y in range(2013, 2024):
97+
for q in ["winter", "spring", "summer", "autumn"]:
98+
if y == 2023 and q == "autumn":
99+
break
100+
qset = SeenRegistration.objects.filter(year=y, quarter=q)
101+
if qset.exists():
102+
ids_to_delete = qset.values_list('id', flat=True)
103+
self.deletion(ids_to_delete, queryf)
104+
logger.info(
105+
"Delete SeenRegistration {} {} Time: {}\n".format(
106+
y, q, timer.get_elapsed()))
107+
108+
def link_visited(self):
109+
# clean up after one year
110+
timer = Timer()
111+
queryf = "DELETE FROM myuw_visitedlinknew WHERE id IN ({})"
112+
cut_off_dt = self.get_cut_off_date()
113+
qset = VisitedLinkNew.objects.filter(visit_date__lt=cut_off_dt)
114+
if qset.exists():
115+
ids_to_delete = qset.values_list('id', flat=True)
116+
self.deletion(ids_to_delete, queryf)
117+
logger.info(
118+
"Delete VisitedLinkNew viewed before {} Time: {}\n".format(
119+
cut_off_dt, timer.get_elapsed()))

myuw/management/commands/load_buildings.py

+12-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
import logging
5+
import traceback
56
from django.core.mail import send_mail
67
from django.core.management.base import BaseCommand
78
from uw_space import Facilities
@@ -333,15 +334,20 @@ def handle(self, *args, **options):
333334
builds_in_db = CampusBuilding.objects.all()
334335
for bdg in builds_in_db:
335336
try:
336-
fac = space.search_by_number(bdg.number)
337-
if not bdg.no_change(fac):
338-
updated_bdg = CampusBuilding.upd_building(fac)
339-
logger.info("Updated {}".format(updated_bdg))
340-
count += 1
337+
fac_objs = space.search_by_code(bdg.code)
338+
if fac_objs and len(fac_objs):
339+
updated_bdg = CampusBuilding.upd_building(fac_objs[0])
340+
if not bdg.no_change(updated_bdg):
341+
logger.info("Updated {}".format(updated_bdg))
342+
count += 1
341343
except Exception as ex:
342-
msg = {"Load building": bdg, "err": ex}
344+
msg = {"Update building": bdg,
345+
"err": traceback.format_exc(chain=False)}
343346
logger.error(msg)
344347
messages.append("\n{}".format(msg))
348+
logger.info(
349+
"Updated {}/{} buildings".format(
350+
count, len(builds_in_db)))
345351

346352
if len(messages):
347353
send_mail(

myuw/management/commands/update_past_instructors.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
from django.core.management.base import BaseCommand
55
from uw_sws.section import get_changed_sections_by_term, get_section_by_url
66
from uw_sws.term import get_current_term
7-
from myuw.dao.instructor import add_seen_instructor,\
8-
remove_seen_instructors_for_prior_terms
7+
from myuw.dao.instructor import (
8+
add_seen_instructor, remove_seen_instructors_for_prior_terms)
99
from myuw.dao.instructor_schedule import get_prior_instructed_terms
1010

1111

0 commit comments

Comments
 (0)