Все работает (даже на хостинге)

This commit is contained in:
Sergei Erjemin (Сергей Еремин)
2020-11-02 23:25:16 +03:00
commit fe29b6136f
48 changed files with 1606 additions and 0 deletions

0
dicquo/web/__init__.py Normal file
View File

66
dicquo/web/admin.py Normal file
View File

@@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
from django.contrib import admin
from web.models import TbDictumAndQuotes, TbAuthor, TbImages, TbOrigin
# Register your models here.
class AdmDictumAndQuotesAdmin(admin.ModelAdmin):
search_fields = ['id', 'szIntro', 'szContent', ]
list_display = ('id', 'szIntro', 'szContent', 'tag_list', 'iViewCounter', 'dtEdited', )
list_display_links = ('id', 'szIntro', 'szContent', )
# list_filter = ('iViewCounter', )
empty_value_display = u"<b style='color:red;'>-empty-</b>"
actions_on_top = False
actions_on_bottom = True
actions_selection_counter = True
# погасить кнопку "Добавить" в интерфейсе админки
# def has_add_permission(self, request):
# return False
# fieldsets = (
# (None, {'fields': ('szIntro', 'iViewCounter', 'tags',)}),
# )
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related('tags')
def tag_list(self, obj):
return u", ".join(o.name for o in obj.tags.all())
class AdmOrigin(admin.ModelAdmin):
search_fields = ['id', 'szOrigin', ]
list_display = ('id', 'szOrigin',)
list_display_links = ('id', 'szOrigin',)
empty_value_display = u"<b style='color:red;'>-empty-</b>"
class AdmImages(admin.ModelAdmin):
search_fields = ['id', 'imFile', 'szCaption', ]
list_display = ('id', 'szCaption', 'tag_list', 'iViewCounter', 'imFile', 'dtEdited',)
list_display_links = ('id', 'szCaption')
empty_value_display = u"<b style='color:red;'>-empty-</b>"
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related('tags')
def tag_list(self, obj):
return u", ".join(o.name for o in obj.tags.all())
class AdmAuthor(admin.ModelAdmin):
search_fields = ['id', 'szAuthor', 'szCaption', ]
list_display = ('id', 'szAuthor', 'tag_list', 'iViewCounter', 'dtEdited',)
list_display_links = ('id', 'szAuthor')
empty_value_display = u"<b style='color:red;'>-empty-</b>"
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related('tags')
def tag_list(self, obj):
return u", ".join(o.name for o in obj.tags.all())
admin.site.register(TbDictumAndQuotes, AdmDictumAndQuotesAdmin)
admin.site.register(TbOrigin, AdmOrigin)
admin.site.register(TbImages, AdmImages)
admin.site.register(TbAuthor, AdmAuthor)

6
dicquo/web/apps.py Normal file
View File

@@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.apps import AppConfig
class WebConfig(AppConfig):
name = 'web'

View File

@@ -0,0 +1,90 @@
# Generated by Django 3.1.2 on 2020-10-05 06:52
from django.db import migrations, models
import django.db.models.deletion
import taggit.managers
class Migration(migrations.Migration):
initial = True
dependencies = [
('taggit', '0003_taggeditem_add_unique_index'),
]
operations = [
migrations.CreateModel(
name='TbAuthor',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('szAuthor', models.CharField(db_index=True, default='', help_text='Автор и, если необходимо, краткая справка', max_length=128, unique=True, verbose_name='Автор')),
('szAuthorHTML', models.TextField(default='', help_text='Автор и, если необходимо, краткая справка<br />Свертано в HTML по правилам типографики <small>(рекламные URL вставляются тут)</small>', null=True, verbose_name='Автор HTML')),
('bIsChecked', models.BooleanField(db_index=True, default=True, help_text='Есть доступ для сканирования.', verbose_name='Проверен')),
('iViewCounter', models.PositiveIntegerField(default=0, help_text='Число просмотров картинки.', verbose_name='Просмотры')),
('dtCreated', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Дата создания')),
('dtEdited', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Дата последнего редактирования')),
('tags', taggit.managers.TaggableManager(help_text='Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Теги')),
],
options={
'verbose_name': 'АВТОР',
'verbose_name_plural': 'АВТОРЫ',
'ordering': ['id'],
},
),
migrations.CreateModel(
name='TbOrigin',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('szOrigin', models.CharField(db_index=True, default='', help_text='Ссылка или указание источника: книга, URL, просто что-то…', max_length=256, unique=True, verbose_name='Источник')),
('dtCreated', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Дата создания')),
('dtEdited', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Дата последнего редактирования')),
],
options={
'verbose_name': 'ИСТОЧНИК',
'verbose_name_plural': 'ИСТОЧНИКИ',
'ordering': ['id'],
},
),
migrations.CreateModel(
name='TbImages',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('imFile', models.ImageField(db_index=True, default='', help_text='Файл с картинкой (gif, jpeg, png, bmp).', max_length=136, unique=True, upload_to='img2', verbose_name='Картинка')),
('szCaption', models.CharField(db_index=True, default='', help_text='Название, подпись, описание что изображено…', max_length=128, unique=True, verbose_name='Название')),
('bIsChecked', models.BooleanField(db_index=True, default=True, help_text='Есть доступ для сканирования.', verbose_name='Проверен')),
('iViewCounter', models.PositiveIntegerField(default=0, help_text='Число просмотров картинки.', verbose_name='Просмотры')),
('dtCreated', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Дата создания')),
('dtEdited', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Дата последнего редактирования')),
('tags', taggit.managers.TaggableManager(help_text='Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Теги')),
],
options={
'verbose_name': 'КАРТИНКА',
'verbose_name_plural': 'КАРТИНКИ',
'ordering': ['id'],
},
),
migrations.CreateModel(
name='TbDictumAndQuotes',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('szIntro', models.CharField(default=None, help_text='Не обязательно. Вступление перед цитатой.', max_length=256, null=True, verbose_name='Вступление')),
('szIntroHTML', models.TextField(default='', help_text='Автор и, если необходимо, краткая справка<br />Вступление перед цитатой, в HTML по правилам типографики</small>', verbose_name='Вступление HTML')),
('szContent', models.TextField(default='', help_text='Не обязательно. Вступление перед цитатой.', max_length=256, verbose_name='Высказывание')),
('szContentHTML', models.TextField(default='', help_text='<b>Высказывание Крылатое</b> -- крылатое, пародоксальное и все такое', verbose_name='Высказывание HTML')),
('imFileOG', models.ImageField(default='', help_text='Картинка для социальной сети <b>(будет создана автоматически)</b>.<br /><small>Файл с картинкой (png).<small>', max_length=136, upload_to='img2og', verbose_name='OG-image</b>')),
('iViewCounter', models.PositiveIntegerField(db_index=True, default=0, help_text='Число сканирований хоста.', verbose_name='Просмотры')),
('dtCreated', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Дата создания')),
('dtEdited', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Дата последнего редактирования')),
('kAuthor', models.ForeignKey(default=None, help_text='Автор изречения или цитаты <b>(не обязательно, но желательно)</b>', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='web.tbauthor', verbose_name='Автор')),
('kImages', models.ForeignKey(default=None, help_text='Ссылка на картинку, в табличке картинок <b>(не обязательно)</b><br /><small>если нужна именно данная картинка, а не выбранная автоматически</small>', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='web.tbimages', verbose_name='Картинка')),
('kOrigin', models.ForeignKey(default=None, help_text='Откуда взята циатата, высказывание, изречение <b>(не обязательно, но желательно)</b>', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='web.tborigin', verbose_name='Источник')),
('tags', taggit.managers.TaggableManager(help_text='Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Теги')),
],
options={
'verbose_name': 'ВЫСКАЗЫВАНИЕ',
'verbose_name_plural': 'ВЫСКАЗЫВАНИЯ',
'ordering': ['id'],
},
),
]

View File

416
dicquo/web/models.py Normal file
View File

@@ -0,0 +1,416 @@
# -*- coding: utf-8 -*-
from django.db import models
from taggit.managers import TaggableManager
from taggit.models import Tag, TaggedItem
from typus import en_typus, ru_typus
from pathlib import Path
import urllib3
import json
import pytils
# класс для транслитерации русскоязычных slug
# рецепт взят отсюда: https://timonweb.com/django/russian-slugs-for-django-taggit/
class RuTag(Tag):
class Meta:
proxy = True
def slugify(self, tag, i=None):
return pytils.translit.slugify(self.name.lower())[:128]
class RuTaggedItem(TaggedItem):
class Meta:
proxy = True
@classmethod
def tag_model(cls):
return RuTag
class TbImages(models.Model):
# ============================================================
# ТАБЛИЦА TbImages -- Изображения
# ------------------------------------------------------------
# | id -- id | INT(11) | PRIMARY KEY
# | imFile -- Картинка | varchar(128) NOT NULL
# | szCaption -- Заголовок, подпись под картинкой | varchar(136) NULL
# | bIsChecked -- Проверен | tinyint(1) NOT NULL
# | iViewCounter -- Просмотры | int(10) UNSIGNED NOT NULL
# | dtCreated -- Дата создания | datetime(6) NOT NULL
# | dtEdited -- Дата проверки | datetime(6) NOT NULL
# ============================================================
imFile = models.ImageField(
max_length=136,
upload_to="img2",
default=u"",
unique=True,
db_index=True,
verbose_name=u"Картинка",
help_text=u"Файл с картинкой (gif, jpeg, png, bmp)."
)
szCaption = models.CharField(
max_length=128,
default=u"",
unique=True,
db_index=True,
blank=False,
verbose_name=u"Название",
help_text=u"Название, подпись, описание что изображено…"
)
tags = TaggableManager(
blank=True,
through=RuTaggedItem,
verbose_name=u"Теги",
help_text=u"Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>"
)
bIsChecked = models.BooleanField(
default=True,
db_index=True,
verbose_name=u"Проверен",
help_text=u"Картинку проверили."
)
iViewCounter = models.PositiveIntegerField(
default=0,
verbose_name=u"",
help_text=u"Число просмотров картинки."
)
dtCreated = models.DateTimeField(
db_index=True,
auto_now_add=True, # надо указать False при миграции, после вернуть в True
auto_now=False, # надо указать False при миграции, после вернуть в True
# для выполнения миграций нужно добавлять default, а после убрать (она не нужна)
# default=datetime.datetime.now(pytz.timezone(settings.TIME_ZONE)),
verbose_name=u"Дата создания"
)
dtEdited = models.DateTimeField(
db_index=True,
auto_now=True, # надо указать False при миграции, после вернуть в True
# для выполнения миграций нужно добавлять default, а после она не нужна
# default=datetime.datetime.now(pytz.timezone(settings.TIME_ZONE)),
verbose_name=u"Дата редактирования"
)
def __str__(self):
filename = self.imFile.name
if len(filename) > 15:
filename = filename[:15] + u""
caption = self.szCaption
if len(caption) > 25:
caption = caption[:25] + u""
caption = "%d×%d - %s" % (self.imFile.width, self.imFile.height, caption)
return u"%05d: %s (%s)" % (self.id, filename, caption)
def __unicode__(self):
return self.__str__()
# заменим имя файла картинки
def save(self, *args, **kwargs):
self.imFile.name = pytils.translit.slugify(self.szCaption.lower()) + str(Path(self.imFile.name).suffixes)
super(TbImages, self).save(*args, **kwargs)
class Meta:
verbose_name = u"КАРТИНКА"
verbose_name_plural = u"КАРТИНКИ"
ordering = ['id', ]
class TbOrigin(models.Model):
# ============================================================
# ТАБЛИЦА TbOrigin -- Источник, место откуда взята циатата, высказывание, изречение
# ------------------------------------------------------------
# | id -- id | INT(11) | PRIMARY KEY
# | szOrigin -- Источник | varchar(256) NULL
# | dtCreated -- Дата создания | datetime(6) NOT NULL
# | dtEdited -- Дата проверки | datetime(6) NOT NULL
# ============================================================
szOrigin = models.CharField(
max_length=256,
default=u"",
unique=True,
db_index=True,
verbose_name=u"Источник",
help_text=u"Ссылка или указание источника: книга, URL, просто что-то…"
)
dtCreated = models.DateTimeField(
db_index=True,
auto_now_add=True, # надо указать False при миграции, после вернуть в True
auto_now=False, # надо указать False при миграции, после вернуть в True
# для выполнения миграций нужно добавлять default, а после убрать (она не нужна)
# default=datetime.datetime.now(pytz.timezone(settings.TIME_ZONE)),
verbose_name=u"Дата создания"
)
dtEdited = models.DateTimeField(
db_index=True,
auto_now=True, # надо указать False при миграции, после вернуть в True
# для выполнения миграций нужно добавлять default, а после она не нужна
# default=datetime.datetime.now(pytz.timezone(settings.TIME_ZONE)),
verbose_name=u"Дата редактирования"
)
def __str__(self):
origin = self.szOrigin
if len(origin) > 35:
origin = origin[:35] + u""
return u"%03d: %s" % (self.id, origin)
def __unicode__(self):
return self.__str__()
class Meta:
verbose_name = u"ИСТОЧНИК"
verbose_name_plural = u"ИСТОЧНИКИ"
ordering = ['id', ]
class TbAuthor(models.Model):
# ============================================================
# ТАБЛИЦА TbAuthor -- Автор изречения или цитаты (dictum and quotes)
# ------------------------------------------------------------
# | id -- id | INT(11) | PRIMARY KEY
# | szAuthor -- Автор и, если необходимо, краткая справка | varchar(256) NOT NULL
# | szAuthorHTML -- Автор и... в HTML по правилам типографики | varchar(136) NULL
# | bIsChecked -- Проверен | tinyint(1) NOT NULL
# | iViewCounter -- Просмотры | int(10) UNSIGNED NOT NULL
# | dtCreated -- Дата создания | datetime(6) NOT NULL
# | dtEdited -- Дата проверки | datetime(6) NOT NULL
# ============================================================
szAuthor = models.CharField(
max_length=128,
default=u"",
unique=True,
db_index=True,
verbose_name=u"Автор",
help_text=u"Автор и, если необходимо, краткая справка"
)
szAuthorHTML = models.TextField(
default="",
blank=True,
verbose_name=u"Автор HTML",
help_text=u"Автор и, если необходимо, краткая справка<br />"
u"Свертано в HTML по правилам типографики <small>(рекламные URL вставляются тут)</small>"
)
bIsChecked = models.BooleanField(
default=True,
db_index=True,
verbose_name=u"Проверен",
help_text=u"Автор проверен."
)
tags = TaggableManager(
blank=True,
through=RuTaggedItem,
verbose_name=u"Теги",
help_text=u"Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>"
)
iViewCounter = models.PositiveIntegerField(
default=0,
verbose_name=u"",
help_text=u"Число просмотров Автора."
)
dtCreated = models.DateTimeField(
db_index=True,
auto_now_add=True, # надо указать False при миграции, после вернуть в True
auto_now=False, # надо указать False при миграции, после вернуть в True
# для выполнения миграций нужно добавлять default, а после убрать (она не нужна)
# default=datetime.datetime.now(pytz.timezone(settings.TIME_ZONE)),
verbose_name=u"Дата создания"
)
dtEdited = models.DateTimeField(
db_index=True,
auto_now=True, # надо указать False при миграции, после вернуть в True
# для выполнения миграций нужно добавлять default, а после она не нужна
# default=datetime.datetime.now(pytz.timezone(settings.TIME_ZONE)),
verbose_name=u"Дата редактирования"
)
def __str__(self):
author = self.szAuthor
if len(author) > 25:
author = author[:25] + u""
return u"%04d: %s" % (self.id, author)
def __unicode__(self):
return self.__str__()
def save(self, *args, **kwargs):
http = urllib3.PoolManager()
# последовательно
# Используем типограф typus (https://github.com/byashimov/typus)
# Используем типограф Eugene Spearance (http://www.typograf.ru/)
# Используем типограф Муравьева (http://mdash.ru/api.v1.php)
self.szAuthor = ru_typus(self.szAuthor)
resp = http.request("POST",
"http://www.typograf.ru/webservice/",
fields={"text": self.szAuthor.encode('cp1251')})
self.szAuthorHTML = resp.data.decode('cp1251')
# print(self.szContentHTML)
resp = http.request("POST",
"http://mdash.ru/api.v1.php",
fields={"text": self.szAuthorHTML.encode('utf-8')})
self.szAuthorHTML = json.loads(resp.data)["result"]
# print(self.szContentHTML)
super(TbAuthor, self).save(*args, **kwargs)
class Meta:
verbose_name = u"АВТОР"
verbose_name_plural = u"АВТОРЫ"
ordering = ['id', ]
class TbDictumAndQuotes(models.Model):
# ============================================================
# ТАБЛИЦА TbDictQuot -- Изречения и Цитаты (dictum and quotes)
# ------------------------------------------------------------
# | id -- id | INT(11) | PRIMARY KEY
# | szIntro -- Вступление | varchar(256) NULL
# | szIntroHTML -- Вступление | (форматированное в HTML) varchar(136) NULL
# | szContent -- Высказывание | varchar(136) NOT NULL
# | szContentHtml -- Высказывание (Сформатированнон в HTML) | varchar(136) NULL
# | bIsChecked -- Проверен | tinyint(1) NOT NULL
# | kImages -- Ссылка на картинку в таблице TbImages |
# | iViewCounter -- Просмотры | int(10) UNSIGNED NOT NULL
# | dtCreated -- Дата создания | datetime(6) NOT NULL
# | dtEdited -- Дата проверки | datetime(6) NOT NULL
# ============================================================
szIntro = models.CharField(
max_length=256,
default=None,
blank=True,
verbose_name=u"Вступление",
help_text=u"Не обязательно. Вступление перед цитатой."
)
szIntroHTML = models.TextField(
default="",
blank=True,
verbose_name=u"Вступление HTML",
help_text=u"Автор и, если необходимо, краткая справка<br />"
u"Вступление перед цитатой, в HTML по правилам типографики</small>"
)
szContent = models.TextField(
max_length=256,
default="",
verbose_name=u"Высказывание",
help_text=u"Не обязательно. Вступление перед цитатой."
)
szContentHTML = models.TextField(
default="",
blank=True,
verbose_name=u"Высказывание HTML",
help_text=u"<b>Высказывание Крылатое</b> -- крылатое, пародоксальное и все такое"
)
kAuthor = models.ForeignKey(
TbAuthor,
default=None,
blank=True,
on_delete=models.DO_NOTHING,
verbose_name=u"Автор",
help_text=u"Автор изречения или цитаты <b>(не обязательно, но желательно)</b>"
)
kOrigin = models.ForeignKey(
TbOrigin,
default=None,
blank=True,
on_delete=models.DO_NOTHING,
verbose_name=u"Источник",
help_text=u"Откуда взята циатата, высказывание, изречение <b>(не обязательно, но желательно)</b>"
)
kImages = models.ForeignKey(
TbImages,
default=None,
blank=True,
on_delete=models.DO_NOTHING,
verbose_name=u"Картинка",
help_text=u"Ссылка на картинку, в табличке картинок <b>(не обязательно)</b><br />"
u"<small>если нужна именно данная картинка, а не выбранная автоматически</small>"
)
imFileOG = models.ImageField(
max_length=136,
upload_to="img2og",
default=u"",
blank=True,
verbose_name=u"OG-image",
help_text=u"Картинка для социальной сети <b>(будет создана автоматически)</b>.<br />"
u"<small>Файл с картинкой (png).<small>"
)
iViewCounter = models.PositiveIntegerField(
default=0,
db_index=True,
verbose_name=u"",
help_text=u"Число просмотров высказывания."
)
tags = TaggableManager(
blank=True,
through=RuTaggedItem,
verbose_name=u"Теги",
help_text=u"Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>"
)
dtCreated = models.DateTimeField(
db_index=True,
auto_now_add=True, # надо указать False при миграции, после вернуть в True
auto_now=False, # надо указать False при миграции, после вернуть в True
# для выполнения миграций нужно добавлять default, а после убрать (она не нужна)
# default=datetime.datetime.now(pytz.timezone(settings.TIME_ZONE)),
verbose_name=u"Дата создания"
)
dtEdited = models.DateTimeField(
db_index=True,
auto_now=True, # надо указать False при миграции, после вернуть в True
# для выполнения миграций нужно добавлять default, а после она не нужна
# default=datetime.datetime.now(pytz.timezone(settings.TIME_ZONE)),
verbose_name=u"Дата редактирования"
)
def __str__(self):
intro = self.szIntro
if len(intro) > 35:
intro = intro[:35] + u""
content = self.szContent
if len(content) > 55:
content = content[:55] + u""
return u"%05d: %s :: %s" % (self.id, intro, content)
def __unicode__(self):
return self.__str__()
def save(self, *args, **kwargs):
http = urllib3.PoolManager()
# последовательно
# Используем типограф typus (https://github.com/byashimov/typus)
# Используем типограф Eugene Spearance (http://www.typograf.ru/)
# Используем типограф Муравьева (http://mdash.ru/api.v1.php)
if self.szIntro != "" and self.szIntro != ru_typus(self.szIntro):
# сравнение self.szIntro != ru_typus(self.szIntro) нужно для избежания повторных обращений
# к типографам при обновлении щетчиков просмотра
self.szIntro = ru_typus(self.szIntro)
resp = http.request("POST",
"http://www.typograf.ru/webservice/",
fields={"text": self.szIntro.replace("\u202f", " ").replace("\u2009", " ").encode('cp1251')})
self.szIntroHTML = resp.data.decode('cp1251')
# print(self.szIntroHTML)
resp = http.request("POST",
"http://mdash.ru/api.v1.php",
fields={"text": self.szIntroHTML.encode('utf-8')})
self.szIntroHTML = json.loads(resp.data)["result"]
# print(self.szIntroHTML)
else:
self.szIntroHTML = ""
if self.szContent != ru_typus(self.szContent):
# self.szContent != ru_typus(self.szContent) нужно для избежания повторных обращений
# к типографам при обновлении щетчиков просмотра
self.szContent = ru_typus(self.szContent)
resp = http.request("POST",
"http://www.typograf.ru/webservice/",
fields={"text": self.szContent.replace("\u202f", " ").replace("\u2009", " ").encode('cp1251')})
self.szContentHTML = resp.data.decode('cp1251')
print(self.szContentHTML)
resp = http.request("POST",
"http://mdash.ru/api.v1.php",
fields={"text": self.szContentHTML.encode('utf-8')})
self.szContentHTML = json.loads(resp.data)["result"]
# print(self.szContentHTML)
super(TbDictumAndQuotes, self).save(*args, **kwargs)
class Meta:
verbose_name = u"ВЫСКАЗЫВАНИЕ"
verbose_name_plural = u"ВЫСКАЗЫВАНИЯ"
ordering = ['id', ]

4
dicquo/web/tests.py Normal file
View File

@@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from django.test import TestCase
# Create your tests here.

89
dicquo/web/views.py Normal file
View File

@@ -0,0 +1,89 @@
# -*- coding: utf-8 -*-
__author__ = "Sergei Erjemin"
__copyright__ = "Copyright 2020, Sergei Erjemin"
__credits__ = ["Sergei Erjemin", ]
__license__ = "GPL"
__version__ = "0.0.1"
__maintainer__ = "Sergei Erjemin"
__email__ = "erjemin@gmail.com"
__status__ = "in progress"
from django.shortcuts import render
from django.core.exceptions import ObjectDoesNotExist
import time
import hashlib
import random
import pytils
from taggit.models import Tag
from web.models import TbOrigin, TbDictumAndQuotes, TbImages, TbAuthor
# Create your views here.
def for_dq(dq):
to_template = {}
num = int(hashlib.blake2s(dq.szContent.encode("utf-8"), digest_size=1).hexdigest(), 16)
clr = sorted([num / 2, num / 3, num / 5, num / 7, num / 11, num / 1.5], key=lambda A: random.random())
to_template.update({'CLR': clr})
to_template.update({'DQ': dq})
try:
au = TbAuthor.objects.get(id=dq.kAuthor_id)
to_template.update({'AUTHOR': au})
tags = au.tags.names()
except ObjectDoesNotExist:
tags = dq.tags.names()
tag_and_slug = []
for i in tags:
tag_and_slug.append({"name": i, "slug": pytils.translit.slugify(i.lower())[:128]})
to_template.update({'TAGS': sorted(tag_and_slug, key=lambda x: x["name"])}) # tag_and_slug
if dq.kImages_id is None:
if len(tags) != 0:
try:
tagged_image = TbImages.objects.filter(tags__name__in=tags).order_by('?')[0]
to_template.update({'IMAGE': tagged_image.imFile})
except IndexError:
pass
else:
to_template.update({'IMAGE': dq.kImages.imFile})
dq.iViewCounter += 1
dq.save()
dq_next = TbDictumAndQuotes.objects.exclude(id=dq.id).order_by('?').first()
to_template.update({"NEXT": dq_next.id})
to_template.update({"NEXT_TXT": pytils.translit.slugify(dq_next.szContent.lower()[:120])})
return to_template
def by_id( request, dq_id):
t_start = time.process_time()
template = "index.html" # шаблон
dq = TbDictumAndQuotes.objects.get(id=dq_id)
to_template = for_dq(dq)
# пероверка, что посетитель согласился со сбором даных через cookies
if request.COOKIES.get('cookie_accept'):
to_template.update({'cookie_accept': 1})
to_template.update({'ticks': float(time.process_time() - t_start)})
response = render(request, template, to_template)
return response
def index(request):
t_start = time.process_time()
# проверка на аутентификацию
# if not request.user.is_authenticated():
# return HttpResponseRedirect("/access")
template = "index.html" # шаблон
dq_ = TbDictumAndQuotes.objects.order_by('?')
if request.GET.get('tag'):
dq = dq_.filter(kAuthor__tags__slug__in=[request.GET['tag']]).first()
if dq is None:
dq = dq_.filter(tags__slug__in=[request.GET['tag']]).first()
if dq is None:
dq = dq_.first()
else:
dq = dq_.first()
to_template = for_dq(dq)
# пероверка, что посетитель согласился со сбором даных через cookies
if request.COOKIES.get('cookie_accept'):
to_template.update({'cookie_accept': 1})
to_template.update({'ticks': float(time.process_time() - t_start)})
response = render(request, template, to_template)
return response