def pick_language(request, lang): """Переключение языка :param request: HttpRequest :param lang: язык (домен) на который переключаемся""" schema = 'https://' if request.is_secure() else 'http://' referer = get_referer_path(request) domains = get_domains() for domain in domains: if domain['domain'].startswith("%s." % lang): request.session['lang'] = lang #if settings.DEBUG: # return redirect(referer) # Если домен совпадает с доменом по умолчанию, # тогда переадресацию делаем на MAIN_DOMAIN dest = '%s%s%s' % (schema, domain['domain'], referer) if settings.DEFAULT_DOMAIN == lang: dest = '%s%s%s' % (schema, settings.MAIN_DOMAIN, referer) return redirect(dest) # Если домен не нашелся, удаляем try: del request.session['lang'] except Exception: pass return redirect(referer)
def show_sitemap(self, request): """Формирование ссылок для карты сайта :param request: HttpRequest TODO: постраничная навигация TODO: выполнять кроном и ложить в кэш/файл """ managers = self.get_menu_managers() context = {} q_string = {} containers = {} # для перевода all_containers = [] all_blocks = [] for key, manager in managers.items(): query = Blocks.objects.filter( container__in=manager['containers']).order_by('position') manager['structure'] = [] for container in manager['containers']: menus = [] blocks = [ block for block in query if block.container_id == container ] recursive_fill(blocks, menus, parents='') sort_voca(menus) container = Containers.objects.filter(pk=container).first() all_containers.append(container) all_blocks += blocks manager['structure'].append({ 'container': container, 'blocks': menus }) # Переводим блоки/контейнеры if settings.IS_DOMAINS and request: domains = get_domains() domain = get_domain(request, domains) if domain: domains = [domain] get_translate(all_blocks, domains) translate_rows(all_blocks, domain) get_translate(all_containers, domains) translate_rows(all_containers, domain) context['managers'] = managers page = SearchLink(q_string, request, containers) if not page: page = Blocks(name='Карта сайта') context['breadcrumbs'] = [{ 'name': page.name, 'link': '/sitemap/', }] context['page'] = page context['containers'] = containers template = 'sitemap_html.html' return render(request, template, context)
def portfolio_menu(request): """Портфолио менюшка""" result = {} all_blocks = [] # Для перевода cache_time = 60 # 60 секунд cache_var = '%s_portfolio_menu' % (settings.PROJECT_NAME, ) if settings.IS_DOMAINS: domain = get_domain(request) if domain: cache_var += '_%s' % domain['pk'] inCache = cache.get(cache_var) ignore_cache = request.GET.get('ignore_cache') or request.GET.get( 'force_new') if inCache and not ignore_cache: result = inCache else: # Вытаскиваем менюшку portfolio portfolio_menu = Blocks.objects.filter(tag='portfolio', link='/portfolio/', state=4).first() parents = '%s_%s' % (portfolio_menu.parents, portfolio_menu.id) search_blocks = Blocks.objects.filter(state=4, is_active=True).filter( Q(parents=parents) | Q(parents__startswith='%s_' % parents)) for item in search_blocks: all_blocks.append(item) menu_queryset = [] recursive_fill(search_blocks, menu_queryset, parents) menus = sort_voca(menu_queryset) # -------------------------- # Переводим блоки/контейнеры # -------------------------- if settings.IS_DOMAINS: domains = get_domains() domain = get_domain(request, domains) if domain: domains = [domain] get_translate(all_blocks, domains) translate_rows(all_blocks, domain) result['menus'] = menus cache.set(cache_var, result, cache_time) result['request'] = request return result
def flatmenu(request, tag: str = None, containers: list = []): """Все виды меню в шаблоне :param tag: Тег контейнера меню :param containers: Контейнеры, которые нужно передать в шаблон""" result = {} all_blocks = [] # Для перевода if not tag: return result cache_time = 60 # 60 секунд cache_var = '%s_flatmenu_%s' % (settings.PROJECT_NAME, tag) if settings.IS_DOMAINS: domain = get_domain(request) if domain: cache_var += '_%s' % domain['pk'] inCache = cache.get(cache_var) ignore_cache = request.GET.get('ignore_cache') or request.GET.get('force_new') if inCache and not ignore_cache: result = inCache else: search_blocks = Blocks.objects.filter(container__tag=tag, state=4, is_active=True, container__is_active=True) for item in search_blocks: all_blocks.append(item) menu_queryset = [] recursive_fill(search_blocks, menu_queryset, '') menus = sort_voca(menu_queryset) # -------------------------- # Переводим блоки/контейнеры # -------------------------- if settings.IS_DOMAINS: domains = get_domains() domain = get_domain(request, domains) if domain: domains = [domain] get_translate(all_blocks, domains) translate_rows(all_blocks, domain) result['menus'] = menus cache.set(cache_var, result, cache_time) result['containers'] = containers result['request'] = request result['tag'] = tag return result
def select_language(request, lang: str = None): """Выбор языка для заполнения в админке Также правильно было бы и язык самой админки переключать """ result = {} mh_vars = languages_vars.copy() mh = create_model_helper(mh_vars, request, CUR_APP, 'settings') context = mh.context if lang: request.session['lang'] = lang context['domains'] = get_domains() for item in context['domains']: if item['lang'] == 'rus': context['default'] = True template = '%sselect_lang.html' % mh.template_prefix return render(request, template, context)
def fill_files(**kwargs): """Файлы :param kwargs['force'] принудительно обновляет файл """ def create_robots_txt(domain: dict = None): """Вспомогательная функция для создания robotx.txt файла :param domain: словарь с параметрами домена """ if not domain: domain = {} robots_txt = Files.objects.create( link=robots_txt_link, name='robots.txt', desc='Файл для запретов индексации поисковым системам', domain=domain.get('pk')) folder = robots_txt.get_folder() make_folder(folder) dest = '%s%s' % (folder.rstrip('/'), robots_txt_link) with open_file(dest, mode='w+', encoding='utf-8') as f: domain_site = domain.get('domain') if not domain_site: domain_site = settings.MAIN_DOMAIN or 'masterme.ru' f.write(robots_txt_content.format(domain_site)) robots_txt.path = robots_txt_link.lstrip('/') robots_txt.save() robots_txt_link = '/robots.txt' robots_txt = Files.objects.filter(link=robots_txt_link) if not robots_txt or kwargs.get('force'): for item in Files.objects.filter(link=robots_txt_link): item.delete() create_robots_txt() if settings.IS_DOMAINS: domains = get_domains() for domain in domains: create_robots_txt(domain)
def __init__(self, model, request=None, cur_app: str = None): """Инициализация :param model: основная модель, с которой работаем :param request: HttpRequest :param cur_app: папка приложения """ self.model = model self.cur_app = cur_app self.context = {} # контекст для view self.reverse_params = {} # Параметры для ссылок url_create/url_edit self.query = None # Метка модели, например, 'price' self.app_label = self.model._meta.app_label self.model_name = self.model._meta.model_name self.request = request self.q_string = {} if self.request: q_string_fill(self.request, self.q_string) if not 'q' in self.q_string: self.q_string['q'] = {} # ----------------------------- # Если мы вызываем без request, # задаем значения по-умолчанию # ----------------------------- else: self.q_string['q'] = {} self.q_string['page'] = 1 self.q_string['by'] = 50 self.paginator_template = "core/admin_paginator.html" # ----------------------- # Переменные для простого # вывода и редактирования # ----------------------- self.singular_obj = 'Объект' self.plural_obj = 'Объекты' self.rp_singular_obj = 'Объекта' # Родительный падеж self.rp_plural_obj = 'Объектов' # Родительный падеж self.template_prefix = 'objects_' self.action_create = 'Новый' self.action_edit = 'Редактировать' self.action_drop = 'Удалить' self.action = None self.url_create = None self.url_edit = None # ---------------------- # Постраничная навигация # ---------------------- self.raw_paginator = {} self.paginator = None self.breadcrumbs = [] # ---------------------------------- # Можно передать разрешения (права), # и проверять здесь основные права, # ---------------------------------- self.permissions = { 'create': False, 'edit': False, 'drop': False, 'view': False, } # ----------------- # Произошла ошибка? # ----------------- self.error = None # ------------------------- # Запись с которой работаем # ------------------------- self.row = None # ------------------- # Переменные из формы # ------------------- self.row_vars = {} self.files = [] # --------------- # Поля для поиска # --------------- self.q = None self.search_fields = [] # ------------------- # Фильтры для выборки # ------------------- self.filters = [] self.excludes = [] # ------------------------ # Нестандартная сортировка # ------------------------ self.custom_order = None # ---------------------------------- # Фильтр неподдающийся логике модели # ---------------------------------- self.custom_filter = None # ------------------------- # select_related в запросах # ------------------------- self.select_related = [] # ---------- # Сортировки # ---------- self.order_by = [] # ------------------- # Слова для подсветки # ------------------- self.words = [] # ---------------------------------------- # Ограничение, например, для ajax_search() # чтобы не выдирать все записи разом # ---------------------------------------- self.limit = None # ------------------------- # Заполняем права на модель # ------------------------- self.get_permissions() # ------- # Перевод # ------- if settings.IS_DOMAINS: self.domains = get_domains() self.context['domains'] = self.domains
def dynamic_portfolio(request): cache_time = 300 cache_var = '%s_dynamic_portfolio' % (settings.PROJECT_NAME, ) domains = get_domains() domain = get_domain(request, domains) if domain: cache_var += '_%s' % domain['pk'] inCache = cache.get(cache_var) if inCache and not request.GET.get('force_new'): return inCache # Вытаскиваем менюшку portfolio portfolio_menu = Blocks.objects.filter(tag='portfolio', link='/portfolio/', state=4).first() if not portfolio_menu: return {} parents = '%s_%s' % (portfolio_menu.parents, portfolio_menu.id) all_blocks = Blocks.objects.filter(state=4, is_active=True).filter( Q(parents=parents) | Q(parents__startswith='%s_' % parents)) all_blocks = [ block for block in all_blocks if not block.link == '/portfolio/' ] if domain: domains = [domain] get_translate(all_blocks, domains) translate_rows(all_blocks, domain) menu_queryset = [] recursive_fill(all_blocks, menu_queryset, parents) blocks = sort_voca(menu_queryset) # К каждому блоку надо достать описание по сссылке descriptions = [] # К каждому блоку надо достать кол-во фоток # привязанных к подблокам, и из каждого подблока # первую фотку надо еще и выводить for block in blocks: if not hasattr(block, 'sub'): continue block.count = 0 block.images = [] ids_subblocks = {subblock.id: subblock.link for subblock in block.sub} # Для описания надо узнать какая стат.страничка # ссылается на subblock.link и взять от нее описание #related_by_link = Blocks.objects.filter(container__state=3, link__in=ids_subblocks.values()) related_by_link = [] related_containers = block.linkcontainer_set.select_related( 'container').all() if related_containers: related_by_link = related_containers[ 0].container.blocks_set.filter(link__in=ids_subblocks.values()) ids_desc = {related.link: related for related in related_by_link} # К каждому subblock надо докинуть описалово, чтобы получить его в картинках desc_arr = {} subblock_sorting = [] for subblock in block.sub: subblock_sorting.append(subblock.id) if subblock.link in ids_desc: desc_block = ids_desc[subblock.link] descriptions.append(desc_block) desc_arr[subblock.id] = desc_block links = LinkContainer.objects.filter( block__in=ids_subblocks.keys()).values('container', 'block') ids_links = { link['container']: { 'block_id': link['block'], 'position': subblock_sorting.index(link['block']), } for link in links } imgas = Blocks.objects.filter(container__in=ids_links.keys(), img__isnull=False).order_by('position') block.count += len(links) analogs = [] for imga in imgas: if imga.container_id in analogs: continue if imga.container_id in ids_links: block_id = ids_links[imga.container_id]['block_id'] # Нашли block_id надо взять его описание для этой фотки if block_id in desc_arr: imga.custom_block = desc_arr[block_id] imga.custom_pos = ids_links[imga.container_id]['position'] analogs.append(imga.container_id) block.images.append(imga) # Правильная сортировка изображений так как они в админке block.images.sort(key=lambda x: x.custom_pos if hasattr(x, 'custom_pos') else 0, reverse=True) # Перевод описаний вытащенных по ссылкам if domain: domains = [domain] get_translate(descriptions, domains) translate_rows(descriptions, domain) main_block = Blocks(name='All', title=blocks[0].title, class_name=blocks[0].class_name) main_block.images = [] main_block.count = 0 max_size = max([len(block.images) for block in blocks]) for i in range(max_size): for block in blocks: if len(block.images) > i: main_block.images.append(block.images[-(i + 1)]) main_block.count += 1 blocks.insert(0, main_block) result = { 'blocks': blocks, } cache.set(cache_var, result, cache_time) return result