готов список новостей на главной странице
This commit is contained in:
@@ -64,6 +64,7 @@ INSTALLED_APPS = [
|
||||
# # 'ckeditor_uploader',
|
||||
'ckeditor',
|
||||
'taggit.apps.TaggitAppConfig',
|
||||
# 'fontawesome-free'
|
||||
'web.apps.WebConfig',
|
||||
]
|
||||
|
||||
@@ -215,7 +216,13 @@ if DEBUG: # DEBUG: заменяем настройки прода, на на
|
||||
# 'OPTIONS': { 'autocommit': True, }
|
||||
}
|
||||
}
|
||||
|
||||
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware', ]
|
||||
INSTALLED_APPS += ['debug_toolbar', ]
|
||||
INTERNAL_IPS = ['127.0.0.1', '192.168.1.30']
|
||||
# this is the main reason for not showing up the toolbar
|
||||
import mimetypes
|
||||
mimetypes.add_type("application/javascript", ".js", True)
|
||||
DEBUG_TOOLBAR_CONFIG = {'INTERCEPT_REDIRECTS': False, }
|
||||
else:
|
||||
MEDIA_ROOT = MY_MEDIA_ROOT_PROD
|
||||
STATIC_ROOT = MY_STATIC_ROOT_PROD
|
||||
|
||||
@@ -14,16 +14,20 @@ Including another URLconf
|
||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import path
|
||||
from django.conf.urls.static import static
|
||||
from django.conf.urls import url
|
||||
from django.urls import path, include
|
||||
from cadpoint import settings
|
||||
from django.conf.urls import url, include
|
||||
from web import views
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
|
||||
# /publication/32-hardware/
|
||||
# /news/3-newsflash/
|
||||
# /news/1-latest-news/
|
||||
# /runet-cad/37-runet-cad/
|
||||
# /video/
|
||||
# /aboutcadpoint.html
|
||||
url(r'^$', views.index),
|
||||
]
|
||||
|
||||
@@ -31,5 +35,7 @@ handler404 = 'web.views.handler404'
|
||||
handler500 = 'web.views.handler500'
|
||||
|
||||
if settings.DEBUG:
|
||||
import debug_toolbar
|
||||
urlpatterns = [path('__debug__/', include(debug_toolbar.urls)), ] + urlpatterns
|
||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
|
||||
# urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
||||
|
||||
38
cadpoint/templates/blocks/tags-cloud.jinja2
Normal file
38
cadpoint/templates/blocks/tags-cloud.jinja2
Normal file
@@ -0,0 +1,38 @@
|
||||
{% comment %}Django шаблон
|
||||
Облако тегов (меток) -- выводит ярлыки-теги для страницы с листингом инфоюнитов. На ярлыках с метками
|
||||
помечается число их вхождений на текущей странице и общее число вхождений в базу.
|
||||
|
||||
-------------
|
||||
Требует обязательного наличия параметров во сходящем словаре:
|
||||
|
||||
TAGS_IN_PAGE -- QuerySet из записей таблицы taggit_taggeditem батарейки Django-Taggit или список словарей
|
||||
с тегами-метками. Ключи словаря:
|
||||
id -- taggit_taggeditem.id
|
||||
slug -- taggit_taggeditem.slug
|
||||
name -- taggit_taggeditem.name
|
||||
NumInPage -- число вхождений тега-метки на текущей странице
|
||||
NumTotal -- общее число вхождений тега-метки
|
||||
|
||||
------------
|
||||
Необязательные параметры:
|
||||
|
||||
|
||||
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 %}">
|
||||
{{ I.name }} <span class="tag-note"><sup><b>{{ I.NumInPage }}</b></sup>/<sub>{{ I.NumTotal }}</sub></span>
|
||||
</a>{% else %}
|
||||
<a href="/tag_{{ I.slug|lower }}" class="tag-not-active">
|
||||
{{ I.name }} <span class="tag-note"><sup><b>{{ I.NumInPage }}</b></sup>/<sub>{{ I.NumTotal }}</sub></span>
|
||||
</a>{% endif %}{% endif %}{% endfor %}{% if ACTIVE_TAG_SLUG %}
|
||||
<span class="label label-primary"><a href="?"><b class="glyphicon glyphicon-remove"></b></a></span>
|
||||
{% endif %}
|
||||
</p><!-- ОБЛАКО ТЕГОВ: НАЧАЛО -->
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.jinja2" %}{% load static %}
|
||||
{% extends "base.jinja2" %}{% load static %}{% load thumbnail %}{% load slug_ru %}
|
||||
|
||||
{% block META_OG %}{% comment %} РАЗМЕТКА Open Graph ДЛЯ СОЦ-СЕТЕЙ
|
||||
подробности: https://habr.com/ru/company/macloud/blog/555082/{% endcomment %}
|
||||
@@ -29,11 +29,62 @@
|
||||
|
||||
<!--- ТИТУЛ --->
|
||||
{% block Title %}Главная страница{% endblock %}
|
||||
{% block canonical %}https://rsvo.ru/{{ ITEM.iPointType }}/{{ ITEM.szPointSlug }}{% if LIST and PAGE_OF_LIST != 0 %}/p{{ PAGE_OF_LIST }}{% endif %}{% endblock %}
|
||||
{% block Description %}ФГУП Российские сети вещания и оповещения: Строительство и эксплуатация разноуровневых систем оповещения{% endblock %}
|
||||
{% block Keywords %}ФГУП РСВО, российские сети вещания и оповещения, системы оповещения{% endblock %}
|
||||
{% block Date4Meta %}{{ NEWS.0.tdContentPublishStart|date:'Y-m-d 08:30:00' }}{% endblock %}"
|
||||
{% block Last4Meta %}{{ NEWS.0.dtContentTimeStamp|date:'Y-m-d H:i:s' }}{% endblock %}"
|
||||
{% block Expires4Meta %}{% now 'Y-m-d H:i:s' %}{% endblock %}"
|
||||
|
||||
|
||||
{% block CONTENT %}{# <!-- ХЛЕБНЫЕ КРОШКИ: НАЧАЛО -->#}
|
||||
<div class="container bread-crumb">
|
||||
<div class="row">
|
||||
<nav class="col-12 х" aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item nw s"><a href="/"><i class="bi bi-house-door" title="Главная"></i> Главная</a></li>{% if FIRST %}
|
||||
<li class="breadcrumb-item nw s"><a href="/{{ ITEM.iPointType }}/">{{ ITEM.get_iPointType_display }}</a></li>{% if TEMPLATE_CONTENT and not HIDE_PAGE %}
|
||||
<li class="breadcrumb-item nw s"><a href="/{{ ITEM.iPointType }}/{{ ITEMnakamichi.szPointSlug }}">{{ ITEM.szPointHead|safe }}</a></li>
|
||||
<li class="breadcrumb-item active nw s" aria-current="page">Стр. {{ PAGE_OF_LIST|add:"1" }} ({% for i in LIST reversed %}{% if forloop.first %}{{ i.tdContentPublishStart|date:'d F Y' }}{% endif %}{% if forloop.last %} — {{ i.tdContentPublishStart|date:'d F Y' }}{% endif %}{% endfor %})</li>{% else %}
|
||||
<li class="breadcrumb-item active nw s" aria-current="page">{{ ITEM.szPointHead|safe }}</li>{% endif %}{% endif %}
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>{#<!-- ХЛЕБНЫЕ КРОШКИ: КОНЕЦ -->#}
|
||||
{#<!-- POINT-СРАНИЦА: НАЧАЛО -->#}<div class="container lenta">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-9">
|
||||
{% for i in LENTA %}<div class="row default-list">
|
||||
<div class="col-md-4 d-none d-md-block{% if forloop.counter|divisibleby:2 %} order-last{% endif %}">
|
||||
<a href="/news/1-latest-news/{{ i.id }}-{{ i.szContentHead|safe_html_ss|slug_ru:'50' }}?p={{ PAGE_OF_LIST }}&n={{ forloop.counter }}">{% if i.imgContentPreview is None %}
|
||||
<img src="{% static 'img/og-cadpoint-default.png' %}"
|
||||
alt="{{ i.szContentHead|safe_html_ss }}"
|
||||
title="{{ i.szContentHead|safe_html_ss }}" />{% else %}
|
||||
<img srcset="{% thumbnail i.imgContentPreview 340x340 upscale %} 640w, {% thumbnail i.imgContentPreview 680x680 upscale %} 1200w"
|
||||
sizes="(min-width: 1024px) 1200px, (min-width: 320px) 640px, 100vw"
|
||||
src="{% thumbnail i.imgContentPreview 680x680 upscale %}"
|
||||
alt="{{ i.szContentHead|safe_html_ss }}"
|
||||
title="{{ i.szContentHead|safe_html_ss }}" />{% endif %}</a>
|
||||
</div>
|
||||
<div class="col-12 col-md-8">
|
||||
<time datetime="{{ i.tdContentPublishUp|date:'Y-m-d' }}">{{ i.tdContentPublishUp|date:'d E Y' }} <small>({{ i.tdContentPublishUp|date:'l'|lower }})</small></time>
|
||||
<h3><a href="/news/1-latest-news/{{ i.id }}-{{ i.szContentHead|safe_html_ss|slug_ru:"50" }}?p={{ PAGE_OF_LIST }}&n={{ forloop.counter }}">{{ i.szContentHead|safe }}</a></h3>
|
||||
<nav class="sm-tags">{% for t in i.tags.all%}<a href="/tag_{{ t.slug|lower }}"><i class="bi bi-tag"></i> {{ t.name }}</a>   {% endfor %}</nav>
|
||||
{{ i.szContentIntro|safe }}
|
||||
<p class="next"><a href="item/{{ i.id }}-{{ i.szContentHead|safe_html_ss|slug_ru:'50' }}?p={{ PAGE_OF_LIST }}&n={{ forloop.counter }}">Читать дальше →</a></p>
|
||||
</div>
|
||||
</div>{% endfor %}
|
||||
|
||||
|
||||
</div>
|
||||
{#<!-- БОКОВАЯ НАВИГАЦИЯ: НАЧАЛО-->#}<nav class="col order-last order-md-first l-menu">
|
||||
<h6>Теги текущей страницы:</h6>
|
||||
{% include "blocks/tags-cloud.jinja2" %}
|
||||
</nav>{#<!-- боковая навигация: конец-->#}
|
||||
</div>
|
||||
</div>{#<!-- POINT-СРАНИЦА: КОНЕЦ -->#}
|
||||
|
||||
|
||||
{% block CONTENT %}
|
||||
<h1><br /><br /><br /><br /><br /><br /><br /><br />ЛЯ-ЛЯ</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block Top_JS1 %}<script type="text/javascript">
|
||||
|
||||
@@ -36,4 +36,4 @@ def safe_html_special_symbols(s: str) -> str:
|
||||
result = result.replace('№', '№')
|
||||
result = result.replace('<br />', ' ')
|
||||
result = result.replace('<br>', ' ')
|
||||
return result
|
||||
return result
|
||||
|
||||
@@ -68,7 +68,7 @@ class TbContent(models.Model):
|
||||
help_text=u"Дата публикации, с её момента новость появится на сайте."
|
||||
)
|
||||
tdContentPublishDown = models.DateTimeField(
|
||||
db_index=True, null=True, blank=True, # default=datetime.datetime(2035, 12, 31, 23, 59, 59, 0), # default=0,
|
||||
db_index=True, null=True, blank=True, # default=datetime.datetime(2035, 12, 31, 23, 59, 59, 0), # default=0,
|
||||
verbose_name="Окончания публикации",
|
||||
help_text=u"Дата окончания публикации, с её момента новость исчезнет с сайта."
|
||||
)
|
||||
@@ -165,7 +165,7 @@ class TbContent(models.Model):
|
||||
def save(self, *args, **kwargs):
|
||||
# переопределяем метод save() чтобы "проверуть" тексты через типографы...
|
||||
if self.szContentSlug is None or self.szContentSlug == "" or " " in self.szContentSlug:
|
||||
print("ку-ку", self.szContentHead)
|
||||
# print("ку-ку", self.szContentHead)
|
||||
result_slug = pytils.translit.slugify(
|
||||
safe_html_special_symbols(self.szContentHead)).lower()
|
||||
while TbContent.objects.filter(szContentSlug=result_slug).count() != 0:
|
||||
|
||||
20
cadpoint/web/templatetags/slug_ru.py
Normal file
20
cadpoint/web/templatetags/slug_ru.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from django import template
|
||||
from web.add_function import safe_html_special_symbols
|
||||
import pytils
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@register.filter
|
||||
def slug_ru(value: str, arg: int) -> str:
|
||||
try:
|
||||
arg = int(arg)
|
||||
return pytils.translit.slugify(str(value).lower())[:int(arg)]
|
||||
except ValueError:
|
||||
return pytils.translit.slugify(str(value).lower())
|
||||
|
||||
|
||||
@register.filter
|
||||
def safe_html_ss(value: str) -> str:
|
||||
return safe_html_special_symbols(value)
|
||||
@@ -1,6 +1,11 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from django.shortcuts import render
|
||||
from django.db.models import Q
|
||||
from datetime import datetime
|
||||
from django.utils import timezone
|
||||
from web.models import TbContent
|
||||
from web.add_function import *
|
||||
import pytz
|
||||
|
||||
# Create your views here.
|
||||
def handler404(request, exception: str) -> render:
|
||||
@@ -34,4 +39,40 @@ def index(request) -> render:
|
||||
"""
|
||||
template = "index.jinja2" # шаблон
|
||||
to_template = {"COOKIES": check_cookies(request)}
|
||||
# query = Q(tdContentPublishDown__isnull=True)
|
||||
# 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 5 OFFSET 0"
|
||||
q_content = TbContent.objects.raw(query)
|
||||
q_tags = TbContent.objects.raw("SELECT DISTINCT tTotalInfo.*,"
|
||||
" IF (tPageInfo.NumInPage IS UNKNOWN, 0, tPageInfo.NumInPage) AS NumInPage "
|
||||
"FROM (SELECT DISTINCT taggit_tag.id, COUNT(tPage.id) AS NumInPage "
|
||||
" FROM taggit_taggeditem"
|
||||
" INNER JOIN taggit_tag"
|
||||
" ON taggit_taggeditem.tag_id = taggit_tag.id"
|
||||
" INNER JOIN (%s) tPage"
|
||||
" ON taggit_taggeditem.object_id = tPage.id"
|
||||
" GROUP BY taggit_tag.id) tPageInfo"
|
||||
" RIGHT OUTER JOIN (SELECT DISTINCT"
|
||||
" taggit_tag.*,"
|
||||
" COUNT(web_tbcontent.id) AS NumTotal"
|
||||
" FROM taggit_taggeditem"
|
||||
" INNER JOIN taggit_tag"
|
||||
" ON taggit_taggeditem.tag_id = taggit_tag.id"
|
||||
" INNER JOIN web_tbcontent"
|
||||
" ON taggit_taggeditem.object_id = web_tbcontent.id"
|
||||
" GROUP BY taggit_tag.id, taggit_tag.name, taggit_tag.slug) tTotalInfo"
|
||||
" ON tPageInfo.id = tTotalInfo.id"
|
||||
" GROUP BY tPageInfo.id, tPageInfo.NumInPage,"
|
||||
" tTotalInfo.id, tTotalInfo.NumTotal,"
|
||||
" tTotalInfo.name, tTotalInfo.slug "
|
||||
"ORDER BY tPageInfo.NumInPage DESC, tTotalInfo.name,"
|
||||
" tTotalInfo.NumTotal DESC" % (query,))
|
||||
to_template.update({"LENTA": q_content, "TAGS_IN_PAGE": q_tags})
|
||||
return render(request, template, to_template)
|
||||
|
||||
Reference in New Issue
Block a user