From 33fa2d04a910a48891d71b99d2c84039c1bd8f45 Mon Sep 17 00:00:00 2001 From: erjemin Date: Wed, 18 Feb 2026 15:07:35 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B3=D1=80=D0=B0=D1=84=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dicquo/web/migrations/0001_initial.py | 82 ++++++++++++++++-------- dicquo/web/models.py | 90 ++++++++++++++++----------- 2 files changed, 110 insertions(+), 62 deletions(-) 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: