b0fb8c5218
Co-authored-by: Cursor <cursoragent@cursor.com>
104 lines
3.5 KiB
Python
104 lines
3.5 KiB
Python
"""Портал «Операционный учёт»: РРО, коммуналка, энергооборудование, провайдеры, время."""
|
|
from __future__ import annotations
|
|
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
from core.portal_access import deny_section_access, user_can_access
|
|
from core.utils.htmx import render_page
|
|
|
|
ACCOUNTING_TABS: tuple[tuple[str, str, str], ...] = (
|
|
('rro', 'РРО / ПРРО', 'rro'),
|
|
('utilities', 'Коммунальные услуги', 'utilities'),
|
|
('power', 'Энергооборудование', 'utilities'),
|
|
('timetrack', 'Учёт рабочего времени', 'timetrack'),
|
|
('internet', 'Оплата провайдеров', 'internet_billing'),
|
|
)
|
|
|
|
|
|
def user_can_access_accounting_portal(user) -> bool:
|
|
return any(user_can_access(user, section_key) for _, _, section_key in ACCOUNTING_TABS)
|
|
|
|
|
|
def available_accounting_tabs(user) -> list[tuple[str, str]]:
|
|
"""[(tab_key, label), ...] для пользователя."""
|
|
return [
|
|
(key, label)
|
|
for key, label, section_key in ACCOUNTING_TABS
|
|
if user_can_access(user, section_key)
|
|
]
|
|
|
|
|
|
def accounting_tab_url(tab: str, **query) -> str:
|
|
from urllib.parse import urlencode
|
|
|
|
params = {'tab': tab, **query}
|
|
return f'/accounting/?{urlencode(params)}'
|
|
|
|
|
|
def _tab_context(request, tab: str, **extra):
|
|
if tab == 'rro':
|
|
from apps.rro.views import _rro_list_context
|
|
|
|
ctx = _rro_list_context(request, **extra)
|
|
ctx['accounting_base_url'] = accounting_tab_url('rro')
|
|
return ctx
|
|
if tab == 'utilities':
|
|
from apps.utilities.views import _utilities_context
|
|
|
|
ctx = _utilities_context(request, **extra)
|
|
ctx['accounting_base_url'] = accounting_tab_url('utilities')
|
|
return ctx
|
|
if tab == 'power':
|
|
from apps.power_assets.views import _power_assets_context
|
|
|
|
ctx = _power_assets_context(request, **extra)
|
|
ctx['accounting_base_url'] = accounting_tab_url('power')
|
|
return ctx
|
|
if tab == 'timetrack':
|
|
from core.views import _timetrack_context
|
|
|
|
ctx = _timetrack_context(request, **extra)
|
|
ctx['accounting_base_url'] = accounting_tab_url('timetrack')
|
|
return ctx
|
|
if tab == 'internet':
|
|
from apps.it_manager.billing import _internet_billing_context
|
|
|
|
ctx = _internet_billing_context(request, **extra)
|
|
ctx['accounting_base_url'] = accounting_tab_url('internet')
|
|
return ctx
|
|
return {}
|
|
|
|
|
|
def accounting_portal_context(request, active_tab: str | None = None, **extra):
|
|
user = request.user
|
|
tabs = available_accounting_tabs(user)
|
|
if not tabs:
|
|
return None
|
|
|
|
tab_keys = [t[0] for t in tabs]
|
|
if active_tab not in tab_keys:
|
|
active_tab = tab_keys[0]
|
|
|
|
context = {
|
|
'accounting_active_tab': active_tab,
|
|
'accounting_tabs': tabs,
|
|
'accounting_embed': True,
|
|
'pagination_base_url': '/accounting/',
|
|
}
|
|
context.update(_tab_context(request, active_tab, **extra))
|
|
return context
|
|
|
|
|
|
def render_accounting_portal(request, active_tab: str | None = None, **extra):
|
|
context = accounting_portal_context(request, active_tab, **extra)
|
|
if context is None:
|
|
return deny_section_access(request)
|
|
return render_page(request, 'accounting-portal.html', context)
|
|
|
|
|
|
@login_required
|
|
def accounting_portal_view(request):
|
|
if not user_can_access_accounting_portal(request.user):
|
|
return deny_section_access(request)
|
|
return render_accounting_portal(request, request.GET.get('tab'))
|