diff --git a/CHANGELOG.md b/CHANGELOG.md index 26eab12..8892619 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 1.5.1 + +- В карточке сотрудника убран дублирующий блок `news`. Раздел «В новостях» со ссылками теперь можно раскрывать и сворачивать; при загрузке карточки он закрыт по умолчанию. + +## 1.5.0 + +- В справочник сотрудников добавлен чекбокс «ППС»: отбор по словам «кафедра» или «департамент» в должностях без учёта регистра. Фильтр совмещается с остальными условиями и сохраняется при переходе между страницами; в API доступен параметр `pps=true`. + ## 0.18.1 - Проверка К1/К2 учитывает ISSN/eISSN исходной записи вместе с идентификаторами DOI, в том числе без сетевого поиска. Противоречие названия и ISSN не превращается в предварительное совпадение. diff --git a/app/admin.py b/app/admin.py index 01c1cf8..3ad1ade 100644 --- a/app/admin.py +++ b/app/admin.py @@ -113,6 +113,7 @@ def directory( started_to: str | None = None, has_email: str | None = None, has_academic_degree: str | None = None, + pps: bool = False, sort: str = "full_name", direction: str = "asc", limit: int = 50, @@ -134,6 +135,7 @@ def directory( started_to=parsed_started_to, has_email=parsed_has_email, has_academic_degree=parsed_has_academic_degree, + pps=pps, sort=sort, direction=direction, limit=limit, @@ -154,6 +156,7 @@ def directory( "started_to": started_to or "", "has_email": has_email or "", "has_academic_degree": has_academic_degree or "", + "pps": pps, "sort": sort, "direction": direction, "limit": page["limit"], diff --git a/app/api.py b/app/api.py index 6bde8b0..c5f5b45 100644 --- a/app/api.py +++ b/app/api.py @@ -29,6 +29,7 @@ def list_employees( started_to: date | None = None, has_email: bool | None = None, has_academic_degree: bool | None = None, + pps: bool = False, sort: str = "full_name", direction: str = "asc", limit: int = 50, @@ -45,6 +46,7 @@ def list_employees( started_to=started_to, has_email=has_email, has_academic_degree=has_academic_degree, + pps=pps, sort=sort, direction=direction, limit=limit, diff --git a/app/services/admin_data.py b/app/services/admin_data.py index 228b7de..2cf4d14 100644 --- a/app/services/admin_data.py +++ b/app/services/admin_data.py @@ -116,6 +116,7 @@ def list_employees_page( started_to: date | None = None, has_email: bool | None = None, has_academic_degree: bool | None = None, + pps: bool = False, sort: str = "full_name", direction: str = "asc", limit: int = 50, @@ -131,12 +132,23 @@ def list_employees_page( has_email=has_email, has_academic_degree=has_academic_degree, ) - total = db.scalar(select(func.count()).select_from(base_stmt.subquery())) or 0 - if offset >= total: - offset = 0 sort_column = EMPLOYEE_SORTS.get(sort, Employee.full_name) order = desc(sort_column) if direction == "desc" else sort_column - employees = db.scalars(base_stmt.order_by(order).limit(limit).offset(offset)).all() + ordered_stmt = base_stmt.order_by(order) + if pps: + # Match decoded position strings consistently in PostgreSQL and SQLite. + employees = [employee for employee in db.scalars(ordered_stmt).all() + if any("кафедра" in position.casefold() or "департамент" in position.casefold() + for position in _clean_list(_as_dict(employee.current_data).get("positions")))] + total = len(employees) + if offset >= total: + offset = 0 + employees = employees[offset:offset + limit] + else: + total = db.scalar(select(func.count()).select_from(base_stmt.subquery())) or 0 + if offset >= total: + offset = 0 + employees = db.scalars(ordered_stmt.limit(limit).offset(offset)).all() return { "employees": [employee_display_payload(employee) for employee in employees], "total": total, diff --git a/app/static/admin.css b/app/static/admin.css index 2a69e02..db1d93f 100644 --- a/app/static/admin.css +++ b/app/static/admin.css @@ -281,6 +281,20 @@ border-radius: 8px; } +.employee-card__news-toggle { + min-height: 44px; + align-content: center; + cursor: pointer; +} + +.employee-card__news-toggle .employee-section__title { + display: inline; +} + +.employee-card__section--news[open] .employee-card__news-toggle { + margin-bottom: 12px; +} + .employee-card__meta { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); @@ -598,6 +612,15 @@ border-radius: 6px; } +.directory__checkbox { + display: flex; + align-items: center; + gap: 8px; + min-height: 44px; + font-size: 14px; + cursor: pointer; +} + .directory__filter-actions { display: flex; align-items: end; diff --git a/app/templates/directory.html b/app/templates/directory.html index 30c9f45..90a64fb 100644 --- a/app/templates/directory.html +++ b/app/templates/directory.html @@ -35,6 +35,7 @@ +