mirror of
https://github.com/Southampton-RSG/breccia-mapper.git
synced 2026-03-03 11:27:09 +00:00
63
people/migrations/0034_remove_personanswerset_disciplines.py
Normal file
63
people/migrations/0034_remove_personanswerset_disciplines.py
Normal 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',
|
||||
),
|
||||
]
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user