mirror of
https://github.com/Southampton-RSG/breccia-mapper.git
synced 2026-03-03 19:37:06 +00:00
feat: sort by country on organisation list
This commit is contained in:
@@ -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(),
|
||||||
|
|||||||
@@ -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),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user