diff --git a/dicquo/web/migrations/0001_initial.py b/dicquo/web/migrations/0001_initial.py
index fd38f6a..8b0dc76 100644
--- a/dicquo/web/migrations/0001_initial.py
+++ b/dicquo/web/migrations/0001_initial.py
@@ -1,8 +1,8 @@
-# Generated by Django 3.1.2 on 2020-10-05 06:52
+# Generated by Django 6.0.2 on 2026-02-17 22:08
-from django.db import migrations, models
import django.db.models.deletion
import taggit.managers
+from django.db import migrations, models
class Migration(migrations.Migration):
@@ -10,21 +10,21 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
- ('taggit', '0003_taggeditem_add_unique_index'),
+ ('taggit', '0006_rename_taggeditem_content_type_object_id_taggit_tagg_content_8fc721_idx'),
]
operations = [
migrations.CreateModel(
name='TbAuthor',
fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('id', models.BigAutoField(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='Автор и, если необходимо, краткая справка
Свертано в HTML по правилам типографики (рекламные URL вставляются тут)', 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='Просмотры')),
+ ('szAuthorHTML', models.TextField(blank=True, default='', help_text='Автор и, если необходимо, краткая справка
Свертано в HTML по правилам типографики (рекламные URL вставляются тут)', verbose_name='Автор HTML')),
+ ('bTypograph', models.BooleanField(db_index=True, default=True, help_text='Применять типографику к этому автору?', 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='Теги через запятую… Регистр не чувствителен… Теги нужны для подстановки картинок и навигации', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Теги')),
+ ('dtEdited', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Дата редактирования')),
],
options={
'verbose_name': 'АВТОР',
@@ -35,10 +35,10 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='TbOrigin',
fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('id', models.BigAutoField(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='Дата последнего редактирования')),
+ ('dtEdited', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Дата редактирования')),
],
options={
'verbose_name': 'ИСТОЧНИК',
@@ -46,17 +46,39 @@ class Migration(migrations.Migration):
'ordering': ['id'],
},
),
+ migrations.CreateModel(
+ name='RuTaggedItem',
+ fields=[
+ ],
+ options={
+ 'proxy': True,
+ 'indexes': [],
+ 'constraints': [],
+ },
+ bases=('taggit.taggeditem',),
+ ),
+ migrations.CreateModel(
+ name='RuTag',
+ fields=[
+ ],
+ options={
+ 'proxy': True,
+ 'indexes': [],
+ 'constraints': [],
+ },
+ bases=('taggit.tag',),
+ ),
migrations.CreateModel(
name='TbImages',
fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('id', models.BigAutoField(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='Просмотры')),
+ ('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='Теги через запятую… Регистр не чувствителен… Теги нужны для подстановки картинок и навигации', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Теги')),
+ ('dtEdited', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Дата редактирования')),
+ ('tags', taggit.managers.TaggableManager(blank=True, help_text='Теги через запятую… Регистр не чувствителен… Теги нужны для подстановки картинок и навигации', through='web.RuTaggedItem', to='taggit.Tag', verbose_name='Теги')),
],
options={
'verbose_name': 'КАРТИНКА',
@@ -67,19 +89,20 @@ class Migration(migrations.Migration):
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='Автор и, если необходимо, краткая справка
Вступление перед цитатой, в HTML по правилам типографики', verbose_name='Вступление HTML')),
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('szIntro', models.CharField(blank=True, default=None, help_text='Не обязательно. Вступление перед цитатой.', max_length=256, verbose_name='Вступление')),
+ ('szIntroHTML', models.TextField(blank=True, default='', help_text='Автор и, если необходимо, краткая справка
Вступление перед цитатой, в HTML по правилам типографики', verbose_name='Вступление HTML')),
('szContent', models.TextField(default='', help_text='Не обязательно. Вступление перед цитатой.', max_length=256, verbose_name='Высказывание')),
- ('szContentHTML', models.TextField(default='', help_text='Высказывание Крылатое -- крылатое, пародоксальное и все такое', verbose_name='Высказывание HTML')),
- ('imFileOG', models.ImageField(default='', help_text='Картинка для социальной сети (будет создана автоматически).
Файл с картинкой (png).', max_length=136, upload_to='img2og', verbose_name='OG-image')),
- ('iViewCounter', models.PositiveIntegerField(db_index=True, default=0, help_text='Число сканирований хоста.', verbose_name='Просмотры')),
+ ('szContentHTML', models.TextField(blank=True, default='', help_text='Содержание цитаты, афоризма, высказывания…
Свертано в HTML по правилам типографики', verbose_name='Изречение HTML')),
+ ('bTypograph', models.BooleanField(db_index=True, default=True, help_text='Применять типографику?', verbose_name='Типографить')),
+ ('imFileOG', models.ImageField(blank=True, default='', help_text='Картинка для социальной сети (будет создана автоматически).
Файл с картинкой (png).', max_length=136, upload_to='img2og', verbose_name='OG-image')),
+ ('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='Автор изречения или цитаты (не обязательно, но желательно)', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='web.tbauthor', verbose_name='Автор')),
- ('kImages', models.ForeignKey(default=None, help_text='Ссылка на картинку, в табличке картинок (не обязательно)
если нужна именно данная картинка, а не выбранная автоматически', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='web.tbimages', verbose_name='Картинка')),
- ('kOrigin', models.ForeignKey(default=None, help_text='Откуда взята циатата, высказывание, изречение (не обязательно, но желательно)', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='web.tborigin', verbose_name='Источник')),
- ('tags', taggit.managers.TaggableManager(help_text='Теги через запятую… Регистр не чувствителен… Теги нужны для подстановки картинок и навигации', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Теги')),
+ ('dtEdited', models.DateTimeField(auto_now=True, db_index=True, verbose_name='Дата редактирования')),
+ ('kAuthor', models.ForeignKey(blank=True, default=None, help_text='Автор изречения или цитаты (не обязательно, но желательно)', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='web.tbauthor', verbose_name='Автор')),
+ ('kImages', models.ForeignKey(blank=True, default=None, help_text='Ссылка на картинку, в табличке картинок (не обязательно)
если нужна именно данная картинка, а не выбранная автоматически', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='web.tbimages', verbose_name='Картинка')),
+ ('kOrigin', models.ForeignKey(blank=True, default=None, help_text='Откуда взята циатата, высказывание, изречение (не обязательно, но желательно)', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='web.tborigin', verbose_name='Источник')),
+ ('tags', taggit.managers.TaggableManager(blank=True, help_text='Теги через запятую… Регистр не чувствителен… Теги нужны для подстановки картинок и навигации', through='web.RuTaggedItem', to='taggit.Tag', verbose_name='Теги')),
],
options={
'verbose_name': 'ВЫСКАЗЫВАНИЕ',
@@ -87,4 +110,9 @@ class Migration(migrations.Migration):
'ordering': ['id'],
},
),
+ migrations.AddField(
+ model_name='tbauthor',
+ name='tags',
+ field=taggit.managers.TaggableManager(blank=True, help_text='Теги через запятую… Регистр не чувствителен… Теги нужны для подстановки картинок и навигации', through='web.RuTaggedItem', to='taggit.Tag', verbose_name='Теги'),
+ ),
]
diff --git a/dicquo/web/models.py b/dicquo/web/models.py
index a437a41..1ae865e 100644
--- a/dicquo/web/models.py
+++ b/dicquo/web/models.py
@@ -2,9 +2,13 @@
from django.db import models
from taggit.managers import TaggableManager
from taggit.models import Tag, TaggedItem
-from typus import en_typus, ru_typus
+try:
+ from typus import en_typus, ru_typus
+except ImportError:
+ def en_typus(text): return text
+ def ru_typus(text): return text
from pathlib import Path
-import urllib3
+# import urllib3
import json
import pytils
@@ -190,6 +194,12 @@ class TbAuthor(models.Model):
help_text=u"Автор и, если необходимо, краткая справка
"
u"Свертано в HTML по правилам типографики (рекламные URL вставляются тут)"
)
+ bTypograph = models.BooleanField(
+ default=True,
+ db_index=True,
+ verbose_name=u"Типографить",
+ help_text=u"Применять типографику к этому автору?"
+ )
bIsChecked = models.BooleanField(
default=True,
db_index=True,
@@ -295,13 +305,21 @@ class TbDictumAndQuotes(models.Model):
szContentHTML = models.TextField(
default="",
blank=True,
- verbose_name=u"Высказывание HTML",
- help_text=u"Высказывание Крылатое -- крылатое, пародоксальное и все такое"
+ verbose_name=u"Изречение HTML",
+ help_text=u"Содержание цитаты, афоризма, высказывания…
"
+ u"Свертано в HTML по правилам типографики"
+ )
+ bTypograph = models.BooleanField(
+ default=True,
+ db_index=True,
+ verbose_name=u"Типографить",
+ help_text=u"Применять типографику?"
)
kAuthor = models.ForeignKey(
TbAuthor,
default=None,
blank=True,
+ null=True,
on_delete=models.DO_NOTHING,
verbose_name=u"Автор",
help_text=u"Автор изречения или цитаты (не обязательно, но желательно)"
@@ -310,6 +328,7 @@ class TbDictumAndQuotes(models.Model):
TbOrigin,
default=None,
blank=True,
+ null=True,
on_delete=models.DO_NOTHING,
verbose_name=u"Источник",
help_text=u"Откуда взята циатата, высказывание, изречение (не обязательно, но желательно)"
@@ -318,6 +337,7 @@ class TbDictumAndQuotes(models.Model):
TbImages,
default=None,
blank=True,
+ null=True,
on_delete=models.DO_NOTHING,
verbose_name=u"Картинка",
help_text=u"Ссылка на картинку, в табличке картинок (не обязательно)
"
@@ -373,41 +393,41 @@ class TbDictumAndQuotes(models.Model):
return self.__str__()
def save(self, *args, **kwargs):
- http = urllib3.PoolManager()
+ # 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)
+ # 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: