Files
ACORE/core/accounting_portal.py
T

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'))