diff --git a/breccia_mapper/templates/base.html b/breccia_mapper/templates/base.html
index ecd2984..ef0dc14 100644
--- a/breccia_mapper/templates/base.html
+++ b/breccia_mapper/templates/base.html
@@ -60,6 +60,10 @@
+ -
+ People
+
+
{% if request.user.is_superuser %}
-
Admin
@@ -71,19 +75,20 @@
{% if request.user.is_authenticated %}
-
{% if request.user.person %}
-
+
{{ request.user }}
{% else %}
-
+
{{ request.user }}
-
+
{% endif %}
+
-
diff --git a/people/forms.py b/people/forms.py
new file mode 100644
index 0000000..0d49422
--- /dev/null
+++ b/people/forms.py
@@ -0,0 +1,19 @@
+"""
+Forms for creating / updating models belonging to the 'people' app.
+"""
+
+from django import forms
+
+from . import models
+
+
+class PersonForm(forms.ModelForm):
+ """
+ Form for creating / updating an instance of :class:`Person`.
+ """
+ class Meta:
+ model = models.Person
+ fields = [
+ 'name',
+ 'core_member',
+ ]
diff --git a/people/migrations/0004_person_user.py b/people/migrations/0004_person_user.py
new file mode 100644
index 0000000..278bf14
--- /dev/null
+++ b/people/migrations/0004_person_user.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.2.10 on 2020-02-18 15:44
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('people', '0003_fix_people_plural'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='person',
+ name='user',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='person', to=settings.AUTH_USER_MODEL),
+ ),
+ ]
diff --git a/people/migrations/0005_user_one_person.py b/people/migrations/0005_user_one_person.py
new file mode 100644
index 0000000..4732fb6
--- /dev/null
+++ b/people/migrations/0005_user_one_person.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.2.10 on 2020-02-19 08:09
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('people', '0004_person_user'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='person',
+ name='user',
+ field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='person', to=settings.AUTH_USER_MODEL),
+ ),
+ ]
diff --git a/people/models.py b/people/models.py
index a14b68c..c49e44c 100644
--- a/people/models.py
+++ b/people/models.py
@@ -1,5 +1,7 @@
+from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.db import models
+from django.urls import reverse
class User(AbstractUser):
@@ -12,9 +14,14 @@ class Person(models.Model):
"""
A person may be a member of the BRECcIA core team or an external stakeholder.
"""
-
class Meta:
verbose_name_plural = 'people'
+
+ #: User account belonging to this person
+ user = models.OneToOneField(settings.AUTH_USER_MODEL,
+ related_name='person',
+ on_delete=models.CASCADE,
+ blank=True, null=True)
#: Name of the person
name = models.CharField(max_length=255,
@@ -35,6 +42,9 @@ class Person(models.Model):
return self.relationships_as_source.all().union(
self.relationships_as_target.all()
)
+
+ def get_absolute_url(self):
+ return reverse('people:person.detail', kwargs={'pk': self.pk})
def __str__(self) -> str:
return self.name
diff --git a/people/templates/people/person/create.html b/people/templates/people/person/create.html
new file mode 100644
index 0000000..9c041dd
--- /dev/null
+++ b/people/templates/people/person/create.html
@@ -0,0 +1,27 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+
+
+
+
+{% endblock %}
diff --git a/people/urls.py b/people/urls.py
index ce9dcc9..f4ab036 100644
--- a/people/urls.py
+++ b/people/urls.py
@@ -10,6 +10,10 @@ urlpatterns = [
views.ProfileView.as_view(),
name='person.profile'),
+ path('people/create',
+ views.PersonCreateView.as_view(),
+ name='person.create'),
+
path('people',
views.PersonListView.as_view(),
name='person.list'),
diff --git a/people/views.py b/people/views.py
index 4524edf..9644b78 100644
--- a/people/views.py
+++ b/people/views.py
@@ -2,9 +2,26 @@
Views for displaying or manipulating models in the 'people' app.
"""
-from django.views.generic import DetailView, ListView
+from django.views.generic import CreateView, DetailView, ListView
-from . import models
+from . import forms, models
+
+
+class PersonCreateView(CreateView):
+ """
+ View to create a new instance of :class:`Person`.
+
+ If 'user' is passed as a URL parameter - link the new person to the current user.
+ """
+ model = models.Person
+ template_name = 'people/person/create.html'
+ form_class = forms.PersonForm
+
+ def form_valid(self, form):
+ if 'user' in self.request.GET:
+ form.instance.user = self.request.user
+
+ return super().form_valid(form)
class PersonListView(ListView):
@@ -22,6 +39,18 @@ class ProfileView(DetailView):
model = models.Person
template_name = 'people/person/detail.html'
+ def get_object(self, queryset=None) -> models.Person:
+ """
+ Get the :class:`Person` object to be represented by this page.
+
+ If not determined from url get current user.
+ """
+ try:
+ return super().get_object(queryset)
+
+ except AttributeError:
+ return self.request.user.person
+
class RelationshipDetailView(DetailView):
"""