refactor: Make Person.discipline free text

See #33
This commit is contained in:
James Graham
2020-06-24 16:29:50 +01:00
parent 57349a6007
commit b84076ec3b
4 changed files with 67 additions and 24 deletions

View File

@@ -25,7 +25,7 @@ class PersonForm(forms.ModelForm):
'organisation', 'organisation',
'organisation_started_date', 'organisation_started_date',
'job_title', 'job_title',
'discipline', 'disciplines',
'role', 'role',
'themes', 'themes',
] ]

View File

@@ -0,0 +1,61 @@
# Generated by Django 2.2.10 on 2020-06-24 14:19
from django.db import migrations, models
def migrate_forward(apps, schema_editor):
Person = apps.get_model('people', 'Person')
for person in Person.objects.all():
try:
person.disciplines = person.discipline.name
person.save()
except AttributeError:
pass
def migrate_backward(apps, schema_editor):
Person = apps.get_model('people', 'Person')
Discipline = apps.get_model('people', 'Discipline')
for person in Person.objects.all():
try:
discipline_str = person.disciplines.split(',')[0]
except AttributeError:
pass
else:
# Returns None if not found - doesn't raise exception
discipline = Discipline.objects.filter(name=discipline_str).first()
if not discipline:
discipline = Discipline.objects.create(
name=discipline_str,
code=discipline_str
if len(discipline_str) < 15 else discipline_str[:15])
person.discipline = discipline
person.save()
class Migration(migrations.Migration):
dependencies = [
('people', '0020_person_organisation_started_date'),
]
operations = [
migrations.AddField(
model_name='person',
name='disciplines',
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.RunPython(migrate_forward, migrate_backward),
migrations.RemoveField(
model_name='person',
name='discipline',
),
migrations.DeleteModel(name='Discipline', ),
]

View File

@@ -19,7 +19,6 @@ __all__ = [
'User', 'User',
'Organisation', 'Organisation',
'Role', 'Role',
'Discipline',
'Theme', 'Theme',
'Person', 'Person',
] ]
@@ -82,19 +81,6 @@ class Role(models.Model):
return self.name return self.name
class Discipline(models.Model):
"""
Discipline within which a :class:`Person` works.
"""
name = models.CharField(max_length=255, blank=False, null=False)
#: Short code using system such as JACS 3
code = models.CharField(max_length=15, blank=True, null=False)
def __str__(self) -> str:
return self.name
class Theme(models.Model): class Theme(models.Model):
""" """
Project theme within which a :class:`Person` works. Project theme within which a :class:`Person` works.
@@ -179,12 +165,8 @@ class Person(models.Model):
#: Job title this person holds within their organisation #: Job title this person holds within their organisation
job_title = models.CharField(max_length=255, blank=True, null=False) job_title = models.CharField(max_length=255, blank=True, null=False)
#: Discipline within which this person works #: Discipline(s) within which this person works
discipline = models.ForeignKey(Discipline, disciplines = models.CharField(max_length=255, blank=True, null=True)
on_delete=models.PROTECT,
related_name='people',
blank=True,
null=True)
#: Role this person holds within the project #: Role this person holds within the project
role = models.ForeignKey(Role, role = models.ForeignKey(Role,

View File

@@ -55,9 +55,9 @@
<dd>{{ person.role }}</dd> <dd>{{ person.role }}</dd>
{% endif %} {% endif %}
{% if person.dispipline %} {% if person.disciplines %}
<dt>Discipline</dt> <dt>Discipline(s)</dt>
<dd>{{ person.discipline }}</dd> <dd>{{ person.disciplines }}</dd>
{% endif %} {% endif %}
{% if person.themes.exists %} {% if person.themes.exists %}