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