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

@@ -80,7 +80,6 @@ class PersonAnswerSetForm(forms.ModelForm, DynamicAnswerSetBase):
'organisation',
'organisation_started_date',
'job_title',
'disciplines',
'themes',
'latitude',
'longitude',

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)

View File

@@ -190,9 +190,6 @@ class PersonAnswerSet(AnswerSet):
#: Job title this person holds within their organisation
job_title = models.CharField(max_length=255, blank=True, null=False)
#: Discipline(s) within which this person works
disciplines = models.CharField(max_length=255, blank=True, null=True)
#: Project themes within this person works
themes = models.ManyToManyField(Theme, related_name='people', blank=True)

View File

@@ -27,10 +27,6 @@
<tr><td>Job Title</td><td>{{ answer_set.job_title }}</td></tr>
{% endif %}
{% if answer_set.disciplines %}
<tr><td>Discipline(s)</td><td>{{ answer_set.disciplines }}</td></tr>
{% endif %}
{% if answer_set.themes.exists %}
<tr>
<td>Project Themes</td>