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',
'countries',
'hq_country',
'is_partner_organisation',
'latitude',
'longitude',
]
labels = {
'is_partner_organisation':
f'Is this organisation a {settings.PARENT_PROJECT_NAME} partner organisation?'
}
widgets = {
'countries': Select2MultipleWidget(),
'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=(
'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)
longitude = models.FloatField(blank=True, null=True)

View File

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

View File

@@ -1,5 +1,6 @@
import typing
from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils import timezone
from django.views.generic import CreateView, DetailView, ListView, UpdateView
@@ -14,15 +15,79 @@ class OrganisationCreateView(LoginRequiredMixin, CreateView):
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):
"""View displaying a list of :class:`organisation` objects."""
model = models.Organisation
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,
**kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
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(
self.request.user.person.organisation_relationship_targets.
values_list('pk', flat=True))