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

# -*- 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})