Skip to content

Commit

Permalink
Merge pull request #166 from Teknologforeningen/feature/underscored-p…
Browse files Browse the repository at this point in the history
…referred-name

Add underscoring of preferred names to admin pages
  • Loading branch information
filiptypjeu authored Aug 13, 2023
2 parents dda8f36 + cfd9894 commit dd518aa
Show file tree
Hide file tree
Showing 17 changed files with 216 additions and 22 deletions.
1 change: 1 addition & 0 deletions .github/workflows/django-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ jobs:
run: python -m pip install --upgrade pip
- name: Install dependencies
run: |
sudo apt update
sudo apt install libsasl2-dev python3-dev libldap2-dev libssl-dev
sudo locale-gen sv_FI.UTF-8
sudo update-locale
Expand Down
2 changes: 1 addition & 1 deletion teknologr/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def get_minimal_id_name(self, instance):
return {'id': instance.id, 'name': instance.name}

def get_minimal_member(self, member):
return {'id': member.id, 'name': member.name if self.is_staff else member.public_full_name}
return {'id': member.id, 'name': member.full_name if self.is_staff else member.public_full_name}


# Members
Expand Down
2 changes: 1 addition & 1 deletion teknologr/api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ def post(self):
return self.client.post(self.api_path, self.post_data)

def check_status_code(self, response, status_code):
self.assertEqual(response.status_code, status_code, response.data)
self.assertEqual(response.status_code, status_code, response.data if 'data' in response else None)


'''
Expand Down
12 changes: 10 additions & 2 deletions teknologr/katalogen/templates/year.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,23 @@
</tr>
<tr>
<td>Postinnehavare</td>
<td>{{ functionaries|length }} ({{ functionaries_unique_count }})</td>
<td>{{ functionaries|length }}
{% if functionaries_unique_count %}
({{ functionaries_unique_count }})
{% endif %}
</td>
</tr>
<tr>
<td>Grupper</td>
<td>{{ groups|length }}</td>
</tr>
<tr>
<td>Gruppmedlemmar</td>
<td>{{ group_memberships_total }} ({{ group_memberships_unique }})</td>
<td>{{ group_memberships_total|default:0 }}
{% if group_memberships_unique %}
({{ group_memberships_unique }})
{% endif %}
</td>
</tr>
<tr>
<td>Nya ordinarie medlemmar</td>
Expand Down
File renamed without changes.
91 changes: 91 additions & 0 deletions teknologr/katalogen/tests_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@

from rest_framework import status
from api.tests import BaseAPITest

class GetPageTests():
def test_get_for_anonymous_users(self):
response = self.get_all()
self.check_status_code(response, status.HTTP_302_FOUND)
self.assertTrue(response.url.startswith('/login/'), response.url)

def test_get_for_user(self):
self.login_user()
response = self.get_all()
self.check_status_code(response, status.HTTP_200_OK)


class HomeViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = ''


class MembersSearchViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/search/?q=test'

class MembersStartsWithViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/A/'

class MemberViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/members/{self.m1.id}/'


class DecorationOwnershipsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/decorations/{self.d.id}/'


class DecorationsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/decorations/'

class DecorationOwnershipsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/decorations/{self.d.id}/'


class FunctionaryTypesViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/functionaries/'

class FunctionariesViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/functionaries/{self.ft.id}/'


class GroupTypesViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/groups/'

class GroupsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/groups/{self.gt.id}/'


class YearsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/years/'

class YearViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/years/2023/'

class Year0ViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/years/0/'
6 changes: 6 additions & 0 deletions teknologr/katalogen/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,12 @@ def add(obj, key, count_key=None):

@login_required
def year(request, year):
if int(year) <= 0:
return render(request, 'year.html', {
**_get_base_context(request),
'year': year,
})

'''
This could be enhanced, but curretnly it is done with 10 queries:
1. SELECT Functionary WHERE correct_year => COUNT
Expand Down
3 changes: 1 addition & 2 deletions teknologr/members/lookups.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ def get_result(self, obj):

def format_match(self, obj):
""" (HTML) formatted item for display in the dropdown """
preferred_name = obj.get_preferred_name()
return f'{obj.given_names.replace(preferred_name, f"<u>{preferred_name}</u>", 1)} {obj.surname}'
return obj.get_full_name_HTML()

def format_item_display(self, obj):
""" (HTML) formatted item for displaying item in the selected deck area """
Expand Down
18 changes: 11 additions & 7 deletions teknologr/members/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
from django.db.models import Q, Prefetch, Count
from django_countries.fields import CountryField
from django.shortcuts import get_object_or_404
from django.utils.html import format_html
from locale import strxfrm, strcoll
from operator import attrgetter
from datetime import date
from katalogen.utils import *
from members.utils import *

Expand Down Expand Up @@ -143,10 +145,12 @@ def get_surname_without_prefixes(self):
surname = self.surname
return surname.lstrip('abcdefghijklmnopqrstuvwxyzåäö ') or surname.split()[-1]

# Used for the side bar among other things
@property
def name(self):
return self.full_name
def get_full_name_HTML(self):
'''
Return name with the preferred name undercored. This can go wrong if the preferred name is not set correctly to one of the given names.
'''
preferred_name = self.get_preferred_name()
return format_html(f'{self.given_names.replace(preferred_name, f"<u>{preferred_name}</u>", 1)} {self.surname}')

@property
def common_name(self):
Expand Down Expand Up @@ -420,7 +424,7 @@ def year(self, year):
queryset=GroupMembership.objects.select_related('member')
),
'grouptype'
).filter(begin_date__lte=datetime.date(int(year), 12, 31), end_date__gte=datetime.date(int(year), 1, 1), num_members__gt=0)
).filter(begin_date__lte=date(int(year), 12, 31), end_date__gte=date(int(year), 1, 1), num_members__gt=0)

def year_ordered_and_counts(self, year):
queryset = self.year(year)
Expand Down Expand Up @@ -537,7 +541,7 @@ def all_with_related(self):
return self.get_queryset().select_related('functionarytype', 'member')

def year(self, year):
return self.all_with_related().filter(begin_date__lte=datetime.date(int(year), 12, 31), end_date__gte=datetime.date(int(year), 1, 1))
return self.all_with_related().filter(begin_date__lte=date(int(year), 12, 31), end_date__gte=date(int(year), 1, 1))

def year_ordered_and_unique(self, year):
queryset = self.year(year)
Expand Down Expand Up @@ -689,7 +693,7 @@ def order_by(cls, membertypes_list, by, reverse=False):
if by == 'begin_date':
key = lambda mt: mt.begin_date
elif by == 'end_date':
key = lambda mt: mt.end_date or datetime.date(9999, 12, 31)
key = lambda mt: mt.end_date or date(9999, 12, 31)
elif by == 'member':
key = lambda mt: strxfrm(mt.member.full_name_for_sorting)
else:
Expand Down
2 changes: 1 addition & 1 deletion teknologr/members/templates/decoration.html
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ <h4 class="list-inline-item">Innehavare av betygelsen</h4>
<i class="far fa-edit edit-do-button text-info" role="button" title="Editera betygelseinnehav" data-id="{{ ownership.id }}"></i>
<i class="fas fa-times delete-do-button text-danger" role="button" title="Radera betygelseinnehav" data-id="{{ ownership.id }}"></i>
</td>
<td><a href="{% url 'admin:member' ownership.member.id %}">{{ ownership.member.full_name }}</a></td>
<td><a href="{% url 'admin:member' ownership.member.id %}">{{ ownership.member.get_full_name_HTML }}</a></td>
<td>{{ ownership.acquired }}</td>
</tr>
{% endfor %}
Expand Down
2 changes: 1 addition & 1 deletion teknologr/members/templates/functionary.html
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ <h4 class="list-inline-item">Innehavare av posten</h4>
<i class="far fa-edit edit-f-button text-info" role="button" title="Editera postinnehav" data-id="{{ functionary.id }}"></i>
<i class="fas fa-times delete-f-button text-danger" role="button" title="Radera postinnehav" data-id="{{ functionary.id }}"></i>
</td>
<td><a href="{% url 'admin:member' functionary.member.id %}">{{ functionary.member.full_name }}</a></td>
<td><a href="{% url 'admin:member' functionary.member.id %}">{{ functionary.member.get_full_name_HTML }}</a></td>
<td>{{ functionary.begin_date }}</td>
<td>{{ functionary.end_date }}</td>
</tr>
Expand Down
2 changes: 1 addition & 1 deletion teknologr/members/templates/group.html
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ <h4>
<tr>
<td>
<i class="col-2 fas fa-times delete-gm-button text-danger" role="button" title="Radera gruppmedlemskap" data-id="{{ membership.id }}"></i>
<a class="col-10" href="{% url 'admin:member' membership.member.id %}">{{ membership.member.full_name }}</a>
<a class="col-10" href="{% url 'admin:member' membership.member.id %}">{{ membership.member.get_full_name_HTML }}</a>
</td>
</tr>
{% endfor %}
Expand Down
2 changes: 1 addition & 1 deletion teknologr/members/templates/member.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
</div>
</div>
<h2 class="page-header">
{{ member.full_name }}
{{ member.get_full_name_HTML }}
</h2>

{% if result %}
Expand Down
2 changes: 1 addition & 1 deletion teknologr/members/templates/side.html
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,6 @@
{{ obj.name|default:"Namnlös" }}{% if obj.count >= 0 %} ({{ obj.count }}) {% endif %}
</a>
{% empty %}
<span class="text-muted">Skriv i sökfältet för att visa medlemmar</span>
<span class="text-muted">Inga objekt hittades</span>
{% endfor %}
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,7 @@ def test_public_full_name_for_sorting(self):
self.assertEqual(self.member3.public_full_name_for_sorting, 'Tester, F-B Biz-Baz')

def test_name(self):
self.assertEqual(self.member1.name, 'Foo Bar Baz Tester')
self.assertEqual(self.member2.name, 'Foo Bar Baz Tester')
self.assertEqual(self.member3.name, 'Foo-Bar Biz-Baz von der Tester')
self.assertFalse(hasattr(self.member1, 'name'))

def test_address(self):
self.assertEquals('Otsvängen 22, 02150 Esbo, Finland', self.member1.full_address)
Expand Down
86 changes: 86 additions & 0 deletions teknologr/members/tests_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@

from rest_framework import status
from api.tests import BaseAPITest

class GetPageTests():
def test_get_for_anonymous_users(self):
response = self.get_all()
self.check_status_code(response, status.HTTP_302_FOUND)
self.assertTrue(response.url.startswith('/login/'), response.url)

def test_get_for_users(self):
response = self.get_all()
self.check_status_code(response, status.HTTP_302_FOUND)
self.assertTrue(response.url.startswith('/login/'), response.url)

def test_get_for_superusers(self):
self.login_superuser()
response = self.get_all()
self.check_status_code(response, status.HTTP_200_OK)


class HomeViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/admin/members/'


class MemberViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/admin/members/{self.m1.id}/'


class DecorationOwnershipsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/admin/decorations/{self.d.id}/'


class DecorationsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/admin/decorations/'

class DecorationOwnershipsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/admin/decorations/{self.d.id}/'


class FunctionaryTypesViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/admin/functionarytypes/'

class FunctionariesViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/admin/functionarytypes/{self.ft.id}/'


class GroupTypesViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/admin/grouptypes/'

class GroupsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/admin/grouptypes/{self.gt.id}/'

class GroupMembershipsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/admin/grouptypes/{self.gt.id}/{self.g.id}/'


class ApplicantsViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = '/admin/applicants/'

class ApplicantViewTest(BaseAPITest, GetPageTests):
def setUp(self):
super().setUp()
self.api_path = f'/admin/applicants/{self.a.id}/'
3 changes: 2 additions & 1 deletion teknologr/members/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ def set_side_context(context, category, active_obj=None):
if active_obj and active_obj not in side['objects']:
from itertools import chain
side['objects'] = list(chain([active_obj], side['objects']))
side['objects'] = [{'id': m.id, 'name': m.get_full_name_HTML()} for m in side['objects']]
elif category == 'grouptypes':
side['sname'] = 'grupp'
side['form'] = GroupTypeForm(auto_id="gtmodal_%s")
Expand Down Expand Up @@ -233,7 +234,7 @@ def decoration_ownership_form(request, decration_ownership_id):
})


@user_passes_test(lambda u: u.is_staff, login_url='/login')
@user_passes_test(lambda u: u.is_staff, login_url='/login/')
def applicant(request, applicant_id):
context = {}

Expand Down

0 comments on commit dd518aa

Please sign in to comment.