готов список новостей на главной странице

This commit is contained in:
erjemin
2021-08-14 20:34:28 +03:00
parent ce10b8528f
commit b91c535b36
11 changed files with 403 additions and 15 deletions

View File

@@ -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

View File

@@ -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)

View 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 }} &nbsp; <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 }} &nbsp; <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><!-- ОБЛАКО ТЕГОВ: НАЧАЛО -->

View File

@@ -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>&#8199;Главная</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 %} &mdash; {{ 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> &nbsp; &#8198; {% 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 }}">Читать дальше &rarr;</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">

View File

@@ -36,4 +36,4 @@ def safe_html_special_symbols(s: str) -> str:
result = result.replace('&#8470;', '')
result = result.replace('<br />', ' ')
result = result.replace('<br>', ' ')
return result
return result

View File

@@ -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:

View 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)

View File

@@ -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)