feat: sort by country on organisation list

This commit is contained in:
James Graham
2021-03-09 12:24:46 +00:00
parent 7e9a6e992a
commit 7d74a99518
5 changed files with 95 additions and 5 deletions

View File

@@ -101,9 +101,14 @@ class OrganisationAnswerSetForm(forms.ModelForm, DynamicAnswerSetBase):
'website', 'website',
'countries', 'countries',
'hq_country', 'hq_country',
'is_partner_organisation',
'latitude', 'latitude',
'longitude', 'longitude',
] ]
labels = {
'is_partner_organisation':
f'Is this organisation a {settings.PARENT_PROJECT_NAME} partner organisation?'
}
widgets = { widgets = {
'countries': Select2MultipleWidget(), 'countries': Select2MultipleWidget(),
'hq_country': Select2Widget(), 'hq_country': Select2Widget(),

View File

@@ -0,0 +1,18 @@
# Generated by Django 2.2.10 on 2021-03-09 09:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('people', '0042_is_hardcoded_questions'),
]
operations = [
migrations.AddField(
model_name='organisationanswerset',
name='is_partner_organisation',
field=models.BooleanField(default=False),
),
]

View File

@@ -88,6 +88,10 @@ class OrganisationAnswerSet(AnswerSet):
help_text=( help_text=(
'In which country does this organisation have its main location?')) 'In which country does this organisation have its main location?'))
is_partner_organisation = models.BooleanField(default=False,
blank=False,
null=False)
latitude = models.FloatField(blank=True, null=True) latitude = models.FloatField(blank=True, null=True)
longitude = models.FloatField(blank=True, null=True) longitude = models.FloatField(blank=True, null=True)

View File

@@ -15,13 +15,11 @@
href="{% url 'people:organisation.create' %}">New Organisation</a> href="{% url 'people:organisation.create' %}">New Organisation</a>
<table class="table table-borderless"> <table class="table table-borderless">
{% regroup organisation_list.all by current_answers.hq_country as countries %}
<tbody> <tbody>
{% for country in countries %} {% for country, organisations in orgs_by_country.items %}
<tr><th>{{ country.grouper.name|default:"Unknown" }}</th></tr> <tr><th>{{ country }}</th></tr>
{% for organisation in country.list %} {% for organisation in organisations %}
<tr> <tr>
<td>{{ organisation }}</td> <td>{{ organisation }}</td>
<td> <td>

View File

@@ -1,5 +1,6 @@
import typing import typing
from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils import timezone from django.utils import timezone
from django.views.generic import CreateView, DetailView, ListView, UpdateView from django.views.generic import CreateView, DetailView, ListView, UpdateView
@@ -14,15 +15,79 @@ class OrganisationCreateView(LoginRequiredMixin, CreateView):
form_class = forms.OrganisationForm form_class = forms.OrganisationForm
def try_copy_by_key(src_dict: typing.Mapping[str, typing.Any],
dest_dict: typing.MutableMapping[str, typing.Any],
key: str) -> None:
"""Copy a value by key from one dictionary to another.
If the key does not exist, skip it.
"""
value = src_dict.get(key, None)
if value is not None:
dest_dict[key] = value
class OrganisationListView(LoginRequiredMixin, ListView): class OrganisationListView(LoginRequiredMixin, ListView):
"""View displaying a list of :class:`organisation` objects.""" """View displaying a list of :class:`organisation` objects."""
model = models.Organisation model = models.Organisation
template_name = 'people/organisation/list.html' template_name = 'people/organisation/list.html'
@staticmethod
def sort_organisation_countries(
orgs_by_country: typing.MutableMapping[str, typing.Any]
) -> typing.Dict[str, typing.Any]:
"""Sort dictionary of organisations by country.
Sort order:
- Project partners
- International organisations
- Organisations by country alphabetically
- Organisations with unknown country
"""
orgs_sorted = {}
try_copy_by_key(orgs_by_country, orgs_sorted,
f'{settings.PARENT_PROJECT_NAME} partners')
try_copy_by_key(orgs_by_country, orgs_sorted, 'International')
special = {
f'{settings.PARENT_PROJECT_NAME} partners', 'International',
'Unknown'
}
for country in sorted(k for k in orgs_by_country.keys()
if k not in special):
orgs_sorted[country] = orgs_by_country[country]
try_copy_by_key(orgs_by_country, orgs_sorted, 'Unknown')
return orgs_sorted
def get_context_data(self, def get_context_data(self,
**kwargs: typing.Any) -> typing.Dict[str, typing.Any]: **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
orgs_by_country = {}
for organisation in self.get_queryset().all():
answers = organisation.current_answers
country = 'Unknown'
if len(answers.countries) == 1:
country = answers.countries[0].name
elif len(answers.countries) > 1:
country = 'International'
if answers.is_partner_organisation:
country = f'{settings.PARENT_PROJECT_NAME} partners'
orgs = orgs_by_country.get(country, [])
orgs.append(organisation)
orgs_by_country[country] = orgs
# Sort into meaningful order
context['orgs_by_country'] = self.sort_organisation_countries(
orgs_by_country)
context['existing_relationships'] = set( context['existing_relationships'] = set(
self.request.user.person.organisation_relationship_targets. self.request.user.person.organisation_relationship_targets.
values_list('pk', flat=True)) values_list('pk', flat=True))