0.5.2 documentation
This commit is contained in:
130
DocsApp/admin.py
130
DocsApp/admin.py
@@ -1,3 +1,131 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from sets.admin import *
|
||||||
|
from .models import *
|
||||||
|
from BaseModels.admin_utils import Admin_BaseIconModel
|
||||||
|
from super_inlines.admin import SuperInlineModelAdmin, SuperModelAdmin
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
|
from django import forms
|
||||||
|
from django.utils.text import slugify
|
||||||
|
|
||||||
# Register your models here.
|
|
||||||
|
|
||||||
|
class DocArtForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = DocArt
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(DocArtForm, self).__init__(*args, **kwargs)
|
||||||
|
self.fields['parent'].queryset = DocArt.objects.exclude(id__exact=self.instance.id)
|
||||||
|
|
||||||
|
|
||||||
|
class Admin_DocArt(SuperModelAdmin, Admin_Trans_BaseModelViewPage):
|
||||||
|
form = DocArtForm
|
||||||
|
|
||||||
|
def show_versions(self, obj):
|
||||||
|
versions = obj.versions.filter(enable=True).values_list('name', flat=True)
|
||||||
|
if versions:
|
||||||
|
return ' - '.join(versions)
|
||||||
|
return '-'
|
||||||
|
show_versions.short_description = _('Версии')
|
||||||
|
|
||||||
|
|
||||||
|
fieldsets = [
|
||||||
|
(None, {
|
||||||
|
'classes': ['wide'],
|
||||||
|
'fields': (
|
||||||
|
'name', 'url',
|
||||||
|
'enable',
|
||||||
|
'parent',
|
||||||
|
'versions',
|
||||||
|
'order',
|
||||||
|
# 'title',
|
||||||
|
# 'description',
|
||||||
|
'text',
|
||||||
|
# 'picture',
|
||||||
|
|
||||||
|
)
|
||||||
|
}),
|
||||||
|
# ('SEO', {
|
||||||
|
# 'classes': ['wide', 'collapse'],
|
||||||
|
# 'fields': (
|
||||||
|
# 'seo_title', 'seo_description', 'seo_keywords', 'seo_text',
|
||||||
|
# )
|
||||||
|
# }),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
list_display = [
|
||||||
|
'id', 'enable',
|
||||||
|
'name', 'url',
|
||||||
|
'show_versions',
|
||||||
|
'order', 'modifiedDT', 'createDT'
|
||||||
|
]
|
||||||
|
|
||||||
|
# ordering = ['section', 'parent_service', 'order']
|
||||||
|
|
||||||
|
prepopulated_fields = {"url": ("name_en",)}
|
||||||
|
|
||||||
|
list_display_links = ['id', 'name']
|
||||||
|
list_editable = ['enable', 'order']
|
||||||
|
|
||||||
|
filter_horizontal = ['versions']
|
||||||
|
|
||||||
|
list_filter = [
|
||||||
|
# 'section', 'parent_service',
|
||||||
|
'modifiedDT', 'createDT',
|
||||||
|
]
|
||||||
|
search_fields = ['name', 'title']
|
||||||
|
# filter_horizontal = ['options']
|
||||||
|
|
||||||
|
# inlines = [Admin_StackedInline_Block]
|
||||||
|
|
||||||
|
|
||||||
|
admin.site.register(DocArt, Admin_DocArt)
|
||||||
|
|
||||||
|
|
||||||
|
class Admin_DocVersion(Admin_BaseIconModel):
|
||||||
|
|
||||||
|
fieldsets = [
|
||||||
|
(None, {
|
||||||
|
'classes': ['wide'],
|
||||||
|
'fields': (
|
||||||
|
'name', 'url', 'enable', 'order',
|
||||||
|
)
|
||||||
|
}),
|
||||||
|
# ('SEO', {
|
||||||
|
# 'classes': ['wide', 'collapse'],
|
||||||
|
# 'fields': (
|
||||||
|
# 'seo_title', 'seo_description', 'seo_keywords', 'seo_text',
|
||||||
|
# )
|
||||||
|
# }),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
list_display = [
|
||||||
|
'id', 'enable',
|
||||||
|
'name', 'url',
|
||||||
|
# 'title',
|
||||||
|
'order', 'modifiedDT', 'createDT'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ordering = ['section', 'parent_service', 'order']
|
||||||
|
|
||||||
|
# prepopulated_fields = {"url": ("name",)}
|
||||||
|
|
||||||
|
list_display_links = ['id', 'name']
|
||||||
|
list_editable = ['enable', 'order']
|
||||||
|
|
||||||
|
list_filter = [
|
||||||
|
# 'section', 'parent_service',
|
||||||
|
'modifiedDT', 'createDT',
|
||||||
|
]
|
||||||
|
search_fields = ['name']
|
||||||
|
# filter_horizontal = ['options']
|
||||||
|
|
||||||
|
# inlines = [Admin_StackedInline_Block]
|
||||||
|
|
||||||
|
|
||||||
|
admin.site.register(DocVersion, Admin_DocVersion)
|
||||||
65
DocsApp/migrations/0001_initial.py
Normal file
65
DocsApp/migrations/0001_initial.py
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# Generated by Django 4.2.7 on 2024-07-10 16:02
|
||||||
|
|
||||||
|
import BaseModels.base_models
|
||||||
|
import ckeditor_uploader.fields
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='DocVersion',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')),
|
||||||
|
('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')),
|
||||||
|
('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')),
|
||||||
|
('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')),
|
||||||
|
('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')),
|
||||||
|
('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')),
|
||||||
|
('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')),
|
||||||
|
('url', models.TextField(help_text='можно изменить адрес страницы (!!! ВНИМАНИЕ !!! поисковые системы потеряют страницу и найдут лишь спустя неделю...месяц)', unique=True, verbose_name='URL привязанной страницы')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Версия документации',
|
||||||
|
'verbose_name_plural': 'Версии документации',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='DocArt',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')),
|
||||||
|
('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')),
|
||||||
|
('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')),
|
||||||
|
('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')),
|
||||||
|
('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')),
|
||||||
|
('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')),
|
||||||
|
('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')),
|
||||||
|
('url', models.TextField(help_text='можно изменить адрес страницы (!!! ВНИМАНИЕ !!! поисковые системы потеряют страницу и найдут лишь спустя неделю...месяц)', unique=True, verbose_name='URL привязанной страницы')),
|
||||||
|
('title', models.TextField(blank=True, null=True, verbose_name='Заголовок')),
|
||||||
|
('description', ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание')),
|
||||||
|
('picture', models.FileField(blank=True, null=True, upload_to='uploads/', validators=[BaseModels.base_models.validate_file_extension], verbose_name='Картинка')),
|
||||||
|
('visible', models.BooleanField(default=True, verbose_name='Отображать')),
|
||||||
|
('seo_title', models.CharField(blank=True, max_length=250, null=True, verbose_name='Title (80 знаков)')),
|
||||||
|
('seo_description', models.CharField(blank=True, max_length=250, null=True, verbose_name='Description (150 знаков)')),
|
||||||
|
('seo_keywords', models.CharField(blank=True, max_length=250, null=True, verbose_name='Keywords (200 знаков)')),
|
||||||
|
('seo_text', ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи')),
|
||||||
|
('FAQ_title', models.CharField(blank=True, max_length=250, null=True, verbose_name='FAQ Заголовок')),
|
||||||
|
('text', ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Статья')),
|
||||||
|
('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='DocsApp.docart', verbose_name='Родитель')),
|
||||||
|
('versions', models.ManyToManyField(blank=True, to='DocsApp.docversion', verbose_name='Подключенные версии')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Статья документации',
|
||||||
|
'verbose_name_plural': 'Статьи документации',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
# Generated by Django 4.2.7 on 2024-07-10 16:12
|
||||||
|
|
||||||
|
import ckeditor_uploader.fields
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('DocsApp', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='docart',
|
||||||
|
name='description_en',
|
||||||
|
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='docart',
|
||||||
|
name='description_ru',
|
||||||
|
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='docart',
|
||||||
|
name='name_en',
|
||||||
|
field=models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='docart',
|
||||||
|
name='name_ru',
|
||||||
|
field=models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='docart',
|
||||||
|
name='text_en',
|
||||||
|
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='docart',
|
||||||
|
name='text_ru',
|
||||||
|
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='docart',
|
||||||
|
name='title_en',
|
||||||
|
field=models.TextField(blank=True, null=True, verbose_name='Заголовок'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='docart',
|
||||||
|
name='title_ru',
|
||||||
|
field=models.TextField(blank=True, null=True, verbose_name='Заголовок'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='docart',
|
||||||
|
name='text',
|
||||||
|
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 4.2.7 on 2024-07-10 17:56
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('DocsApp', '0002_docart_description_en_docart_description_ru_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='docart',
|
||||||
|
name='parent',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rel_childArts_for_docArt', to='DocsApp.docart', verbose_name='Родитель'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='docart',
|
||||||
|
name='versions',
|
||||||
|
field=models.ManyToManyField(blank=True, related_name='rel_docArts_for_version', to='DocsApp.docversion', verbose_name='Подключенные версии'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -1,3 +1,37 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
from BaseModels.base_models import BaseModelViewPage, BaseModel
|
||||||
|
from ckeditor_uploader.fields import RichTextUploadingField
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
# Create your models here.
|
|
||||||
|
class DocVersion(BaseModel):
|
||||||
|
url = models.TextField(
|
||||||
|
verbose_name=_('URL привязанной страницы'), unique=True,
|
||||||
|
help_text=_('можно изменить адрес страницы (!!! ВНИМАНИЕ !!! поисковые системы потеряют страницу и найдут лишь спустя неделю...месяц)')
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _('Версия документации')
|
||||||
|
verbose_name_plural = _('Версии документации')
|
||||||
|
|
||||||
|
|
||||||
|
class DocArt(BaseModelViewPage):
|
||||||
|
parent = models.ForeignKey(
|
||||||
|
'DocArt', verbose_name=_('Родитель'),
|
||||||
|
null=True, blank=True,
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
|
related_name='rel_childArts_for_docArt'
|
||||||
|
)
|
||||||
|
versions = models.ManyToManyField(
|
||||||
|
DocVersion, verbose_name=_('Подключенные версии'), blank=True,
|
||||||
|
related_name='rel_docArts_for_version'
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
if self.name:
|
||||||
|
return self.name
|
||||||
|
else:
|
||||||
|
return str(self.id)
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _('Статья документации')
|
||||||
|
verbose_name_plural = _('Статьи документации')
|
||||||
19
DocsApp/translation.py
Normal file
19
DocsApp/translation.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from modeltranslation.translator import translator, TranslationOptions
|
||||||
|
from .models import *
|
||||||
|
|
||||||
|
|
||||||
|
class DocArt_TranslationOptions(TranslationOptions):
|
||||||
|
fields = (
|
||||||
|
'name', 'description', 'text', 'title'
|
||||||
|
)
|
||||||
|
translator.register(DocArt, DocArt_TranslationOptions)
|
||||||
|
|
||||||
|
|
||||||
|
# class DocVersion_TranslationOptions(TranslationOptions):
|
||||||
|
# fields = (
|
||||||
|
# 'name', 'description', 'text', 'title', 'FAQ_title', 'seo_title', 'seo_description', 'seo_text'
|
||||||
|
# )
|
||||||
|
# translator.register(DocVersion, DocVersion_TranslationOptions)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -6,4 +6,6 @@ from .views import *
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('docs/3dsd/', DocsView, name='docs_main'),
|
path('docs/3dsd/', DocsView, name='docs_main'),
|
||||||
|
path('docs/3dsd/v<str:version>/', DocsView, name='docs_version_page'),
|
||||||
|
path('docs/3dsd/v<str:version>/<str:art_url>/', DocsView, name='docs_art_page'),
|
||||||
]
|
]
|
||||||
@@ -9,7 +9,7 @@ from GeneralApp.funcs import get_inter_http_respose
|
|||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
def DocsView(request):
|
def DocsView(request, version=None, art_url=None):
|
||||||
|
|
||||||
Dict = {}
|
Dict = {}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# Generated by Django 4.2.7 on 2024-07-10 16:02
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('GeneralApp', '0024_block_bg_video_url_en_block_bg_video_url_ru_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='office',
|
||||||
|
name='work_time_from',
|
||||||
|
field=models.TimeField(default=datetime.datetime(2024, 7, 10, 9, 0), verbose_name='Время работы с'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='office',
|
||||||
|
name='work_time_from_en',
|
||||||
|
field=models.TimeField(default=datetime.datetime(2024, 7, 10, 9, 0), null=True, verbose_name='Время работы с'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='office',
|
||||||
|
name='work_time_from_ru',
|
||||||
|
field=models.TimeField(default=datetime.datetime(2024, 7, 10, 9, 0), null=True, verbose_name='Время работы с'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='office',
|
||||||
|
name='work_time_to',
|
||||||
|
field=models.TimeField(default=datetime.datetime(2024, 7, 10, 18, 0), verbose_name='Время работы до'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='office',
|
||||||
|
name='work_time_to_en',
|
||||||
|
field=models.TimeField(default=datetime.datetime(2024, 7, 10, 18, 0), null=True, verbose_name='Время работы до'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='office',
|
||||||
|
name='work_time_to_ru',
|
||||||
|
field=models.TimeField(default=datetime.datetime(2024, 7, 10, 18, 0), null=True, verbose_name='Время работы до'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -25,10 +25,11 @@ SECRET_KEY = 'django-insecure-0lk552&eia*_v5q$c8((o4=0d6x_t4%y-*x9p=n05nydiu)s9-
|
|||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
|
|
||||||
|
# ALLOWED_HOSTS = []
|
||||||
ALLOWED_HOSTS = ['*']
|
ALLOWED_HOSTS = ['*']
|
||||||
|
|
||||||
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
|
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
|
||||||
CSRF_TRUSTED_ORIGINS = ['https://aerbim.com']
|
CSRF_TRUSTED_ORIGINS = ['https://aerbim.com', 'http://127.0.0.1:8019/']
|
||||||
|
|
||||||
# Application definition
|
# Application definition
|
||||||
|
|
||||||
@@ -56,6 +57,7 @@ INSTALLED_APPS = [
|
|||||||
'ServicesApp',
|
'ServicesApp',
|
||||||
'SlidesApp',
|
'SlidesApp',
|
||||||
'PortfolioApp',
|
'PortfolioApp',
|
||||||
|
'DocsApp',
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
@@ -70,6 +72,8 @@ MIDDLEWARE = [
|
|||||||
# 'AuthApp.middleware.ResponseInterceptionMiddleware',
|
# 'AuthApp.middleware.ResponseInterceptionMiddleware',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
X_FRAME_OPTIONS = 'SAMEORIGIN'
|
||||||
|
|
||||||
ROOT_URLCONF = 'pAerBim.urls'
|
ROOT_URLCONF = 'pAerBim.urls'
|
||||||
|
|
||||||
TEMPLATES = [
|
TEMPLATES = [
|
||||||
@@ -208,6 +212,7 @@ CKEDITOR_JQUERY_URL = 'https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery
|
|||||||
|
|
||||||
CKEDITOR_CONFIGS = {
|
CKEDITOR_CONFIGS = {
|
||||||
'default': {
|
'default': {
|
||||||
|
'versionCheck': False,
|
||||||
'height': 291,
|
'height': 291,
|
||||||
'width': '70vw',
|
'width': '70vw',
|
||||||
'filebrowserWindowHeight': 600,
|
'filebrowserWindowHeight': 600,
|
||||||
@@ -245,7 +250,7 @@ CKEDITOR_CONFIGS = {
|
|||||||
'/',
|
'/',
|
||||||
{'name': 'links', 'items': ['Link', 'Unlink', 'Anchor', '-', 'Blockquote' ]},
|
{'name': 'links', 'items': ['Link', 'Unlink', 'Anchor', '-', 'Blockquote' ]},
|
||||||
{'name': 'insert',
|
{'name': 'insert',
|
||||||
'items': ['Image', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe']},
|
'items': ['Image', 'Update', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe']},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
Django==4.2.7
|
Django==4.2.7
|
||||||
django-admin-interface==0.26.1
|
django-admin-interface==0.26.1
|
||||||
django-ckeditor==6.7.0
|
django-ckeditor==6.7.1
|
||||||
django-colorfield==0.10.1
|
django-colorfield==0.10.1
|
||||||
django-modeltranslation==0.18.11
|
django-modeltranslation==0.18.11
|
||||||
Pillow==10.1.0
|
Pillow==10.1.0
|
||||||
|
|||||||
Reference in New Issue
Block a user