Skip to content

Commit af580e0

Browse files
committed
Fix some migration issues caused by userbit and datatree removal
1 parent 9d83a7a commit af580e0

File tree

6 files changed

+13
-181
lines changed

6 files changed

+13
-181
lines changed

esp/esp/datatree/migrations/0006_kill_datatree.py

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77

88
class Migration(SchemaMigration):
99

10+
depends_on = (
11+
("program", "0046_delete_anchors"),
12+
)
13+
1014
def forwards(self, orm):
1115
# Removing unique constraint on 'DataTree', fields ['name', 'parent']
1216
try:

esp/esp/program/migrations/0033_teachers_datamigration.py

+1-26
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,7 @@
99
class Migration(DataMigration):
1010

1111
def forwards(self, orm):
12-
# Use only currently valid UserBits
13-
bits=orm['users.UserBit'].valid_objects().filter(verb__uri="V/Flags/Registration/Teacher")
14-
# Keep track of pairs copied so far so we don't duplicate
15-
pairs_so_far = set()
16-
i=0
17-
for bit in bits:
18-
cls=ClassSubject.objects.filter(anchor=bit.qsc)
19-
l=cls.count()
20-
if l==0:
21-
continue
22-
if l>1:
23-
continue
24-
usr=bit.user
25-
cls=cls[0]
26-
27-
# Skip (user, class) pairs that we already stored
28-
if (cls.id, usr.id) in pairs_so_far:
29-
continue
30-
pairs_so_far.add((cls.id, usr.id))
31-
32-
#due to a issue with cache stuff, we'll manually insert the data
33-
from django.db import connection, transaction
34-
cursor = connection.cursor()
35-
36-
cursor.execute("INSERT INTO program_class_teachers (classsubject_id, espuser_id) VALUES (%s, %s);",[cls.id, usr.id])
37-
transaction.commit_unless_managed()
12+
pass
3813

3914
def backwards(self, orm):
4015
for cls in ClassSubject.objects.all():

esp/esp/program/migrations/0037_allow_null_anchors.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77

88
class Migration(SchemaMigration):
99

10+
depends_on = (
11+
("datatree", "0004_change_fns_yet_again"),
12+
)
13+
1014
def forwards(self, orm):
1115

1216
# Changing field 'ClassSection.anchor'
@@ -462,4 +466,4 @@ def backwards(self, orm):
462466
}
463467
}
464468

465-
complete_apps = ['program']
469+
complete_apps = ['program']

esp/esp/users/migrations/0018_record_datamigration.py

+1-36
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,7 @@
1010
class Migration(DataMigration):
1111

1212
def forwards(self, orm):
13-
#probably not the fastest way to do this migration, but it works
14-
15-
# Find a list of program anchors - these are the only valid places for orm['users.UserBit']s to
16-
# be attached if we want to convert them to orm['users.Record']s
17-
program_anchors = orm["program.Program"].objects.all().values_list('anchor__id', flat=True)
18-
program_map = {}
19-
for id in program_anchors:
20-
program_map[id] = orm["program.Program"].objects.get(anchor__id=id)
21-
22-
verbs = {"V/Flags/Survey/Filed":"student_survey",
23-
"V/Flags/TeacherSurvey/Filed":"teacher_survey",
24-
"V/Flags/Registration/Attended":"attended",
25-
"V/Flags/Registration/QuizDone":"teacher_quiz_done",
26-
"V/Flags/Registration/Paid":"paid",
27-
"V/Flags/Registration/MedicalFiled":"med",
28-
"V/Flags/Registration/LiabilityFiled":"liab",
29-
"V/Flags/Registration/Teacher/Acknowledgement":"teacheracknowledgement",
30-
"V/Flags/Registration/LunchSelected":"lunch_selected",
31-
"V/Flags/Registration/Confirmed":"reg_confirmed",#this one is out-of-date but there might be some leftover
32-
}
33-
for verb, event in verbs.items():
34-
bits = orm['users.UserBit'].objects.filter(verb__uri=verb, qsc__in=program_anchors).filter(enddate__gte=datetime.datetime.now())
35-
for bit in bits:
36-
orm['users.Record'].objects.create(user=bit.user, event=event,
37-
program=program_map[bit.qsc.id],
38-
time=bit.startdate)
39-
40-
#Reg confirmed
41-
for bit in orm['users.UserBit'].objects.filter(verb__uri="V/Flags/Public",qsc__name="Confirmation", qsc__parent__in=program_anchors).filter(enddate__gte=datetime.datetime.now()).select_related('qsc__parent'):
42-
orm['users.Record'].objects.create(user=bit.user,event="reg_confirmed",
43-
program=program_map[bit.qsc.parent.id], time=bit.startdate)
44-
45-
#Waitlisted
46-
for bit in orm['users.UserBit'].objects.filter(verb__uri="V/Flags/Public",qsc__name="Waitlist", qsc__parent__in=program_anchors).filter(enddate__gte=datetime.datetime.now()).select_related('qsc__parent'):
47-
orm['users.Record'].objects.create(user=bit.user,event="waitlist",
48-
program=program_map[bit.qsc.parent.id], time=bit.startdate)
13+
pass
4914

5015
def backwards(self, orm):
5116
orm['users.Record'].objects.all().delete()

esp/esp/users/migrations/0019_userrole.py

+1-25
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,7 @@
1010
class Migration(DataMigration):
1111

1212
def forwards(self, orm):
13-
# First, create a Group for every verb name
14-
role_verbs = orm['datatree.DataTree'].objects.filter(parent__uri="V/Flags/UserRole")
15-
role_names = list(role_verbs.values_list('name', flat=True).distinct())
16-
install_groups(role_names)
17-
18-
# Cache the groups so we don't have to keep fetching them from the DB.
19-
groups = dict([(g.name, g) for g in Group.objects.all()])
20-
21-
# Now, for all user roles applied to users, add those users to the appropriate Group
22-
# Do this in batched inserts: for each role, filter for all users with
23-
# that role, and add them all at once to the Group.
24-
role_bits = orm.UserBit.objects.filter(verb__parent__uri="V/Flags/UserRole", qsc__uri="Q").exclude(user=None).filter(enddate__gte=datetime.datetime.now())
25-
for role_name in role_names:
26-
user_ids = list(role_bits.filter(verb__name=role_name).values_list('user', flat=True).distinct())
27-
groups[role_name].user_set.add(*user_ids)
28-
29-
# Adds Administrators who might not have had the UserRole.
30-
# The enddate filter is to prevent the migration from adding
31-
# Administrators with an Administer privilege that is set to expire,
32-
# since membership in the Administrator group has no expiration.
33-
# Instead, an Administer privilege should be given in a later migration.
34-
admin_role = groups["Administrator"]
35-
admin_bits = orm.UserBit.objects.filter(verb__uri="V/Administer", qsc__uri="Q", user__isnull=False, enddate__gte=datetime.datetime(3000,1,1))
36-
admin_ids = list(admin_bits.values_list('user', flat=True).distinct())
37-
admin_role.user_set.add(*admin_ids)
13+
pass
3814

3915
def backwards(self, orm):
4016
"Write your backwards methods here."

esp/esp/users/migrations/0021_permission_datamigration.py

+1-93
Original file line numberDiff line numberDiff line change
@@ -10,99 +10,7 @@
1010
class Migration(DataMigration):
1111

1212
def forwards(self, orm):
13-
def end(bit):
14-
date = bit.enddate
15-
if date > datetime.datetime(3000,1,1):
16-
return None
17-
return date
18-
19-
#Administer
20-
adm_bits=orm['users.UserBit'].objects.filter(verb__uri="V/Administer",qsc__uri__startswith="Q/Programs")
21-
for bit in adm_bits:
22-
try:
23-
p=orm['program.Program'].objects.get(anchor=bit.qsc)
24-
except orm['program.Program'].DoesNotExist:
25-
continue
26-
orm['users.Permission'](permission_type="Administer", program=p, user=bit.user, startdate=bit.startdate, enddate=end(bit)).save()
27-
28-
# Administer all programs, but with an enddate.
29-
# Adds users that we didn't add to the Administrator group in 0019_userrole.
30-
for bit in orm['users.UserBit'].objects.filter(verb__uri="V/Administer", qsc__uri="Q", user__isnull=False, enddate__lt=datetime.datetime(3000,1,1)):
31-
orm['users.Permission'](permission_type="Administer", program=None, user=bit.user, startdate=bit.startdate, enddate=end(bit)).save()
32-
33-
#view programs
34-
program_anchors=orm['program.Program'].objects.all().values_list("anchor",flat=True)
35-
view_program_bits=orm['users.UserBit'].objects.filter(verb__uri="V/Flags/Public", qsc__id__in=program_anchors)
36-
for bit in view_program_bits:
37-
try:
38-
p=orm['program.Program'].objects.get(anchor=bit.qsc)
39-
except orm['program.Program'].DoesNotExist:
40-
continue
41-
if bit.user is not None:
42-
orm['users.Permission'](permission_type=bit.verb.uri[24:],
43-
user=bit.user,
44-
program=p,
45-
startdate=bit.startdate,
46-
enddate=end(bit)).save()
47-
else:
48-
for x in ESPUser.getTypes():
49-
orm['users.Permission'](permission_type=bit.verb.uri[24:],
50-
role=orm['auth.Group'].objects.get(name=x),
51-
program=p,
52-
startdate=bit.startdate,
53-
enddate=end(bit)).save()
54-
55-
#gradeoverride
56-
go_bits=orm['users.UserBit'].objects.filter(verb__uri="V/Flags/Registration/GradeOverride",qsc__uri__startswith="Q/Programs")
57-
for bit in go_bits:
58-
try:
59-
p=orm['program.Program'].objects.get(anchor=bit.qsc)
60-
except orm['program.Program'].DoesNotExist:
61-
continue
62-
orm['users.Permission'](permission_type="GradeOverride", program=p,user=bit.user, startdate=bit.startdate, enddate=end(bit)).save()
63-
64-
#onsite
65-
onsite_bits=orm['users.UserBit'].objects.filter(verb__uri="V/Registration/Onsite")
66-
for bit in onsite_bits:
67-
try:
68-
p=orm['program.Program'].objects.get(anchor=bit.qsc)
69-
except orm['program.Program'].DoesNotExist:
70-
continue
71-
orm['users.Permission'](permission_type="Onsite",
72-
user=bit.user,
73-
program=p,
74-
startdate=bit.startdate,
75-
enddate=end(bit)).save()
76-
77-
#deadlines
78-
deadline_bits = orm['users.UserBit'].objects.filter(verb__uri__startswith="V/Deadline/Registration")
79-
for bit in deadline_bits:
80-
try:
81-
p=orm['program.Program'].objects.get(anchor=bit.qsc)
82-
except orm['program.Program'].DoesNotExist:
83-
continue
84-
85-
name = bit.verb.uri[24:]
86-
if bit.recursive and bit.verb.name in ["Classes", "Teacher", "Student"]:
87-
name += "/All"
88-
if bit.user is not None:
89-
orm['users.Permission'](permission_type=name,
90-
user=bit.user,
91-
program=p,
92-
startdate=bit.startdate,
93-
enddate=end(bit)).save()
94-
elif bit.verb.uri[24:31]=="Teacher":
95-
orm['users.Permission'](permission_type=name,
96-
role=orm['auth.Group'].objects.get(name="Teacher"),
97-
program=p,
98-
startdate=bit.startdate,
99-
enddate=end(bit)).save()
100-
elif bit.verb.uri[24:31]=="Student":
101-
orm['users.Permission'](permission_type=name,
102-
role=orm['auth.Group'].objects.get(name="Student"),
103-
program=p,
104-
startdate=bit.startdate,
105-
enddate=end(bit)).save()
13+
pass
10614

10715
def backwards(self, orm):
10816
orm['users.Permission'].objects.all().delete()

0 commit comments

Comments
 (0)