diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 9f021d5..26e0347 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -8,4 +8,5 @@ django-bootstrap5==21.3 django-extensions==3.1.5 django-import-export==2.7.1 django-localflavor==3.1 +django-tinymce==3.4.0 django-weasyprint==2.1.0 \ No newline at end of file diff --git a/sigi/apps/eventos/admin.py b/sigi/apps/eventos/admin.py index 8cba966..9d8b745 100644 --- a/sigi/apps/eventos/admin.py +++ b/sigi/apps/eventos/admin.py @@ -1,31 +1,10 @@ -# -*- coding: utf-8 -*- -# -# sigi.apps.eventos.admin -# -# Copyright (C) 2015 Interlegis -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -from django import forms from django.contrib import admin -from django.db import models from django.http import HttpResponseRedirect from django.utils.translation import gettext as _ +from tinymce.models import HTMLField +from tinymce.widgets import AdminTinyMCE from sigi.apps.eventos.models import (ModeloDeclaracao, Modulo, TipoEvento, Funcao, Evento, Equipe, Convite, Anexo) -from sigi.apps.eventos.views import adicionar_eventos_carrinho from sigi.apps.eventos.forms import EventoAdminForm @admin.register(TipoEvento) @@ -40,6 +19,8 @@ class FuncaoAdmin(admin.ModelAdmin): @admin.register(ModeloDeclaracao) class ModeloDeclaracaoAdmin(admin.ModelAdmin): list_display = ('nome', 'formato') + formfield_overrides = {HTMLField: {'widget': AdminTinyMCE}} + class EquipeInline(admin.TabularInline): model = Equipe @@ -68,25 +49,6 @@ class EventoAdmin(admin.ModelAdmin): search_fields = ('nome', 'tipo_evento__nome', 'casa_anfitria__search_text', 'municipio__search_text', 'solicitante') inlines = (EquipeInline, ConviteInline, ModuloInline, AnexoInline) - actions = ['adicionar_eventos', ] - - def adicionar_eventos(self, request, queryset): - if 'carrinho_eventos' in request.session: - q1 = len(request.session['carrinho_eventos']) - else: - q1 = 0 - response = adicionar_eventos_carrinho(request, queryset=queryset) - q2 = len(request.session['carrinho_eventos']) - quant = q2 - q1 - if quant: - self.message_user(request, str(q2 - q1) + " " + - _("Eventos adicionados no carrinho")) - else: - self.message_user(request, _("Os Eventos selecionados " - "já foram adicionados anteriormente")) - return HttpResponseRedirect('.') - adicionar_eventos.short_description = _("Armazenar eventos no carrinho " - "para exportar") def lookup_allowed(self, lookup, value): return (super(EventoAdmin, self).lookup_allowed(lookup, value) or diff --git a/sigi/apps/eventos/apps.py b/sigi/apps/eventos/apps.py new file mode 100644 index 0000000..8ce1c87 --- /dev/null +++ b/sigi/apps/eventos/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ + +class EventosConfig(AppConfig): + name = 'sigi.apps.eventos' + verbose_name = _('Eventos Interlegis') diff --git a/sigi/apps/eventos/forms.py b/sigi/apps/eventos/forms.py index 6df7144..b95d7d4 100644 --- a/sigi/apps/eventos/forms.py +++ b/sigi/apps/eventos/forms.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - from django import forms from django.utils.translation import gettext as _ from sigi.apps.eventos.models import ModeloDeclaracao, Evento diff --git a/sigi/apps/eventos/migrations/0001_initial.py b/sigi/apps/eventos/migrations/0001_initial.py index 07a15b6..f841628 100644 --- a/sigi/apps/eventos/migrations/0001_initial.py +++ b/sigi/apps/eventos/migrations/0001_initial.py @@ -19,8 +19,8 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('data_convite', models.DateField(verbose_name='Data do convite')), ('aceite', models.BooleanField(default=False, verbose_name='Aceitou o convite')), - ('participo', models.BooleanField(default=False, verbose_name='Participou do evento')), - ('casa', models.ForeignKey(verbose_name='Casa convidada', to='casas.CasaLegislativa')), + ('participou', models.BooleanField(default=False, verbose_name='Participou do evento')), + ('casa', models.ForeignKey(verbose_name='Casa convidada', to='casas.CasaLegislativa', on_delete=models.CASCADE)), ], options={ 'ordering': ('evento', 'casa', '-data_convite'), @@ -56,9 +56,8 @@ class Migration(migrations.Migration): ('status', models.CharField(max_length=1, verbose_name='Status', choices=[(b'P', 'Previs\xe3o'), (b'A', 'A confirmar'), (b'O', 'Confirmado'), (b'R', 'Realizado'), (b'C', 'Cancelado')])), ('data_cancelamento', models.DateField(null=True, verbose_name='Data de cancelamento', blank=True)), ('motivo_cancelamento', models.TextField(verbose_name='Motivo do cancelamento', blank=True)), - ('curso_moodle_id', models.IntegerField(null=True, verbose_name='Curso saberes', blank=True)), - ('casa_anfitria', models.ForeignKey(verbose_name='Casa anfitri\xe3', blank=True, to='casas.CasaLegislativa', null=True)), - ('municipio', models.ForeignKey(to='contatos.Municipio')), + ('casa_anfitria', models.ForeignKey(verbose_name='Casa anfitri\xe3', blank=True, to='casas.CasaLegislativa', null=True, on_delete=models.CASCADE)), + ('municipio', models.ForeignKey(to='contatos.Municipio', on_delete=models.CASCADE)), ], options={ 'ordering': ('-data_inicio',), @@ -97,37 +96,37 @@ class Migration(migrations.Migration): migrations.AddField( model_name='evento', name='tipo_evento', - field=models.ForeignKey(to='eventos.TipoEvento'), + field=models.ForeignKey(to='eventos.TipoEvento', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='equipe', name='evento', - field=models.ForeignKey(to='eventos.Evento'), + field=models.ForeignKey(to='eventos.Evento', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='equipe', name='funcao', - field=models.ForeignKey(verbose_name='Fun\xe7\xe3o na equipe', to='eventos.Funcao'), + field=models.ForeignKey(verbose_name='Fun\xe7\xe3o na equipe', to='eventos.Funcao', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='equipe', name='membro', - field=models.ForeignKey(related_name='equipe_evento', to='servidores.Servidor'), + field=models.ForeignKey(related_name='equipe_evento', to='servidores.Servidor', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='convite', name='evento', - field=models.ForeignKey(to='eventos.Evento'), + field=models.ForeignKey(to='eventos.Evento', on_delete=models.CASCADE), preserve_default=True, ), migrations.AddField( model_name='convite', name='servidor', - field=models.ForeignKey(verbose_name='Servidor que convido', to='servidores.Servidor'), + field=models.ForeignKey(verbose_name='Servidor que convido', to='servidores.Servidor', on_delete=models.CASCADE), preserve_default=True, ), migrations.AlterUniqueTogether( diff --git a/sigi/apps/eventos/migrations/0002_auto_20151016_1449.py b/sigi/apps/eventos/migrations/0002_auto_20151016_1449.py index 13e25e6..08aad72 100644 --- a/sigi/apps/eventos/migrations/0002_auto_20151016_1449.py +++ b/sigi/apps/eventos/migrations/0002_auto_20151016_1449.py @@ -11,10 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AlterField( - model_name='evento', - name='curso_moodle_id', - field=models.IntegerField(blank=True, null=True, verbose_name='Curso saberes', choices=[(None, '---------'), (None, "Erro ao acessar o saberes: 'invalidtoken (moodle_exception): Token inv\xe1lido - token n\xe3o encontrado'")]), - preserve_default=True, - ), ] diff --git a/sigi/apps/eventos/migrations/0003_auto_20151104_0810.py b/sigi/apps/eventos/migrations/0003_auto_20151104_0810.py index d4965cd..01fcd86 100644 --- a/sigi/apps/eventos/migrations/0003_auto_20151104_0810.py +++ b/sigi/apps/eventos/migrations/0003_auto_20151104_0810.py @@ -11,10 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AlterField( - model_name='evento', - name='curso_moodle_id', - field=models.IntegerField(blank=True, null=True, verbose_name='Curso saberes', choices=[(None, '---------'), (59L, 'Oficina Interlegis em Montes Claros, MG')]), - preserve_default=True, - ), ] diff --git a/sigi/apps/eventos/migrations/0004_auto_20160719_0920.py b/sigi/apps/eventos/migrations/0004_auto_20160719_0920.py index f2b334c..6e70d8b 100644 --- a/sigi/apps/eventos/migrations/0004_auto_20160719_0920.py +++ b/sigi/apps/eventos/migrations/0004_auto_20160719_0920.py @@ -11,10 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AlterField( - model_name='evento', - name='curso_moodle_id', - field=models.IntegerField(blank=True, null=True, verbose_name='Curso saberes', choices=[(None, '---------'), (851L, 'Implanta\xe7\xe3o SAPL em Cuiab\xe1')]), - preserve_default=True, - ), ] diff --git a/sigi/apps/eventos/migrations/0004_remove_evento_curso_moodle_id.py b/sigi/apps/eventos/migrations/0004_remove_evento_curso_moodle_id.py index 91017e0..6e70d8b 100644 --- a/sigi/apps/eventos/migrations/0004_remove_evento_curso_moodle_id.py +++ b/sigi/apps/eventos/migrations/0004_remove_evento_curso_moodle_id.py @@ -11,8 +11,4 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RemoveField( - model_name='evento', - name='curso_moodle_id', - ), ] diff --git a/sigi/apps/eventos/migrations/0005_auto_20210406_1945.py b/sigi/apps/eventos/migrations/0005_auto_20210406_1945.py index 17694f0..2c440ae 100644 --- a/sigi/apps/eventos/migrations/0005_auto_20210406_1945.py +++ b/sigi/apps/eventos/migrations/0005_auto_20210406_1945.py @@ -15,13 +15,13 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='convite', name='casa', - field=models.ForeignKey(verbose_name='Casa convidada', to='casas.Orgao'), + field=models.ForeignKey(verbose_name='Casa convidada', to='casas.Orgao', on_delete=models.CASCADE), preserve_default=True, ), migrations.AlterField( model_name='evento', name='casa_anfitria', - field=models.ForeignKey(verbose_name='Casa anfitri\xe3', blank=True, to='casas.Orgao', null=True), + field=models.ForeignKey(verbose_name='Casa anfitri\xe3', blank=True, to='casas.Orgao', null=True, on_delete=models.CASCADE), preserve_default=True, ), ] diff --git a/sigi/apps/eventos/migrations/0010_modulo.py b/sigi/apps/eventos/migrations/0010_modulo.py index a03ce5a..41e4b98 100644 --- a/sigi/apps/eventos/migrations/0010_modulo.py +++ b/sigi/apps/eventos/migrations/0010_modulo.py @@ -25,7 +25,7 @@ class Migration(migrations.Migration): ('carga_horaria', models.PositiveIntegerField(default=0, verbose_name='carga hor\xe1ria')), ('qtde_participantes', models.PositiveIntegerField(default=0, help_text='Deixar Zero significa que todos os participantes do evento participaram do m\xf3dulo', verbose_name='n\xfamero de participantes')), ('apresentador', models.ForeignKey(related_name='modulo_apresentador', on_delete=django.db.models.deletion.PROTECT, verbose_name='Apresentador', blank=True, to='servidores.Servidor', null=True)), - ('evento', models.ForeignKey(verbose_name='Evento', to='eventos.Evento')), + ('evento', models.ForeignKey(verbose_name='Evento', to='eventos.Evento', on_delete=models.CASCADE)), ('monitor', models.ForeignKey(related_name='modulo_monitor', on_delete=django.db.models.deletion.PROTECT, blank=True, to='servidores.Servidor', help_text='Monitor, mediador, auxiliar, etc.', null=True, verbose_name='Monitor')), ], options={ diff --git a/sigi/apps/eventos/migrations/0015_anexo.py b/sigi/apps/eventos/migrations/0015_anexo.py index 8dab092..ac36e48 100644 --- a/sigi/apps/eventos/migrations/0015_anexo.py +++ b/sigi/apps/eventos/migrations/0015_anexo.py @@ -19,7 +19,7 @@ class Migration(migrations.Migration): ('arquivo', models.FileField(max_length=500, upload_to=b'apps/eventos/anexo/arquivo')), ('descricao', models.CharField(max_length=b'70', verbose_name='descri\xe7\xe3o')), ('data_pub', models.DateTimeField(default=datetime.datetime.now, verbose_name='data da publica\xe7\xe3o do anexo')), - ('evento', models.ForeignKey(verbose_name='evento', to='eventos.Evento')), + ('evento', models.ForeignKey(verbose_name='evento', to='eventos.Evento', on_delete=models.CASCADE)), ], options={ 'ordering': ('-data_pub',), diff --git a/sigi/apps/eventos/migrations/0017_alter_anexo_arquivo_alter_anexo_descricao_and_more.py b/sigi/apps/eventos/migrations/0017_alter_anexo_arquivo_alter_anexo_descricao_and_more.py new file mode 100644 index 0000000..19cd7d7 --- /dev/null +++ b/sigi/apps/eventos/migrations/0017_alter_anexo_arquivo_alter_anexo_descricao_and_more.py @@ -0,0 +1,90 @@ +# Generated by Django 4.0.1 on 2022-01-19 16:24 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('servidores', '0008_alter_servico_id_alter_servidor_foto_and_more'), + ('eventos', '0016_merge'), + ] + + operations = [ + migrations.AlterField( + model_name='anexo', + name='arquivo', + field=models.FileField(max_length=500, upload_to='apps/eventos/anexo/arquivo'), + ), + migrations.AlterField( + model_name='anexo', + name='descricao', + field=models.CharField(max_length=70, verbose_name='descrição'), + ), + migrations.AlterField( + model_name='anexo', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='convite', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='convite', + name='servidor', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='servidores.servidor', verbose_name='Servidor que convidou'), + ), + migrations.AlterField( + model_name='equipe', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='evento', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='evento', + name='status', + field=models.CharField(choices=[('P', 'Previsão'), ('A', 'A confirmar'), ('O', 'Confirmado'), ('R', 'Realizado'), ('C', 'Cancelado')], max_length=1, verbose_name='Status'), + ), + migrations.AlterField( + model_name='funcao', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='modelodeclaracao', + name='formato', + field=models.CharField(choices=[('A4 portrait', 'A4 retrato'), ('A4 landscape', 'A4 paisagem'), ('letter portrait', 'Carta retrato'), ('letter landscape', 'Carta paisagem')], default='A4 portrait', max_length=30, verbose_name='Formato da página'), + ), + migrations.AlterField( + model_name='modelodeclaracao', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='modulo', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='modulo', + name='tipo', + field=models.CharField(choices=[('A', 'Aula'), ('P', 'Palestra'), ('R', 'Apresentação')], max_length=1, verbose_name='Tipo'), + ), + migrations.AlterField( + model_name='tipoevento', + name='categoria', + field=models.CharField(choices=[('C', 'Curso'), ('E', 'Encontro'), ('O', 'Oficina'), ('S', 'Seminário'), ('V', 'Visita')], max_length=1, verbose_name='Categoaria'), + ), + migrations.AlterField( + model_name='tipoevento', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + ] diff --git a/sigi/apps/eventos/models.py b/sigi/apps/eventos/models.py index beb450a..aaddd83 100644 --- a/sigi/apps/eventos/models.py +++ b/sigi/apps/eventos/models.py @@ -1,17 +1,14 @@ -# -*- coding: utf-8 -*- from datetime import datetime -import random from django.db import models from django.db.models import Sum -from django.utils.functional import lazy from django.utils.translation import gettext as _ -from django.contrib.contenttypes import generic from sigi.apps.casas.models import Orgao from sigi.apps.contatos.models import Municipio from sigi.apps.servidores.models import Servidor from django.core.exceptions import ValidationError from tinymce.models import HTMLField + class TipoEvento(models.Model): CATEGORIA_CHOICES = ( ('C', _('Curso')), @@ -31,7 +28,7 @@ class TipoEvento(models.Model): ordering = ("nome",) verbose_name, verbose_name_plural = _("Tipo de evento"), _("Tipos de evento") - def __unicode__(self): + def __str__(self): return self.nome class Evento(models.Model): @@ -93,12 +90,11 @@ class Evento(models.Model): ordering = ("-data_inicio",) verbose_name, verbose_name_plural = _("Evento"), _("Eventos") - def __unicode__(self): - return _("%(nome)s (%(tipo_evento)s): de %(data_inicio)s a %(data_termino)s") % dict( - nome=self.nome, - tipo_evento=unicode(self.tipo_evento), - data_inicio=self.data_inicio, - data_termino=self.data_termino) + def __str__(self): + return _( + f"{self.nome} ({self.tipo_evento}): " + f"de {self.data_inicio} a {self.data_termino}" + ) def save(self, *args, **kwargs): if self.status != 'C': @@ -121,7 +117,7 @@ class Funcao(models.Model): ordering = ("nome",) verbose_name, verbose_name_plural = _("Função"), _("Funções") - def __unicode__(self): + def __str__(self): return self.nome class Equipe(models.Model): @@ -145,8 +141,8 @@ class Equipe(models.Model): ordering = ('evento', 'funcao', 'membro',) verbose_name, verbose_name_plural = _("Membro da equipe"), _("Membros da equipe") - def __unicode__(self): - return "%s (%s)" % (unicode(self.membro), unicode(self.funcao),) + def __str__(self): + return _(f"{self.membro} ({self.funcao})") class Convite(models.Model): evento = models.ForeignKey( @@ -188,7 +184,7 @@ class Modulo(models.Model): ('P', _('Palestra')), ('R', _('Apresentação')), ) - evento = models.ForeignKey(Evento, verbose_name=_("Evento")) + evento = models.ForeignKey(Evento, verbose_name=_("Evento"), on_delete=models.CASCADE) nome = models.CharField(_("Nome"), max_length=100) descricao = models.TextField(_("Descrição do módulo")) tipo = models.CharField(_('Tipo'), max_length=1, choices=TIPO_CHOICES) @@ -235,11 +231,8 @@ class Modulo(models.Model): verbose_name = _("Módulo do evento") verbose_name_plural = _("Módulos do evento") - def __unicode__(self): - return _("{nome} ({tipo})").format( - nome=self.nome, - tipo=self.get_tipo_display() - ) + def __str__(self): + return _(f"{self.nome} ({self.get_tipo_display()})") class ModeloDeclaracao(models.Model): FORMATO_CHOICES = ( @@ -279,11 +272,8 @@ class ModeloDeclaracao(models.Model): verbose_name = _("modelo de declaração") verbose_name_plural = _("modelos de declaração") - def __unicode__(self): - return _("{nome} ({formato})").format( - nome=self.nome, - formato=self.get_formato_display() - ) + def __str__(self): + return _(f"{self.nome} ({self.get_formato_display()})") class Anexo(models.Model): evento = models.ForeignKey( @@ -293,7 +283,7 @@ class Anexo(models.Model): ) # caminho no sistema para o documento anexo arquivo = models.FileField(upload_to='apps/eventos/anexo/arquivo', max_length=500) - descricao = models.CharField(_('descrição'), max_length='70') + descricao = models.CharField(_('descrição'), max_length=70) data_pub = models.DateTimeField( _('data da publicação do anexo'), default=datetime.now @@ -302,5 +292,5 @@ class Anexo(models.Model): class Meta: ordering = ('-data_pub',) - def __unicode__(self): - return unicode("%s publicado em %s" % (self.descricao, self.data_pub)) + def __str__(self): + return _(f"{self.descricao} publicado em {self.data_pub}") diff --git a/sigi/settings/base.py b/sigi/settings/base.py index 0fd21dc..b23da5f 100644 --- a/sigi/settings/base.py +++ b/sigi/settings/base.py @@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/4.0/ref/settings/ """ from pathlib import Path +from django.utils.translation import gettext_lazy as _ # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -26,10 +27,14 @@ INSTALLED_APPS = [ 'sigi.apps.convenios', 'sigi.apps.inventario', 'sigi.apps.servicos', + 'sigi.apps.eventos', 'localflavor', 'import_export', + 'tinymce', 'django_bootstrap5', 'django.forms', + # 'material', + # 'material.admin', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -104,4 +109,29 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # https://django-import-export.readthedocs.io/en/latest/installation.html#settings IMPORT_EXPORT_USE_TRANSACTIONS = True -IMPORT_EXPORT_SKIP_ADMIN_LOG = True \ No newline at end of file +IMPORT_EXPORT_SKIP_ADMIN_LOG = True + +# Django Material Admin settings +# + +# MATERIAL_ADMIN_SITE = { +# 'HEADER': _('SIGI'), +# 'TITLE': _('SIGI - Sistema de Informações do Interlegis'), +# 'FAVICON': 'img/favicon.ico', +# # 'MAIN_BG_COLOR': 'color', # Admin site main color, css color should be specified +# # 'MAIN_HOVER_COLOR': 'color', # Admin site main hover color, css color should be specified +# 'PROFILE_PICTURE': 'img/interlegis.jpeg', # Admin site profile picture (path to static should be specified) +# 'PROFILE_BG': 'img/engitec.jpeg', # Admin site profile background (path to static should be specified) +# 'LOGIN_LOGO': 'img/interlegis.jpeg', # Admin site logo on login page (path to static should be specified) +# 'LOGOUT_BG': 'img/engitec.jpeg', # Admin site background on login/logout pages (path to static should be specified) +# 'SHOW_THEMES': True, # Show default admin themes button +# 'TRAY_REVERSE': True, # Hide object-tools and additional-submit-line by default +# 'NAVBAR_REVERSE': True, # Hide side navbar by default +# # 'SHOW_COUNTS': True, # Show instances counts for each model +# # 'APP_ICONS': { # Set icons for applications(lowercase), including 3rd party apps, {'application_name': 'material_icon_name', ...} +# # 'sites': 'send', +# # }, +# # 'MODEL_ICONS': { # Set icons for models(lowercase), including 3rd party models, {'model_name': 'material_icon_name', ...} +# # 'site': 'contact_mail', +# # } +# } \ No newline at end of file diff --git a/sigi/static/img/favicon.ico b/sigi/static/img/favicon.ico new file mode 100644 index 0000000..d5df681 Binary files /dev/null and b/sigi/static/img/favicon.ico differ diff --git a/sigi/urls.py b/sigi/urls.py index 14875ef..819b9bf 100644 --- a/sigi/urls.py +++ b/sigi/urls.py @@ -20,6 +20,7 @@ from django.conf import settings urlpatterns = [ path('admin/casas/', include('sigi.apps.casas.urls')), path('admin/', admin.site.urls), + path('tinymce/', include('tinymce.urls')), ] if settings.DEBUG: