diff --git a/mo/web/org_users.py b/mo/web/org_users.py
index f0abd8eb2dbfb7a5c738fad2b941cfcf182bf824..6687a5bce2431ec0fceb407109b67ef6f6a3250e 100644
--- a/mo/web/org_users.py
+++ b/mo/web/org_users.py
@@ -5,7 +5,7 @@ from flask_wtf import FlaskForm
from sqlalchemy import or_, select, Column
from sqlalchemy.orm import joinedload, subqueryload
from sqlalchemy.orm.query import Query
-from typing import Optional, Set, Union, List, Tuple
+from typing import Optional, Set, Union, List, Tuple, Sequence
import urllib.parse
import werkzeug.exceptions
import wtforms
@@ -29,6 +29,12 @@ from mo.web.imports import ImportForm, generic_import_page
from mo.web.util import PagerForm
+def sorted_user_roles(roles: Sequence[db.UserRole]) -> List[db.UserRole]:
+ # Používá se ve výpisech rolí jednoho uživatele.
+ # Doporučujeme preloadnout UserRole.place.
+ return sorted(roles, key=lambda ur: (ur.year or 0, ur.seq or 0, mo.rights.role_order_by_type[ur.role], ur.place.level, ur.category or "", ur.user_role_id))
+
+
class UsersFilterForm(PagerForm):
# user
search_name = mo_fields.String("Jméno/příjmení", render_kw={'autofocus': True})
@@ -280,6 +286,7 @@ def org_orgs() -> str:
can_edit=rr.have_right(Right.edit_orgs),
can_add=rr.have_right(Right.add_orgs),
can_send_email=rr.can_send_email(count),
+ sorted_user_roles=sorted_user_roles,
)
@@ -411,6 +418,7 @@ def org_org(id: int):
roles_by_type=mo.rights.roles_by_type, role_errors=role_errors,
form_add_role=form_add_role, form_remove_role=form_remove_role,
resend_invite_form=resend_invite_form,
+ sorted_user_roles=sorted_user_roles,
)
diff --git a/mo/web/templates/org_org.html b/mo/web/templates/org_org.html
index adce580dd53989efcc517e7ca2b8d938deeeed7d..6d99a70051b154c6421d5554264f1b0df26c89ab 100644
--- a/mo/web/templates/org_org.html
+++ b/mo/web/templates/org_org.html
@@ -54,7 +54,7 @@
<th>Role<th>Oblast<th>Ročník<th>Kategorie<th class='has-tip' title='Pořadí kola v kategorii'>Kolo<th>Přidělil<th>Akce
</tr>
</thead>
-{% for role in user.roles %}
+{% for role in sorted_user_roles(user.roles) %}
<tr>
<td>{{ roles_by_type[role.role].name }}
<td><a href="{{ url_for('org_place', id=role.place_id) }}">{{ role.place.type_name() + ": " + role.place.name or '*' }}</a>
diff --git a/mo/web/templates/org_orgs.html b/mo/web/templates/org_orgs.html
index 5ee560b45412322f5fea132943a6ccf777209a5c..a069834a58acd24d8a526845d82ab935548a7b4d 100644
--- a/mo/web/templates/org_orgs.html
+++ b/mo/web/templates/org_orgs.html
@@ -85,7 +85,7 @@
<td>{% if user.is_system %}systémový uživatel{% elif user.is_admin %}správce{% elif user.roles|count == 0 %}<i>žádná role</i>{% endif %}
{% if user.roles|count > 0 %}
<ul>
- {% for role in user.roles %}
+ {% for role in sorted_user_roles(user.roles) %}
{% if role.user_role_id in marked_roles_id %}
<li><b>{{ role }}</b></li>
{% else %}