Skip to content

Commit 82025f9

Browse files
committed
Continuing to checkpoint.
- Legacy-Id: 15986
1 parent e91d706 commit 82025f9

5 files changed

Lines changed: 337 additions & 0 deletions

File tree

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.18 on 2019-01-11 11:22
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
import django.db.models.deletion
7+
import ietf.utils.models
8+
9+
10+
class Migration(migrations.Migration):
11+
12+
dependencies = [
13+
('review', '0009_refactor_review_request'),
14+
('name', '0006_adjust_statenames'),
15+
('doc', '0010_auto_20190225_1302'),
16+
]
17+
18+
operations = [
19+
migrations.CreateModel(
20+
name='ReviewAssignmentDocEvent',
21+
fields=[
22+
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
23+
('review_assignment', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='review.ReviewAssignment')),
24+
('state', ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='name.ReviewAssignmentStateName')),
25+
],
26+
bases=('doc.docevent',),
27+
),
28+
]
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.18 on 2019-01-04 13:59
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('name', '0004_add_prefix_to_doctypenames'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='ReviewAssignmentStateName',
17+
fields=[
18+
('slug', models.CharField(max_length=32, primary_key=True, serialize=False)),
19+
('name', models.CharField(max_length=255)),
20+
('desc', models.TextField(blank=True)),
21+
('used', models.BooleanField(default=True)),
22+
('order', models.IntegerField(default=0)),
23+
],
24+
options={
25+
'ordering': ['order', 'name'],
26+
'abstract': False,
27+
},
28+
),
29+
]
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.18 on 2019-01-04 14:02
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
7+
def forward(apps, schema_editor):
8+
ReviewRequestStateName = apps.get_model('name','ReviewRequestStateName')
9+
ReviewAssignmentStateName = apps.get_model('name','ReviewAssignmentStateName')
10+
11+
# TODO: Remove these newly unused states in a future release
12+
ReviewRequestStateName.objects.filter(slug__in=['accepted', 'rejected', 'no-response', 'part-completed', 'completed', 'unknown']).update(used=False)
13+
ReviewRequestStateName.objects.create(slug = 'assigned', name = 'Assigned', desc = 'The ReviewRequest has been assigned to at least one reviewer' , used = True, order = 0)
14+
15+
assignment_states = [
16+
{ 'slug': 'assigned',
17+
'name': 'Assigned',
18+
'desc': 'The review has been assigned to this reviewer',
19+
'used': True,
20+
'order': 0
21+
},
22+
{ 'slug':'accepted',
23+
'name':'Accepted',
24+
'desc':'The reviewer has accepted the assignment',
25+
'used': True,
26+
'order':0
27+
},
28+
{ 'slug':'rejected',
29+
'name':'Rejected',
30+
'desc':'The reviewer has rejected the assignment',
31+
'used': True,
32+
'order':0
33+
},
34+
{ 'slug':'withdrawn',
35+
'name':'Withdrawn by Team',
36+
'desc':'The team secretary has withdrawn the assignment',
37+
'used': True,
38+
'order':0
39+
},
40+
{ 'slug':'overtaken',
41+
'name':'Overtaken By Events',
42+
'desc':'The review was abandoned because of circumstances',
43+
'used': True,
44+
'order':0
45+
},
46+
{ 'slug':'no-response',
47+
'name':'No Response',
48+
'desc':'The reviewer did not provide a review by the deadline',
49+
'used': True,
50+
'order':0
51+
},
52+
{ 'slug':'part-completed',
53+
'name':'Partially Completed',
54+
'desc':'The reviewer partially completed the assignment',
55+
'used': True,
56+
'order':0
57+
},
58+
{ 'slug':'completed',
59+
'name':'Completed',
60+
'desc':'The reviewer completed the assignment',
61+
'used': True,
62+
'order':0
63+
},
64+
{ 'slug':'unknown',
65+
'name':'Unknown',
66+
'desc':'The assignment is was imported from an earlier database and its state could not be computed',
67+
'used':'True',
68+
'order':0
69+
}
70+
]
71+
72+
for entry in assignment_states:
73+
ReviewAssignmentStateName.objects.create(**entry)
74+
75+
76+
def reverse(apps, schema_editor):
77+
ReviewRequestStateName = apps.get_model('name','ReviewRequestStateName')
78+
ReviewAssignmentStateName = apps.get_model('name','ReviewAssignmentStateName')
79+
ReviewRequestStateName.objects.filter(slug__in=['accepted', 'rejected', 'no-response', 'part-completed', 'completed', 'unknown']).update(used=True)
80+
ReviewRequestStateName.objects.filter(slug='assigned').update(used=False)
81+
ReviewAssignmentStateName.objects.update(used=False)
82+
83+
84+
class Migration(migrations.Migration):
85+
86+
dependencies = [
87+
('name', '0005_reviewassignmentstatename'),
88+
]
89+
90+
operations = [
91+
migrations.RunPython(forward, reverse)
92+
]
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.18 on 2019-01-04 14:27
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
import django.db.models.deletion
7+
import ietf.utils.models
8+
9+
10+
class Migration(migrations.Migration):
11+
12+
dependencies = [
13+
('doc', '0009_move_non_url_externalurls_to_uploaded_filename'),
14+
('name', '0006_adjust_statenames'),
15+
('person', '0008_auto_20181014_1448'),
16+
('review', '0008_remove_reviewrequest_old_id'),
17+
]
18+
19+
operations = [
20+
migrations.CreateModel(
21+
name='ReviewAssignment',
22+
fields=[
23+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
24+
('assigned_on', models.DateTimeField(blank=True, null=True)),
25+
('completed_on', models.DateTimeField(blank=True, null=True)),
26+
('reviewed_rev', models.CharField(blank=True, max_length=16, verbose_name=b'reviewed revision')),
27+
('mailarch_url', models.URLField(blank=True, null=True)),
28+
('result', ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='name.ReviewResultName')),
29+
('review', ietf.utils.models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
30+
],
31+
),
32+
migrations.RenameField(
33+
model_name='reviewrequest',
34+
old_name='result',
35+
new_name='unused_result',
36+
),
37+
migrations.RenameField(
38+
model_name='reviewrequest',
39+
old_name='review',
40+
new_name='unused_review',
41+
),
42+
migrations.RenameField(
43+
model_name='reviewrequest',
44+
old_name='reviewed_rev',
45+
new_name='unused_reviewed_rev',
46+
),
47+
migrations.RenameField(
48+
model_name='reviewrequest',
49+
old_name='reviewer',
50+
new_name='unused_reviewer',
51+
),
52+
migrations.AddField(
53+
model_name='reviewassignment',
54+
name='review_request',
55+
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='review.ReviewRequest'),
56+
),
57+
migrations.AddField(
58+
model_name='reviewassignment',
59+
name='reviewer',
60+
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Email'),
61+
),
62+
migrations.AddField(
63+
model_name='reviewassignment',
64+
name='state',
65+
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.ReviewAssignmentStateName'),
66+
),
67+
]
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.18 on 2019-01-04 14:34
3+
from __future__ import unicode_literals
4+
5+
from tqdm import tqdm
6+
7+
from django.db import migrations
8+
9+
def assigned_time(model, request):
10+
e = model.objects.filter(doc=request.doc, type="assigned_review_request", review_request=request).order_by('-time', '-id').first()
11+
return e.time if e and e.time else None
12+
13+
def done_time(model, request):
14+
if request.unused_review and request.unused_review.time:
15+
return request.unused_review.time
16+
e = model.objects.filter(doc=request.doc, type="closed_review_request", review_request=request).order_by('-time', '-id').first()
17+
time = e.time if e and e.time else None
18+
return time if time else request.time
19+
20+
def map_request_state_to_assignment_state(req_state_id):
21+
if req_state_id == 'requested':
22+
return 'assigned'
23+
elif req_state_id in ('no-review-document', 'no-review-version'):
24+
return 'withdrawn'
25+
else:
26+
return req_state_id
27+
28+
def forward(apps, schema_editor):
29+
ReviewRequest = apps.get_model('review', 'ReviewRequest')
30+
ReviewAssignment = apps.get_model('review', 'ReviewAssignment')
31+
Document = apps.get_model('doc', 'Document')
32+
ReviewRequestDocEvent = apps.get_model('doc','ReviewRequestDocEvent')
33+
ReviewAssignmentDocEvent = apps.get_model('doc','ReviewAssignmentDocEvent')
34+
35+
print('') # introduce a newline before tqdm starts writing
36+
37+
for request in tqdm(ReviewRequest.objects.exclude(unused_reviewer__isnull=True)):
38+
assignment_state = map_request_state_to_assignment_state(request.state_id)
39+
if not (assignment_state in (u'assigned', u'accepted', u'completed', u'no-response', u'overtaken', u'part-completed', u'rejected', u'withdrawn', u'unknown')):
40+
print ("Trouble with review_request",request.pk,"with state",request.state_id)
41+
exit(-1)
42+
ReviewAssignment.objects.create(
43+
review_request = request,
44+
state_id = assignment_state,
45+
reviewer = request.unused_reviewer,
46+
assigned_on = assigned_time(ReviewRequestDocEvent, request),
47+
completed_on = done_time(ReviewRequestDocEvent, request),
48+
review = request.unused_review,
49+
reviewed_rev = request.unused_reviewed_rev,
50+
result = request.unused_result,
51+
mailarch_url = request.unused_review and request.unused_review.external_url,
52+
)
53+
Document.objects.filter(type_id='review').update(external_url='')
54+
ReviewRequest.objects.filter(state_id__in=('accepted', 'rejected', 'no-response', 'part-completed', 'completed', 'unknown')).update(state_id='assigned')
55+
ReviewRequest.objects.filter(state_id='requested',unused_reviewer__isnull=False).update(state_id='assigned')
56+
57+
for req_event in tqdm(ReviewRequestDocEvent.objects.filter(type="assigned_review_request",review_request__unused_reviewer__isnull=False)):
58+
ReviewAssignmentDocEvent.objects.create(
59+
time = req_event.time,
60+
type = req_event.type,
61+
by = req_event.by,
62+
doc = req_event.doc,
63+
rev = req_event.rev,
64+
desc = req_event.desc,
65+
review_assignment = req_event.review_request.reviewassignment_set.first(),
66+
state_id = 'assigned'
67+
)
68+
69+
for req_event in tqdm(ReviewRequestDocEvent.objects.filter(type="closed_review_request",
70+
state_id__in=('completed', 'no-response', 'part-completed', 'rejected', 'unknown', 'withdrawn'),
71+
review_request__unused_reviewer__isnull=False)):
72+
ReviewAssignmentDocEvent.objects.create(
73+
time = req_event.time,
74+
type = req_event.type,
75+
by = req_event.by,
76+
doc = req_event.doc,
77+
rev = req_event.rev,
78+
desc = req_event.desc,
79+
review_assignment = req_event.review_request.reviewassignment_set.first(),
80+
state_id = req_event.state_id
81+
)
82+
83+
ReviewRequestDocEvent.objects.filter(type="closed_review_request",
84+
state_id__in=('completed', 'no-response', 'part-completed', 'rejected', 'unknown', 'withdrawn'),
85+
review_request__unused_reviewer__isnull=False).delete()
86+
87+
88+
def reverse(apps, schema_editor):
89+
ReviewAssignment = apps.get_model('review', 'ReviewAssignment')
90+
ReviewRequestDocEvent = apps.get_model('doc','ReviewRequestDocEvent')
91+
ReviewAssignmentDocEvent = apps.get_model('doc','ReviewAssignmentDocEvent')
92+
93+
for assignment in tqdm(ReviewAssignment.objects.all()):
94+
assignment.review_request.unused_review.external_url = assignment.mailarch_url
95+
assignment.review_request.unused_review.save()
96+
assignment.review_request.state_id = assignment.state_id
97+
assignment.review_request.save()
98+
99+
for asgn_event in tqdm(ReviewAssignmentDocEvent.objects.filter(state_id__in=('completed', 'no-response', 'part-completed', 'rejected', 'unknown', 'withdrawn'))):
100+
ReviewRequestDocEvent.objects.create(
101+
time = asgn_event.time,
102+
type = asgn_event.type,
103+
by = asgn_event.by,
104+
doc = asgn_event.doc,
105+
rev = asgn_event.rev,
106+
desc = asgn_event.desc,
107+
review_request = asgn_event.review_request,
108+
state_id = asgn_event.state_id
109+
)
110+
ReviewAssignmentDocEvent.objects.all().delete()
111+
112+
class Migration(migrations.Migration):
113+
114+
dependencies = [
115+
('review', '0009_refactor_review_request'),
116+
('doc','0011_reviewassignmentdocevent')
117+
]
118+
119+
operations = [
120+
migrations.RunPython(forward, reverse)
121+
]

0 commit comments

Comments
 (0)