feat: display organisations on map

Add buttons to toggle organisations and people

Resolves #87
This commit is contained in:
James Graham
2021-03-09 14:55:31 +00:00
parent 6670a87a52
commit 989c8141b3
8 changed files with 108 additions and 72 deletions

52
people/views/map.py Normal file
View File

@@ -0,0 +1,52 @@
import typing
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import QuerySet
from django.urls import reverse
from django.utils import timezone
from django.views.generic import TemplateView
from people import forms, models, permissions
def get_map_data(obj: typing.Union[models.Person, models.Organisation]) -> typing.Dict[str, typing.Any]:
"""Prepare data to mark people or organisations on a map."""
answer_set = obj.current_answers
organisation = getattr(answer_set, 'organisation', None)
try:
country = answer_set.country_of_residence.name
except AttributeError:
country = None
return {
'name': obj.name,
'lat': getattr(answer_set, 'latitude', None),
'lng': getattr(answer_set, 'longitude', None),
'organisation': getattr(organisation, 'name', None),
'org_lat': getattr(organisation, 'latitude', None),
'org_lng': getattr(organisation, 'longitude', None),
'country': country,
'url': obj.get_absolute_url(),
'type': type(obj).__name__,
}
class MapView(LoginRequiredMixin, TemplateView):
"""View displaying a map of :class:`Person` and :class:`Organisation` locations."""
template_name = 'people/map.html'
def get_context_data(self,
**kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
context = super().get_context_data(**kwargs)
map_markers = []
map_markers.extend(
get_map_data(person) for person in models.Person.objects.all())
map_markers.extend(
get_map_data(org) for org in models.Organisation.objects.all())
context['map_markers'] = map_markers
return context