Agora, quando uma instância é exibida, o site padrão é definido como example.com (por algum motivo).
Altere isso ou adicione instruções para alterar a id do site para o domínio real que está sendo usado.
O que é pior, se eu excluir example.com da lista de sites, recebo 'Erro de servidor (500)' e a instalação se torna inutilizável.
Aqui está o que está nos logs do mailman-web:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
response = get_response(request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
response = self._get_response(request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/site-packages/postorius/views/list.py", line 593, in list_index
'domain_count': len(choosable_domains)})
File "/usr/local/lib/python2.7/site-packages/django/shortcuts.py", line 30, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/usr/local/lib/python2.7/site-packages/django/template/loader.py", line 68, in render_to_string
return template.render(context, request)
File "/usr/local/lib/python2.7/site-packages/django/template/backends/django.py", line 66, in render
return self.template.render(context)
File "/usr/local/lib/python2.7/site-packages/django/template/base.py", line 206, in render
with context.bind_template(self):
File "/usr/local/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/usr/local/lib/python2.7/site-packages/django/template/context.py", line 236, in bind_template
updates.update(processor(self.request))
File "/usr/local/lib/python2.7/site-packages/django_mailman3/context_processors.py", line 33, in common
context["site_name"] = get_current_site(request).name
File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/shortcuts.py", line 15, in get_current_site
return Site.objects.get_current(request)
File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/models.py", line 65, in get_current
return self._get_site_by_id(site_id)
File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/models.py", line 35, in _get_site_by_id
site = self.get(pk=site_id)
File "/usr/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 385, in get
self.model._meta.object_name
DoesNotExist: Site matching query does not exist.
@ulrith Sim, você precisa mudar o SITE_ID
padrão nas configurações do Django para qualquer site que você esteja usando.
Por padrão, o valor é 1 no contêiner settings.py
e corresponde a example.com.
Você deve alterá-lo para 2, que suponho que apontaria para seu domínio em settings_local.py
. Você pode adicionar o seguinte:
SITE_ID=2
@maxking Seria melhor se eu pudesse substituir example.com pelo meu domínio real com algum comando como mencionei neste comentário . Ou por consulta sql em container de banco de dados ... Você pode ajudar?
@ulrith Sim, a linha de comando do Django o deixará em um REPL python onde você pode fazer o que quiser, até mesmo para o banco de dados de produção ;-)
maxking<strong i="7">@mailman</strong>:~$ docker exec -it mailman-web python manage.py shell
Python 2.7.13 (default, Jun 21 2017, 18:14:15)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.db import models
>>> from django.contrib.sites.models import Site
>>> Site.objects.all()
<QuerySet [<Site: lists.araj.me>]>
>>> Site.objects.create(name='Random Domain', domain='mail.araj.me')
<Site: mail.araj.me>
>>> Site.objects.all()
<QuerySet [<Site: lists.araj.me>, <Site: mail.araj.me>]>
>>> for each in Site.objects.all():
... print(each.domain, each.id)
...
(u'lists.araj.me', 2)
(u'mail.araj.me', 3)
Se você precisar ler mais sobre isso, aqui está um link para o framework Sites do Django.
@maxking Na verdade, não estou familiarizado com Python. Você poderia me fornecer um trecho de código (de preferência um liner) que substituirá Site: example.com por Site: mydomain.tld para o Mailman 3 recém-instalado?
OK, então o Django cria o próprio site examples.com
padrão e não há como interromper esse comportamento.
Então, aqui estão suas opções se você deseja criar um novo site durante a inicialização.
python manage.py loaddata <nameoffixture>
e o django carrega esses dados no banco de dados. Por exemplo:O arquivo abaixo foi salvo em fixtures/gen_site.yaml
:
- model: sites.Site
pk: 100
fields:
domain: gmail.com
name: Google
Então, você executa python manage.py loaddata gen_site
e seu site é criado automaticamente. Então você muda seu SITE_ID=100
no settings_local.py
e tudo deve funcionar!
No entanto, fazer isso agora com os contêineres provavelmente é difícil, pois não há uma maneira fácil de realmente executar comandos personalizados na inicialização (também chamado de ponto de entrada na terminologia do Docker). Abri um novo exemplar nº 61 para rastrear esse problema.
python manage.py shell -c "from django.contrib.sites.models import Site; mysite,_=Site.objects.get_or_create(id=101, name='mysite.tld', domain='mysite.tld'); print(mysite.id, mysite.name)"
Observe que o comando acima é destinado ao django, então você precisa anexar docker-compose exec -T mailman-web
antes do comando acima.
Este comando criará um novo site denominado mysite.tld
. Ele também imprimirá id
que você então teria que colocar em SITE_ID=101
e reiniciar sua instância do Django para que isso tenha efeito. Este comando não falhará se o site já existir no banco de dados.
Eu diria que este também não é a melhor maneira de fazê-lo porque em primeiro lugar, você precisa reiniciar o recipiente para que isso tenha efeito (somente primeira vez, mas que é igualmente ruim) e em segundo lugar, não há nenhuma maneira de editar automaticamente o settings_local.py
para refletir o novo SITE_ID
sem intervenção manual, a menos, claro, se você escrever alguma mágica sed
ou awk
.
example.com
e atualizá-lo para o domínio que desejar.python manage.py shell -c "from django.contrib.sites.models import Site; Site.objects.filter(domain='example.com').update(name='My Site', domain='mysite.tld')"
Isso não exigiria nenhuma mudança em lugar nenhum, mas em meu teste local descobri que o nome de exibição no topo não muda a menos que eu reinicie o servidor Django, e isso só será necessário na primeira vez. A meu ver, esta parece ser a melhor opção, depois da primeira, para a qual estou disposto a adicionar suporte nas imagens do container.
@maxking A última opção funciona
Deve ser resolvido.
A variável de ambiente DEFAULT_FROM_DOMAIN agora também substitui o domínio padrão example.com.
A descrição, entretanto, não é alterada e pode ser alterada no site de administração do Django.
Fixado em # 95