Example #1
0
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)
Example #2
0
    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)
Example #3
0
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
Example #4
0
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
Example #5
0
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)
Example #6
0
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)
Example #7
0
 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
Example #8
0
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