навигация по тегам

This commit is contained in:
erjemin
2021-08-26 15:54:27 +03:00
parent 83fc27b8ce
commit 004171f7cc
7 changed files with 102 additions and 39 deletions

View File

@@ -24,6 +24,8 @@ urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', views.index),
url(r'^p(?P<ppage>\d*)$', views.index),
url(r'^tag_(?P<slug_tags>[^/]*)$', views.index),
url(r'^tag_(?P<slug_tags>[^/]*)[^/]*/p(?P<ppage>\d*)$', views.index),
url(r'^publication/32-hardware/(?P<content_id>\d*)-\S*$', views.redirect_item),
url(r'^publication/39-interview/(?P<content_id>\d*)-\S*$', views.redirect_item),
@@ -40,6 +42,7 @@ urlpatterns = [
url(r'^aboutcadpoint.html/(?P<content_id>\d*)-\S*$', views.redirect_item),
url(r'^item/(?P<content_id>\d*)-\S*$', views.show_item),
url(r'^sitemap.xml$', views.sitemap),
]

View File

@@ -16,23 +16,19 @@
------------
Необязательные параметры:
TAGS_L -- лист из слагов (slug), которые должны быть помечены как активные.
ACTIVE_TAG_ID -- id тега, который должен быть помечен как активный.
HIDEN_TAG_ID -- id тега, который надо "погасить" и не отображать в облаке.
SEC -- ID таблицы tbSection для работы облака тегов при включеном фильтре по Разделам
CAT -- ID таблицы tbCategories для работы облака тегов при включеном фильтре Категорий
{% endcomment %}<!-- ОБЛАКО ТЕГОВ: НАЧАЛО -->
<p class="tags">{% for I in TAGS_IN_PAGE %}{% if I.id != HIDEN_TAG_ID %}{% if I.NumInPage > 0%}
<a href="/tag_{{ I.slug|lower }}" class="tag-active{% if I.slug == ACTIVE_TAG_SLUG %}-current{% endif %}">
{% endcomment %}{% load slug_ru %}<!-- ОБЛАКО ТЕГОВ: НАЧАЛО -->
<p class="tags">{% for I in TAGS_IN_PAGE %}{% if I.NumInPage > 0 %}{% if I.slug in TAGS_L %}
<a href="{{ TAGS_S|rm_tag:I.slug }}" class="tag-active-current">
{{ I.name }} &nbsp; <span class="tag-note"><sup><b>{{ I.NumInPage }}</b></sup>/<sub>{{ I.NumTotal }}</sub></span>
</a>{% else %}
<a href="{% if TAGS_L %}{{ TAGS_S }}_{% else %}/tag_{% endif %}{{ I.slug|lower }}" class="tag-active">
{{ I.name }} &nbsp; <span class="tag-note"><sup><b>{{ I.NumInPage }}</b></sup>/<sub>{{ I.NumTotal }}</sub></span>
</a>{% endif %}{% else %}
<a href="/tag_{{ I.slug|lower }}" class="tag-not-active">
{{ I.name }} &nbsp; <span class="tag-note"><sup><b>{{ I.NumInPage }}</b></sup>/<sub>{{ I.NumTotal }}</sub></span>
</a>{% endif %}{% endif %}{% endfor %}{% if ACTIVE_TAG_SLUG %}
</a>{% endif %}{% endfor %}{% if TAGS_L %}
<span class="label label-primary"><a href="?"><b class="glyphicon glyphicon-remove"></b></a></span>
{% endif %}
</p><!-- ОБЛАКО ТЕГОВ: НАЧАЛО -->

View File

@@ -77,17 +77,17 @@
{% if PAGE_OF_LIST == 0 %}<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1" aria-disabled="true"><i class="bi bi-arrow-left px-2" title="Назад"></i>&nbsp;1</a>
</li>{% else %}<li class="page-item">
<a class="page-link" href="/p0"><i class="bi bi-arrow-left px-2" title="Назад"></i>&nbsp;1</a>
<a class="page-link" href="{% if TAGS_L %}{{ TAGS_S }}{% endif %}/p0"><i class="bi bi-arrow-left px-2" title="Назад"></i>&nbsp;1</a>
</li>
{% endif %}{% if PAGE_OF_LIST|add:'-3' > 0 and PAGE_OF_LIST|add:'-2' <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="/p{{ PAGE_OF_LIST|add:'-3' }}">&hellip;</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'-2' > 0 and PAGE_OF_LIST|add:'-1' <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="/p{{ PAGE_OF_LIST|add:'-2' }}">{{ PAGE_OF_LIST|add:'-1' }}</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'-1' > 0 and PAGE_OF_LIST <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="/p{{ PAGE_OF_LIST|add:'-1' }}">{{ PAGE_OF_LIST }}</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'-3' > 0 and PAGE_OF_LIST|add:'-2' <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="{% if TAGS_L %}{{ TAGS_S }}{% endif %}/p{{ PAGE_OF_LIST|add:'-3' }}">&hellip;</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'-2' > 0 and PAGE_OF_LIST|add:'-1' <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="{% if TAGS_L %}{{ TAGS_S }}{% endif %}/p{{ PAGE_OF_LIST|add:'-2' }}">{{ PAGE_OF_LIST|add:'-1' }}</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'-1' > 0 and PAGE_OF_LIST <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="{% if TAGS_L %}{{ TAGS_S }}{% endif %}/p{{ PAGE_OF_LIST|add:'-1' }}">{{ PAGE_OF_LIST }}</a></li>
{% endif %}{% if PAGE_OF_LIST != 0 and PAGE_OF_LIST != TOTAL_PAGE %}<li class="page-item disabled"><a class="page-link" href="#" aria-disabled="true">{{ PAGE_OF_LIST|add:'1' }}</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'1' > 0 and PAGE_OF_LIST|add:'2' <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="/p{{ PAGE_OF_LIST|add:'1' }}">{{ PAGE_OF_LIST|add:'2' }}</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'2' > 0 and PAGE_OF_LIST|add:'3' <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="/p{{ PAGE_OF_LIST|add:'2' }}">{{ PAGE_OF_LIST|add:'3' }}</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'3' > 0 and PAGE_OF_LIST|add:'4' <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="/p{{ PAGE_OF_LIST|add:'3' }}">&hellip;</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'1' > 0 and PAGE_OF_LIST|add:'2' <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="{% if TAGS_L %}{{ TAGS_S }}{% endif %}/p{{ PAGE_OF_LIST|add:'1' }}">{{ PAGE_OF_LIST|add:'2' }}</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'2' > 0 and PAGE_OF_LIST|add:'3' <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="{% if TAGS_L %}{{ TAGS_S }}{% endif %}/p{{ PAGE_OF_LIST|add:'2' }}">{{ PAGE_OF_LIST|add:'3' }}</a></li>
{% endif %}{% if PAGE_OF_LIST|add:'3' > 0 and PAGE_OF_LIST|add:'4' <= TOTAL_PAGE %}<li class="page-item"><a class="page-link" href="{% if TAGS_L %}{{ TAGS_S }}{% endif %}/p{{ PAGE_OF_LIST|add:'3' }}">&hellip;</a></li>
{% endif %}{% if PAGE_OF_LIST < TOTAL_PAGE %}<li class="page-item">
<a class="page-link" href="/p{{ TOTAL_PAGE }}">{{ TOTAL_PAGE|add:'1' }}&nbsp;<i class="bi bi-arrow-right px-2" title="Дальше"></i></a>
<a class="page-link" href="{% if TAGS_L %}{{ TAGS_S }}{% endif %}/p{{ TOTAL_PAGE }}">{{ TOTAL_PAGE|add:'1' }}&nbsp;<i class="bi bi-arrow-right px-2" title="Дальше"></i></a>
</li>{% else %}<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1" aria-disabled="true">{{ TOTAL_PAGE|add:'1' }}&nbsp;<i class="bi bi-arrow-right px-2" title="Дальше"></i></a>
</li>{% endif %}

View File

@@ -58,7 +58,7 @@
{{ ITEM.szContentBody|safe }}
{{ ITEM.szPointDes|safe }}{# Текст страницы или приамбула перед списком #}
<hr />
<nav class="sm-tags">{% for t in ITEM.tags.all%}<a href="/tag_{{ t.slug|lower }}"><i class="bi bi-tag"></i> {{ t.name }}</a> &nbsp; &#8198; {% endfor %}</nav>
<nav class="sm-tags">{% for t in ITEM.tags.all%}<a href="/tag_{{ t.slug|lower }}"><i class="bi bi-tag"></i> {{ t.name|lower }}</a> &nbsp; &#8198; {% endfor %}</nav>
</div>
{#<!-- БОКОВАЯ НАВИГАЦИЯ: НАЧАЛО-->#}<nav class="col order-last order-md-first">
<div></div>{% for i in ITEMS_BEFORE reversed %}{% if i.id != ITEM.id %}<div>
@@ -83,9 +83,4 @@
</ul>
</nav>{# <!-- НИЖНЯЯ НАВИГАЦИЯ-ПАДЖИНАТОР ПО НОВОСТЯМ: КОНЕЦ--> #}{% endif %}
</div>{#<!-- POINT-СРАНИЦА: КОНЕЦ -->#}
{% endblock %}
{% block Top_JS1 %}<script type="text/javascript">
</script>{% endblock %}

View File

@@ -8,6 +8,12 @@ register = template.Library()
@register.filter
def slug_ru(value: str, arg: int) -> str:
""" ДЕЛАЕТ СЛАГ (slug) ИЗ РУССКОЯЗЫЧНОЙ СТРОКИ
:param value: получает русскоязычную (любую) строку
:param arg: сколько символов оставить (остальные обрежет)
:return: value: возвращает слугофицированную строку в нижнем регистре
"""
try:
arg = int(arg)
return pytils.translit.slugify(str(value).lower())[:int(arg)]
@@ -18,3 +24,20 @@ def slug_ru(value: str, arg: int) -> str:
@register.filter
def safe_html_ss(value: str) -> str:
return safe_html_special_symbols(value)
@register.filter
def rm_tag(value: str, arg: str = "") -> str:
""" УДАЛЯТЕЛЬ ТЕГОВ
:param value: получает строку типа "/tag_slug-1_slug-2_slug-A_slug-NN" (разделитель "_")
:param arg: слаг (slug) тега, который надо удалить, например "slug-2"
:return: value: возвращает строку "/tag_slug-1_slug-A_slug-NN"
"""
value = value.replace(arg, "")
value = value.replace("__", "_")
if value == "/tag_":
return "/"
if value[-1] == "_":
return value[0:-1]
return value

View File

@@ -33,11 +33,13 @@ def handler500(request) -> render:
def index(request,
slug_tags: str = "",
ppage: int = 0) -> render:
""" Главная страница
:param request:
:param ppage: текущая страница ленты
:param slug_tags: текущие slug-таги, разделитель "_" (в формате tag-1_tag-2_tag-eshe-odin
:return: response:
"""
template = "index.jinja2" # шаблон
@@ -46,12 +48,56 @@ def index(request,
# query.add(Q(tdContentPublishDown__gt=timezone.now()), Q.OR)
# query.add(Q(bContentPublish=True), Q.AND)
# q_content = TbContent.objects.filter(query)[:5]
query = "SELECT web_tbcontent.* FROM web_tbcontent " \
"WHERE (web_tbcontent.tdContentPublishDown IS NULL" \
" OR web_tbcontent.tdContentPublishDown > NOW())" \
" AND web_tbcontent.bContentPublish " \
"ORDER BY web_tbcontent.tdContentPublishUp DESC " \
"LIMIT 7 OFFSET %d" % (int(ppage) * 7, )
if slug_tags == "":
query = "SELECT web_tbcontent.* FROM web_tbcontent " \
"WHERE (web_tbcontent.tdContentPublishDown IS NULL" \
" OR web_tbcontent.tdContentPublishDown > NOW())" \
" AND web_tbcontent.tdContentPublishUp <= NOW() " \
" AND web_tbcontent.bContentPublish " \
"ORDER BY web_tbcontent.tdContentPublishUp DESC " \
"LIMIT 7 OFFSET %d" % (int(ppage) * 7, )
query_count = "SELECT 1 AS id," \
" COUNT(web_tbcontent.id) AS tot_item " \
"FROM web_tbcontent " \
"WHERE (web_tbcontent.tdContentPublishDown IS NULL" \
" OR web_tbcontent.tdContentPublishDown > NOW())" \
" AND web_tbcontent.tdContentPublishUp <= NOW()" \
" AND web_tbcontent.bContentPublish"
else:
l_tags = slug_tags.split("_")
s_tags = slug_tags.replace("_", "\', \'")
query = "SELECT web_tbcontent.* FROM taggit_taggeditem" \
" INNER JOIN taggit_tag" \
" ON taggit_taggeditem.tag_id = taggit_tag.id" \
" AND taggit_taggeditem.content_type_id = 21" \
" AND taggit_tag.slug IN ('%s')" \
" RIGHT OUTER JOIN web_tbcontent" \
" ON web_tbcontent.id = taggit_taggeditem.object_id " \
"WHERE (web_tbcontent.tdContentPublishDown IS NULL" \
" OR web_tbcontent.tdContentPublishDown > NOW())" \
" AND web_tbcontent.tdContentPublishUp <= NOW() " \
" AND web_tbcontent.bContentPublish " \
"GROUP BY web_tbcontent.szContentHead " \
"HAVING COUNT(DISTINCT taggit_tag.id) = %d " \
"ORDER BY web_tbcontent.tdContentPublishUp DESC " \
"LIMIT 7 OFFSET %d" % (s_tags, len(l_tags), int(ppage) * 7)
query_count = "SELECT 1 AS id," \
" COUNT(SubQuery.id) AS tot_item " \
"FROM (SELECT web_tbcontent.id" \
" FROM taggit_taggeditem" \
" INNER JOIN taggit_tag" \
" ON taggit_taggeditem.tag_id = taggit_tag.id" \
" AND taggit_taggeditem.content_type_id = 21" \
" AND taggit_tag.slug IN ('%s')" \
" RIGHT OUTER JOIN web_tbcontent" \
" ON web_tbcontent.id = taggit_taggeditem.object_id" \
" WHERE (web_tbcontent.tdContentPublishDown IS NULL" \
" OR web_tbcontent.tdContentPublishDown > NOW())" \
" AND web_tbcontent.tdContentPublishUp <= NOW()" \
" AND web_tbcontent.bContentPublish" \
" GROUP BY web_tbcontent.id" \
" HAVING COUNT(DISTINCT taggit_tag.id) = %d) SubQuery" % (s_tags, len(l_tags))
to_template.update({"TAGS_S": "/tag_" + slug_tags, "TAGS_L": l_tags})
q_content = TbContent.objects.raw(query)
q_tags = TbContent.objects.raw("SELECT DISTINCT tTotalInfo.*,"
" IF (tPageInfo.NumInPage IS UNKNOWN, 0, tPageInfo.NumInPage) AS NumInPage "
@@ -79,12 +125,6 @@ def index(request,
"tTotalInfo.name LIMIT 20" % (query,))
to_template.update({"LENTA": q_content, "TAGS_IN_PAGE": q_tags})
to_template.update({"PAGE_OF_LIST": int(ppage)})
query_count = "SELECT 1 AS id," \
" COUNT(web_tbcontent.id) AS tot_item " \
"FROM web_tbcontent " \
"WHERE (web_tbcontent.tdContentPublishDown IS NULL" \
" OR web_tbcontent.tdContentPublishDown > NOW())" \
" AND web_tbcontent.bContentPublish"
q_count = TbContent.objects.raw(query_count)
# print("--", (q_count[0].tot_item - 1) // 7, q_count[0].tot_item)
to_template.update({"TOTAL_PAGE": (q_count[0].tot_item - 1) // 7})