feat(people): Add discipline and themes to Person

See #1
This commit is contained in:
James Graham
2020-02-25 11:19:46 +00:00
parent d733b6db63
commit 39127cf972
5 changed files with 103 additions and 4 deletions

View File

@@ -21,6 +21,11 @@ class RoleAdmin(admin.ModelAdmin):
pass pass
@admin.register(models.Theme)
class ThemeAdmin(admin.ModelAdmin):
pass
@admin.register(models.Person) @admin.register(models.Person)
class PersonAdmin(admin.ModelAdmin): class PersonAdmin(admin.ModelAdmin):
pass pass

View File

@@ -3,7 +3,7 @@ Forms for creating / updating models belonging to the 'people' app.
""" """
from django import forms from django import forms
from django_select2.forms import Select2Widget from django_select2.forms import Select2Widget, Select2MultipleWidget
from . import models from . import models
@@ -21,6 +21,7 @@ class PersonForm(forms.ModelForm):
widgets = { widgets = {
'nationality': Select2Widget(), 'nationality': Select2Widget(),
'country_of_residence': Select2Widget(), 'country_of_residence': Select2Widget(),
'themes': Select2MultipleWidget(),
} }

View File

@@ -0,0 +1,39 @@
# Generated by Django 2.2.10 on 2020-02-25 11:12
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('people', '0013_person_role'),
]
operations = [
migrations.CreateModel(
name='Discipline',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('code', models.CharField(blank=True, max_length=15)),
],
),
migrations.CreateModel(
name='Theme',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
],
),
migrations.AddField(
model_name='person',
name='discipline',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='people', to='people.Discipline'),
),
migrations.AddField(
model_name='person',
name='themes',
field=models.ManyToManyField(blank=True, related_name='people', to='people.Theme'),
),
]

View File

@@ -39,6 +39,32 @@ 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):
"""
Project theme within which a :class:`Person` works.
"""
name = models.CharField(max_length=255,
blank=False, null=False)
def __str__(self) -> str:
return self.name
class Person(models.Model): class Person(models.Model):
""" """
A person may be a member of the BRECcIA core team or an external stakeholder. A person may be a member of the BRECcIA core team or an external stakeholder.
@@ -98,20 +124,34 @@ class Person(models.Model):
nationality = CountryField(blank=True, null=True) nationality = CountryField(blank=True, null=True)
country_of_residence = CountryField(blank=True, null=True) country_of_residence = CountryField(blank=True, null=True)
#: Organisation this person is employed by or affiliated with
organisation = models.ForeignKey(Organisation, organisation = models.ForeignKey(Organisation,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='members', related_name='members',
blank=True, null=True) blank=True, null=True)
#: Job title this person holds within their organisation
job_title = models.CharField(max_length=255, job_title = models.CharField(max_length=255,
blank=True, null=False) blank=True, null=False)
#: Discipline within which this person works
discipline = models.ForeignKey(Discipline,
on_delete=models.PROTECT,
related_name='people',
blank=True, null=True)
#: Role this person holds within the project
role = models.ForeignKey(Role, role = models.ForeignKey(Role,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='holders', related_name='holders',
blank=True, null=True) blank=True, null=True)
#: Project themes within this person works
themes = models.ManyToManyField(Theme,
related_name='people',
blank=True)
@property @property
def relationships(self): def relationships(self):
return self.relationships_as_source.all().union( return self.relationships_as_source.all().union(

View File

@@ -47,6 +47,20 @@
<dt>Role</dt> <dt>Role</dt>
<dd>{{ person.role }}</dd> <dd>{{ person.role }}</dd>
{% endif %} {% endif %}
{% if person.dispipline %}
<dt>Discipline</dt>
<dd>{{ person.discipline }}</dd>
{% endif %}
{% if person.themes.exists %}
<dt>Project Themes</dt>
<dd>
{% for theme in person.themes.all %}
{{ theme }}{% if not forloop.last %}, {% endif %}
{% endfor %}
</dd>
{% endif %}
</dl> </dl>
<a class="btn btn-success" <a class="btn btn-success"