mod: отключены внешние типографы

This commit is contained in:
2026-02-18 15:07:35 +03:00
parent b94e31dc59
commit 33fa2d04a9
2 changed files with 110 additions and 62 deletions

View File

@@ -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 django.db.models.deletion
import taggit.managers import taggit.managers
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
@@ -10,21 +10,21 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('taggit', '0003_taggeditem_add_unique_index'), ('taggit', '0006_rename_taggeditem_content_type_object_id_taggit_tagg_content_8fc721_idx'),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='TbAuthor', name='TbAuthor',
fields=[ 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='Автор')), ('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')), ('szAuthorHTML', models.TextField(blank=True, default='', help_text='Автор и, если необходимо, краткая справка<br />Свертано в HTML по правилам типографики <small>(рекламные URL вставляются тут)</small>', verbose_name='Автор HTML')),
('bIsChecked', models.BooleanField(db_index=True, default=True, help_text='Есть доступ для сканирования.', verbose_name='Проверен')), ('bTypograph', 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='Дата создания')), ('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='Дата редактирования')),
('tags', taggit.managers.TaggableManager(help_text='Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Теги')),
], ],
options={ options={
'verbose_name': 'АВТОР', 'verbose_name': 'АВТОР',
@@ -35,10 +35,10 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='TbOrigin', name='TbOrigin',
fields=[ 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='Источник')), ('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='Дата создания')), ('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={ options={
'verbose_name': 'ИСТОЧНИК', 'verbose_name': 'ИСТОЧНИК',
@@ -46,17 +46,39 @@ class Migration(migrations.Migration):
'ordering': ['id'], '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( migrations.CreateModel(
name='TbImages', name='TbImages',
fields=[ 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='Картинка')), ('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='Название')), ('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='Проверен')), ('bIsChecked', models.BooleanField(db_index=True, default=True, help_text='Картинку проверили.', verbose_name='Проверен')),
('iViewCounter', models.PositiveIntegerField(default=0, 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='Дата создания')), ('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='Дата редактирования')),
('tags', taggit.managers.TaggableManager(help_text='Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Теги')), ('tags', taggit.managers.TaggableManager(blank=True, help_text='Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>', through='web.RuTaggedItem', to='taggit.Tag', verbose_name='Теги')),
], ],
options={ options={
'verbose_name': 'КАРТИНКА', 'verbose_name': 'КАРТИНКА',
@@ -67,19 +89,20 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='TbDictumAndQuotes', name='TbDictumAndQuotes',
fields=[ 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')),
('szIntro', models.CharField(default=None, help_text='Не обязательно. Вступление перед цитатой.', max_length=256, null=True, verbose_name='Вступление')), ('szIntro', models.CharField(blank=True, default=None, help_text='Не обязательно. Вступление перед цитатой.', max_length=256, verbose_name='Вступление')),
('szIntroHTML', models.TextField(default='', help_text='Автор и, если необходимо, краткая справка<br />Вступление перед цитатой, в HTML по правилам типографики</small>', verbose_name='Вступление HTML')), ('szIntroHTML', models.TextField(blank=True, default='', help_text='Автор и, если необходимо, краткая справка<br />Вступление перед цитатой, в HTML по правилам типографики</small>', verbose_name='Вступление HTML')),
('szContent', models.TextField(default='', help_text='Не обязательно. Вступление перед цитатой.', max_length=256, verbose_name='Высказывание')), ('szContent', models.TextField(default='', help_text='Не обязательно. Вступление перед цитатой.', max_length=256, verbose_name='Высказывание')),
('szContentHTML', models.TextField(default='', help_text='<b>Высказывание Крылатое</b> -- крылатое, пародоксальное и все такое', verbose_name='Высказывание HTML')), ('szContentHTML', models.TextField(blank=True, default='', help_text='Содержание цитаты, афоризма, высказывания…<br />Свертано в HTML по правилам типографики', 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>')), ('bTypograph', models.BooleanField(db_index=True, default=True, help_text='Применять типографику?', verbose_name='Типографить')),
('iViewCounter', models.PositiveIntegerField(db_index=True, default=0, help_text='Число сканирований хоста.', verbose_name='Просмотры')), ('imFileOG', models.ImageField(blank=True, default='', help_text='Картинка для социальной сети <b>(будет создана автоматически)</b>.<br /><small>Файл с картинкой (png).<small>', 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='Дата создания')), ('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='Дата редактирования')),
('kAuthor', models.ForeignKey(default=None, help_text='Автор изречения или цитаты <b>(не обязательно, но желательно)</b>', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='web.tbauthor', verbose_name='Автор')), ('kAuthor', models.ForeignKey(blank=True, 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='Картинка')), ('kImages', models.ForeignKey(blank=True, 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='Источник')), ('kOrigin', models.ForeignKey(blank=True, 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='Теги')), ('tags', taggit.managers.TaggableManager(blank=True, help_text='Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>', through='web.RuTaggedItem', to='taggit.Tag', verbose_name='Теги')),
], ],
options={ options={
'verbose_name': 'ВЫСКАЗЫВАНИЕ', 'verbose_name': 'ВЫСКАЗЫВАНИЕ',
@@ -87,4 +110,9 @@ class Migration(migrations.Migration):
'ordering': ['id'], 'ordering': ['id'],
}, },
), ),
migrations.AddField(
model_name='tbauthor',
name='tags',
field=taggit.managers.TaggableManager(blank=True, help_text='Теги через запятую… Регистр не чувствителен… <b>Теги нужны для подстановки картинок и навигации<b>', through='web.RuTaggedItem', to='taggit.Tag', verbose_name='Теги'),
),
] ]

View File

@@ -2,9 +2,13 @@
from django.db import models from django.db import models
from taggit.managers import TaggableManager from taggit.managers import TaggableManager
from taggit.models import Tag, TaggedItem 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 from pathlib import Path
import urllib3 # import urllib3
import json import json
import pytils import pytils
@@ -190,6 +194,12 @@ class TbAuthor(models.Model):
help_text=u"Автор и, если необходимо, краткая справка<br />" help_text=u"Автор и, если необходимо, краткая справка<br />"
u"Свертано в HTML по правилам типографики <small>(рекламные URL вставляются тут)</small>" u"Свертано в HTML по правилам типографики <small>(рекламные URL вставляются тут)</small>"
) )
bTypograph = models.BooleanField(
default=True,
db_index=True,
verbose_name=u"Типографить",
help_text=u"Применять типографику к этому автору?"
)
bIsChecked = models.BooleanField( bIsChecked = models.BooleanField(
default=True, default=True,
db_index=True, db_index=True,
@@ -295,13 +305,21 @@ class TbDictumAndQuotes(models.Model):
szContentHTML = models.TextField( szContentHTML = models.TextField(
default="", default="",
blank=True, blank=True,
verbose_name=u"Высказывание HTML", verbose_name=u"Изречение HTML",
help_text=u"<b>Высказывание Крылатое</b> -- крылатое, пародоксальное и все такое" help_text=u"Содержание цитаты, афоризма, высказывания…<br />"
u"Свертано в HTML по правилам типографики"
)
bTypograph = models.BooleanField(
default=True,
db_index=True,
verbose_name=u"Типографить",
help_text=u"Применять типографику?"
) )
kAuthor = models.ForeignKey( kAuthor = models.ForeignKey(
TbAuthor, TbAuthor,
default=None, default=None,
blank=True, blank=True,
null=True,
on_delete=models.DO_NOTHING, on_delete=models.DO_NOTHING,
verbose_name=u"Автор", verbose_name=u"Автор",
help_text=u"Автор изречения или цитаты <b>(не обязательно, но желательно)</b>" help_text=u"Автор изречения или цитаты <b>(не обязательно, но желательно)</b>"
@@ -310,6 +328,7 @@ class TbDictumAndQuotes(models.Model):
TbOrigin, TbOrigin,
default=None, default=None,
blank=True, blank=True,
null=True,
on_delete=models.DO_NOTHING, on_delete=models.DO_NOTHING,
verbose_name=u"Источник", verbose_name=u"Источник",
help_text=u"Откуда взята циатата, высказывание, изречение <b>(не обязательно, но желательно)</b>" help_text=u"Откуда взята циатата, высказывание, изречение <b>(не обязательно, но желательно)</b>"
@@ -318,6 +337,7 @@ class TbDictumAndQuotes(models.Model):
TbImages, TbImages,
default=None, default=None,
blank=True, blank=True,
null=True,
on_delete=models.DO_NOTHING, on_delete=models.DO_NOTHING,
verbose_name=u"Картинка", verbose_name=u"Картинка",
help_text=u"Ссылка на картинку, в табличке картинок <b>(не обязательно)</b><br />" help_text=u"Ссылка на картинку, в табличке картинок <b>(не обязательно)</b><br />"
@@ -373,41 +393,41 @@ class TbDictumAndQuotes(models.Model):
return self.__str__() return self.__str__()
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
http = urllib3.PoolManager() # http = urllib3.PoolManager()
# последовательно # последовательно
# Используем типограф typus (https://github.com/byashimov/typus) # Используем типограф typus (https://github.com/byashimov/typus)
# Используем типограф Eugene Spearance (http://www.typograf.ru/) # Используем типограф Eugene Spearance (http://www.typograf.ru/)
# Используем типограф Муравьева (http://mdash.ru/api.v1.php) # Используем типограф Муравьева (http://mdash.ru/api.v1.php)
if self.szIntro != "" and self.szIntro != ru_typus(self.szIntro): # if self.szIntro != "" and self.szIntro != ru_typus(self.szIntro):
# сравнение self.szIntro != ru_typus(self.szIntro) нужно для избежания повторных обращений # # сравнение self.szIntro != ru_typus(self.szIntro) нужно для избежания повторных обращений
# к типографам при обновлении щетчиков просмотра # # к типографам при обновлении щетчиков просмотра
self.szIntro = ru_typus(self.szIntro) # self.szIntro = ru_typus(self.szIntro)
resp = http.request("POST", # resp = http.request("POST",
"http://www.typograf.ru/webservice/", # "http://www.typograf.ru/webservice/",
fields={"text": self.szIntro.replace("\u202f", " ").replace("\u2009", " ").encode('cp1251')}) # fields={"text": self.szIntro.replace("\u202f", " ").replace("\u2009", " ").encode('cp1251')})
self.szIntroHTML = resp.data.decode('cp1251') # self.szIntroHTML = resp.data.decode('cp1251')
# print(self.szIntroHTML) # # print(self.szIntroHTML)
resp = http.request("POST", # resp = http.request("POST",
"http://mdash.ru/api.v1.php", # "http://mdash.ru/api.v1.php",
fields={"text": self.szIntroHTML.encode('utf-8')}) # fields={"text": self.szIntroHTML.encode('utf-8')})
self.szIntroHTML = json.loads(resp.data)["result"] # self.szIntroHTML = json.loads(resp.data)["result"]
# print(self.szIntroHTML) # # print(self.szIntroHTML)
else: # else:
self.szIntroHTML = "" # self.szIntroHTML = ""
if self.szContent != ru_typus(self.szContent): # if self.szContent != ru_typus(self.szContent):
# self.szContent != ru_typus(self.szContent) нужно для избежания повторных обращений # # self.szContent != ru_typus(self.szContent) нужно для избежания повторных обращений
# к типографам при обновлении щетчиков просмотра # # к типографам при обновлении щетчиков просмотра
self.szContent = ru_typus(self.szContent) # self.szContent = ru_typus(self.szContent)
resp = http.request("POST", # resp = http.request("POST",
"http://www.typograf.ru/webservice/", # "http://www.typograf.ru/webservice/",
fields={"text": self.szContent.replace("\u202f", " ").replace("\u2009", " ").encode('cp1251')}) # fields={"text": self.szContent.replace("\u202f", " ").replace("\u2009", " ").encode('cp1251')})
self.szContentHTML = resp.data.decode('cp1251') # self.szContentHTML = resp.data.decode('cp1251')
print(self.szContentHTML) # print(self.szContentHTML)
resp = http.request("POST", # resp = http.request("POST",
"http://mdash.ru/api.v1.php", # "http://mdash.ru/api.v1.php",
fields={"text": self.szContentHTML.encode('utf-8')}) # fields={"text": self.szContentHTML.encode('utf-8')})
self.szContentHTML = json.loads(resp.data)["result"] # self.szContentHTML = json.loads(resp.data)["result"]
# print(self.szContentHTML) # # print(self.szContentHTML)
super(TbDictumAndQuotes, self).save(*args, **kwargs) super(TbDictumAndQuotes, self).save(*args, **kwargs)
class Meta: class Meta: