refactor: move disciplines to admin-question

Resolves #59
This commit is contained in:
James Graham
2021-02-15 15:29:47 +00:00
parent 0b1f303d62
commit 7021f05b67
6 changed files with 67 additions and 14 deletions

View File

@@ -0,0 +1,63 @@
# Generated by Django 2.2.10 on 2021-02-15 13:54
import re
from django.db import migrations
from .utils.question_sets import port_question
def migrate_forward(apps, schema_editor):
"""Replace discipline text field with admin-editable question."""
PersonAnswerSet = apps.get_model('people', 'PersonAnswerSet')
discipline_question = port_question(apps,
'Disciplines', [],
is_multiple_choice=True,
allow_free_text=True)
for answerset in PersonAnswerSet.objects.all():
try:
disciplines = [
d.strip() for d in re.split(r'[,;]+', answerset.disciplines)
]
except TypeError:
continue
for discipline in disciplines:
answer, _ = discipline_question.answers.get_or_create(
text=discipline)
answerset.question_answers.add(answer)
def migrate_backward(apps, schema_editor):
"""Replace discipline admin-editable question with text field."""
PersonAnswerSet = apps.get_model('people', 'PersonAnswerSet')
PersonQuestion = apps.get_model('people', 'PersonQuestion')
discipline_question = PersonQuestion.objects.filter(
text='Disciplines').latest('version')
for answerset in PersonAnswerSet.objects.all():
answerset.disciplines = ', '.join(
answerset.question_answers.filter(
question=discipline_question).values_list('text', flat=True))
answerset.save()
PersonQuestion.objects.filter(text='Disciplines').delete()
class Migration(migrations.Migration):
dependencies = [
('people', '0033_person_sort_by_name'),
]
operations = [
migrations.RunPython(migrate_forward, migrate_backward),
migrations.RemoveField(
model_name='personanswerset',
name='disciplines',
),
]

View File

@@ -1,21 +1,20 @@
import typing
from django.core.exceptions import ObjectDoesNotExist
def port_question(apps, question_text: str,
answers_text: typing.Iterable[str]):
def port_question(apps, question_text: str, answers_text: typing.Iterable[str],
**kwargs):
PersonQuestion = apps.get_model('people', 'PersonQuestion')
try:
prev_question = PersonQuestion.objects.filter(
text=question_text).latest('version')
question = PersonQuestion.objects.create(
text=question_text, version=prev_question.version + 1)
text=question_text, version=prev_question.version + 1, **kwargs)
except ObjectDoesNotExist:
question = PersonQuestion.objects.create(text=question_text)
question = PersonQuestion.objects.create(text=question_text, **kwargs)
for answer_text in answers_text:
question.answers.get_or_create(text=answer_text)