diff --git a/people/admin.py b/people/admin.py index 26cb237..e72a70e 100644 --- a/people/admin.py +++ b/people/admin.py @@ -21,6 +21,11 @@ class RoleAdmin(admin.ModelAdmin): pass +@admin.register(models.Theme) +class ThemeAdmin(admin.ModelAdmin): + pass + + @admin.register(models.Person) class PersonAdmin(admin.ModelAdmin): pass diff --git a/people/forms.py b/people/forms.py index 661f764..c7399dd 100644 --- a/people/forms.py +++ b/people/forms.py @@ -3,7 +3,7 @@ Forms for creating / updating models belonging to the 'people' app. """ from django import forms -from django_select2.forms import Select2Widget +from django_select2.forms import Select2Widget, Select2MultipleWidget from . import models @@ -21,6 +21,7 @@ class PersonForm(forms.ModelForm): widgets = { 'nationality': Select2Widget(), 'country_of_residence': Select2Widget(), + 'themes': Select2MultipleWidget(), } diff --git a/people/migrations/0014_person_role_themes.py b/people/migrations/0014_person_role_themes.py new file mode 100644 index 0000000..112817d --- /dev/null +++ b/people/migrations/0014_person_role_themes.py @@ -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'), + ), + ] diff --git a/people/models.py b/people/models.py index b7dfe67..e2e55c5 100644 --- a/people/models.py +++ b/people/models.py @@ -39,6 +39,32 @@ class Role(models.Model): 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): """ 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) country_of_residence = CountryField(blank=True, null=True) - + + #: Organisation this person is employed by or affiliated with organisation = models.ForeignKey(Organisation, on_delete=models.PROTECT, related_name='members', blank=True, null=True) - + + #: Job title this person holds within their organisation job_title = models.CharField(max_length=255, 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, on_delete=models.PROTECT, related_name='holders', blank=True, null=True) + #: Project themes within this person works + themes = models.ManyToManyField(Theme, + related_name='people', + blank=True) + @property def relationships(self): return self.relationships_as_source.all().union( diff --git a/people/templates/people/person/detail.html b/people/templates/people/person/detail.html index a962846..6886a30 100644 --- a/people/templates/people/person/detail.html +++ b/people/templates/people/person/detail.html @@ -47,6 +47,20 @@
Role
{{ person.role }}
{% endif %} + + {% if person.dispipline %} +
Discipline
+
{{ person.discipline }}
+ {% endif %} + + {% if person.themes.exists %} +
Project Themes
+
+ {% for theme in person.themes.all %} + {{ theme }}{% if not forloop.last %}, {% endif %} + {% endfor %} +
+ {% endif %}