You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.4 KiB
97 lines
3.4 KiB
# -*- coding: utf-8 -*-
|
|
from collections import OrderedDict
|
|
|
|
from django.shortcuts import get_object_or_404, render
|
|
from django.db.models import F
|
|
from django.db.models import Sum
|
|
|
|
from project.teasers.models import get_teasers_for_path
|
|
|
|
from .models import OblOtdelen, NasPunkt, NasPunktOtdelen
|
|
|
|
|
|
def get_naspunkts_letters_dict(_naspunkt_list):
|
|
naspunkts = OrderedDict() # ãðóïïèðîâêà íàñ.ïóíêòîâ ïî ïåðâîìó ñèìâîëó íàçâàíèÿ
|
|
_np_digit = OrderedDict() # íàçâàíèÿ, íà÷èíàþùèåñÿ ñ öèôð, ÷òîáû âûâîäèòü èõ â ñàìîì êîíöå
|
|
|
|
for _naspunkt in _naspunkt_list:
|
|
_char = _naspunkt.name.strip()[0]
|
|
if _char.isdigit():
|
|
try:
|
|
_np_digit[_char].append(_naspunkt)
|
|
except KeyError:
|
|
_np_digit[_char] = [_naspunkt]
|
|
else:
|
|
try:
|
|
naspunkts[_char].append(_naspunkt)
|
|
except KeyError:
|
|
naspunkts[_char] = [_naspunkt]
|
|
|
|
naspunkts.update(_np_digit)
|
|
return naspunkts
|
|
|
|
|
|
def group_obl_otdelens_by_first_char(obj_list):
|
|
out_dict = OrderedDict() # ãðóïïèðîâêà ýëåìåíòîâ ïî ïåðâîìó ñèìâîëó íàçâàíèÿ
|
|
digits_dict = OrderedDict() # íàçâàíèÿ, íà÷èíàþùèåñÿ ñ öèôð, ÷òîáû âûâîäèòü èõ â ñàìîì êîíöå
|
|
|
|
for obj in obj_list:
|
|
char = obj.oblast_short.strip()[0].upper()
|
|
if char.isdigit():
|
|
try:
|
|
digits_dict[char].append(obj)
|
|
except KeyError:
|
|
digits_dict[char] = [obj]
|
|
else:
|
|
try:
|
|
out_dict[char].append(obj)
|
|
except KeyError:
|
|
out_dict[char] = [obj]
|
|
|
|
out_dict.update(digits_dict)
|
|
|
|
return out_dict
|
|
|
|
|
|
def pensfonds_all(request):
|
|
"""Âñå öåíòðàëüíûå îòäåëåíèÿ ïî îáëàñòÿì è ïî ãîðîäàì."""
|
|
_obl_list = OblOtdelen.objects.all().order_by('oblast_short').annotate(people_count=Sum('naspunkts__people_count'))
|
|
obl_otdelens = group_obl_otdelens_by_first_char(_obl_list)
|
|
|
|
teasers = get_teasers_for_path(request.path)
|
|
|
|
# íàñ.ïóíêòû äëÿ ïîêàçà âî âòîðîì òàáå ñòðàíèöû
|
|
_naspunkt_list = NasPunkt.objects.all().select_related().order_by('name', 'obl_otdelen')
|
|
naspunkts = get_naspunkts_letters_dict(_naspunkt_list)
|
|
|
|
naspunkt_teasers = get_teasers_for_path(request.path + u'#naspunkty')
|
|
|
|
return render(request, 'pensfonds/pensfonds_all.html', {
|
|
'obl_otdelens': obl_otdelens, 'teasers': teasers,
|
|
'naspunkts': naspunkts, 'naspunkt_teasers': naspunkt_teasers,
|
|
})
|
|
|
|
|
|
def pensfonds_oblast(request, slug):
|
|
"""Îòäåëåíèÿ ïî îáëàñòè."""
|
|
obl_otdelen = get_object_or_404(OblOtdelen, slug__iexact=slug)
|
|
naspunkts = obl_otdelen.naspunkts.all().select_related()
|
|
naspunkts = get_naspunkts_letters_dict(naspunkts)
|
|
|
|
teasers = get_teasers_for_path(request.path)
|
|
|
|
return render(request, 'pensfonds/pensfonds_oblast.html',
|
|
{'obl_otdelen': obl_otdelen, 'teasers': teasers, 'naspunkts': naspunkts})
|
|
|
|
|
|
def pensfonds_naspunkt(request, obl_slug, slug):
|
|
"""Îòäåëåíèÿ â íàñåëåííîì ïóíêòå."""
|
|
obl_otdelen = get_object_or_404(OblOtdelen, slug__iexact=obl_slug)
|
|
naspunkt = get_object_or_404(NasPunkt, obl_otdelen=obl_otdelen, slug__iexact=slug)
|
|
|
|
obl_otdelen.people_count = obl_otdelen.naspunkts.aggregate(people_count=Sum('people_count'))['people_count']
|
|
|
|
teasers = get_teasers_for_path(request.path)
|
|
|
|
return render(request, 'pensfonds/pensfonds_naspunkt.html',
|
|
{'obl_otdelen': obl_otdelen, 'naspunkt': naspunkt, 'teasers': teasers})
|
|
|