Relationships As Source
@@ -207,3 +158,6 @@
{% endblock %}
+
+{% block extra_script %}
+{% endblock %}
diff --git a/people/templates/people/person/includes/answer_set.html b/people/templates/people/person/includes/answer_set.html
new file mode 100644
index 0000000..8bcb346
--- /dev/null
+++ b/people/templates/people/person/includes/answer_set.html
@@ -0,0 +1,59 @@
+
+
+
+ Question
+ Answer
+
+
+
+
+ {% if answer_set.nationality %}
+ Nationality {{ answer_set.nationality.name }}
+ {% endif %}
+
+ {% if answer_set.country_of_residence %}
+ Country of Residence {{ answer_set.country_of_residence.name }}
+ {% endif %}
+
+ {% if answer_set.organisation %}
+ Organisation {{ answer_set.organisation }}
+ {% endif %}
+
+ {% if answer_set.organisation_started_date %}
+ Organisation Started Date {{ answer_set.organisation_started_date }}
+ {% endif %}
+
+ {% if answer_set.job_title %}
+ Job Title {{ answer_set.job_title }}
+ {% endif %}
+
+ {% if answer_set.disciplines %}
+ Discipline(s) {{ answer_set.disciplines }}
+ {% endif %}
+
+ {% if answer_set.themes.exists %}
+
+ Project Themes
+
+ {% for theme in answer_set.themes.all %}
+ {{ theme }}{% if not forloop.last %}, {% endif %}
+ {% endfor %}
+
+
+ {% endif %}
+
+ {% for answer in answer_set.question_answers.all %}
+
+ {{ answer.question }}
+ {{ answer }}
+
+
+ {% empty %}
+
+ No records
+
+ {% endfor %}
+
+
+
+
Last updated: {{ answer_set.timestamp }}
diff --git a/people/templates/people/person/map.html b/people/templates/people/person/map.html
new file mode 100644
index 0000000..78c7803
--- /dev/null
+++ b/people/templates/people/person/map.html
@@ -0,0 +1,28 @@
+{% extends 'base.html' %}
+
+{% block extra_head %}
+ {{ map_markers|json_script:'map-markers' }}
+
+ {% load staticfiles %}
+
+
+
+{% endblock %}
+
+{% block content %}
+
+
+
+ People
+
+ Map
+
+
+
+
Map
+
+
+
+{% endblock %}
diff --git a/people/templates/people/person/update.html b/people/templates/people/person/update.html
index 980f5a9..2e22b07 100644
--- a/people/templates/people/person/update.html
+++ b/people/templates/people/person/update.html
@@ -1,5 +1,29 @@
{% extends 'base.html' %}
+{% block extra_head %}
+ {% load staticfiles %}
+
+
+
+
+
+{% endblock %}
+
{% block content %}
@@ -22,11 +46,21 @@
{% csrf_token %}
{% load bootstrap4 %}
- {% bootstrap_form form %}
+ {% bootstrap_form form exclude='latitude,longitude' %}
+
+ {% bootstrap_field form.latitude %}
+ {% bootstrap_field form.longitude %}
{% buttons %}
Submit
{% endbuttons %}
+
+
+
+
+
+
+
{% endblock %}
diff --git a/people/urls.py b/people/urls.py
index eb73fe1..9fa4f32 100644
--- a/people/urls.py
+++ b/people/urls.py
@@ -38,6 +38,10 @@ urlpatterns = [
views.relationship.RelationshipUpdateView.as_view(),
name='relationship.update'),
+ path('map',
+ views.person.PersonMapView.as_view(),
+ name='person.map'),
+
path('network',
views.network.NetworkView.as_view(),
name='network'),
diff --git a/people/views/person.py b/people/views/person.py
index c495a86..d0023dd 100644
--- a/people/views/person.py
+++ b/people/views/person.py
@@ -2,7 +2,10 @@
Views for displaying or manipulating instances of :class:`Person`.
"""
+import typing
+
from django.contrib.auth.mixins import LoginRequiredMixin
+from django.urls import reverse
from django.utils import timezone
from django.views.generic import CreateView, DetailView, ListView, UpdateView
@@ -54,6 +57,15 @@ class ProfileView(permissions.UserIsLinkedPersonMixin, DetailView):
# pk was not provided in URL
return self.request.user.person
+ def get_context_data(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
+ """Add current :class:`PersonAnswerSet` to context."""
+ context = super().get_context_data(**kwargs)
+
+ context['answer_set'] = self.object.current_answers
+ context['map_markers'] = [get_map_data(self.object)]
+
+ return context
+
class PersonUpdateView(permissions.UserIsLinkedPersonMixin, UpdateView):
"""View for updating a :class:`Person` record."""
@@ -93,3 +105,38 @@ class PersonUpdateView(permissions.UserIsLinkedPersonMixin, UpdateView):
answer_set.save()
return response
+
+
+def get_map_data(person: models.Person) -> typing.Dict[str, typing.Any]:
+ answer_set = person.current_answers
+ try:
+ latitude = answer_set.latitude or None
+ longitude = answer_set.longitude or None
+
+ except AttributeError:
+ latitude = None
+ longitude = None
+
+ return {
+ 'name': person.name,
+ 'lat': latitude,
+ 'lng': longitude,
+ 'url': reverse('people:person.detail', kwargs={'pk': person.pk})
+ }
+
+
+class PersonMapView(LoginRequiredMixin, ListView):
+ """
+ View displaying a map of :class:`Person` locations.
+ """
+ model = models.Person
+ template_name = 'people/person/map.html'
+
+ def get_context_data(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
+ context = super().get_context_data(**kwargs)
+
+ context['map_markers'] = [
+ get_map_data(person) for person in self.object_list
+ ]
+
+ return context
diff --git a/roles/defaults/main.yml b/roles/defaults/main.yml
new file mode 100644
index 0000000..bf12883
--- /dev/null
+++ b/roles/defaults/main.yml
@@ -0,0 +1,4 @@
+---
+db_name: 'breccia'
+db_user: 'breccia'
+db_pass: 'breccia'
diff --git a/roles/webserver/defaults/main.yml b/roles/webserver/defaults/main.yml
index 5d9fbcf..bc0d0af 100644
--- a/roles/webserver/defaults/main.yml
+++ b/roles/webserver/defaults/main.yml
@@ -14,6 +14,8 @@ venv_dir: '{{ project_dir }}/venv'
web_user: nginx
web_group: nginx
db_name: '{{ project_name }}'
+db_user: 'breccia'
+db_pass: 'breccia'
display_short_name: 'BRECcIA'
display_long_name: 'BRECcIA Mapper'
\ No newline at end of file
diff --git a/roles/webserver/templates/settings.j2 b/roles/webserver/templates/settings.j2
index f99d88e..e9ccb89 100644
--- a/roles/webserver/templates/settings.j2
+++ b/roles/webserver/templates/settings.j2
@@ -23,3 +23,7 @@ DEFAULT_FROM_EMAIL={{ default_from_email }}
{% if email_port is defined %}
EMAIL_PORT={{ email_port }}
{% endif %}
+
+{% if google_maps_api_key is defined %}
+GOOGLE_MAPS_API_KEY={{ google_maps_api_key }}
+{% endif %}