mirror of
https://github.com/Southampton-RSG/breccia-mapper.git
synced 2026-03-03 03:17:07 +00:00
feat: display organisations on map
Add buttons to toggle organisations and people Resolves #87
This commit is contained in:
@@ -3,6 +3,7 @@ Views for displaying or manipulating models within the `people` app.
|
||||
"""
|
||||
|
||||
from . import (
|
||||
map,
|
||||
network,
|
||||
organisation,
|
||||
person,
|
||||
@@ -11,6 +12,7 @@ from . import (
|
||||
|
||||
|
||||
__all__ = [
|
||||
'map',
|
||||
'network',
|
||||
'organisation',
|
||||
'person',
|
||||
|
||||
52
people/views/map.py
Normal file
52
people/views/map.py
Normal 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
|
||||
@@ -5,11 +5,11 @@ 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
|
||||
|
||||
from people import forms, models, permissions
|
||||
from .map import get_map_data
|
||||
|
||||
|
||||
class PersonCreateView(LoginRequiredMixin, CreateView):
|
||||
@@ -130,42 +130,3 @@ class PersonUpdateView(permissions.UserIsLinkedPersonMixin, UpdateView):
|
||||
answer_set.save()
|
||||
|
||||
return response
|
||||
|
||||
|
||||
def get_map_data(person: models.Person) -> typing.Dict[str, typing.Any]:
|
||||
"""Prepare data to mark people on a map."""
|
||||
answer_set = person.current_answers
|
||||
organisation = getattr(answer_set, 'organisation', None)
|
||||
|
||||
try:
|
||||
country = answer_set.country_of_residence.name
|
||||
|
||||
except AttributeError:
|
||||
country = None
|
||||
|
||||
return {
|
||||
'name': person.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': 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
|
||||
|
||||
Reference in New Issue
Block a user