À l'heure actuelle, lorsqu'une instance apparaît, le site par défaut est défini sur example.com (pour une raison quelconque).
Modifiez cela ou ajoutez des instructions pour changer l'identifiant du site en le domaine réel utilisé.
Pire encore, si je supprime example.com de la liste des sites, j'obtiens une "erreur de serveur (500)" et l'installation devient inutilisable.
Voici ce que contiennent les journaux 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 Oui, vous devez modifier le SITE_ID
par défaut dans les paramètres de Django pour le site que vous utilisez.
Par défaut, la valeur est 1 dans le settings.py
du conteneur et elle correspond à example.com.
Vous devriez le remplacer par 2, ce qui, je suppose, pointerait vers votre domaine dans settings_local.py
. Vous pouvez ajouter les éléments suivants :
SITE_ID=2
@maxking Ce serait mieux si je pouvais remplacer example.com par mon domaine réel avec une commande comme je l'ai mentionné dans ce commentaire . Ou par requête SQL dans le conteneur de la base de données... Pouvez-vous m'aider ?
@ulrith Oui, la ligne de commande Django vous déposera dans un REPL python où vous pourrez faire tout ce que vous voulez, même dans la base de données de production ;-)
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)
Si vous avez besoin d'en savoir plus à ce sujet, voici un lien vers le framework Sites de Django.
@maxking En fait, je ne connais pas Python. Pourriez-vous s'il vous plaît me donner un extrait de code (idéalement une doublure) qui remplacera Site : example.com par Site : mydomain.tld pour le Mailman 3 nouvellement installé ?
OK, il s'avère que Django crée lui-même le site examples.com
par défaut et il n'y a aucun moyen d'arrêter ce comportement.
Voici donc vos options si vous souhaitez créer un nouveau site Web au démarrage.
python manage.py loaddata <nameoffixture>
et django charge ces données dans la base de données. Par example:Le fichier ci-dessous est enregistré sous fixtures/gen_site.yaml
:
- model: sites.Site
pk: 100
fields:
domain: gmail.com
name: Google
Ensuite, vous exécutez python manage.py loaddata gen_site
et votre site est automatiquement créé. Ensuite, vous changez votre SITE_ID=100
dans le settings_local.py
et les choses devraient fonctionner !
Cependant, le faire maintenant avec les conteneurs est probablement difficile car il n'y a pas de moyen simple d'exécuter des commandes personnalisées au démarrage (également appelé point d'entrée dans la terminologie Docker). J'ai ouvert un nouveau numéro 61 pour suivre ce problème.
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)"
Notez que la commande ci-dessus est destinée à django, vous devez donc ajouter docker-compose exec -T mailman-web
avant la commande ci-dessus.
Cette commande créera un nouveau site nommé mysite.tld
. Il imprimera également les id
que vous devrez ensuite mettre sous SITE_ID=101
et redémarrera votre instance Django pour que cela prenne effet. Cette commande n'échouera pas si le site existe déjà dans la base de données.
Je dirais que ce n'est pas non plus la meilleure façon de le faire car premièrement, vous devez redémarrer le conteneur pour que cela prenne effet (seulement la première fois, mais c'est tout aussi mauvais) et deuxièmement, il n'y a aucun moyen de modifier automatiquement le settings_local.py
pour refléter le nouveau SITE_ID
sans intervention manuelle, à moins bien sûr si vous écrivez awk
magie sed
ou awk
.
example.com
et à le mettre à jour vers le domaine de votre choix.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')"
Cela ne nécessiterait aucun changement nulle part, mais lors de mes tests locaux, j'ai découvert que le nom d'affichage en haut ne change pas à moins que je redémarre le serveur Django, et il ne sera requis que pour la toute première fois. Selon moi, cela semble être la meilleure option, après la première, pour laquelle je suis prêt à ajouter une prise en charge dans les images de conteneur.
@maxking La dernière option fonctionne à merveille ! Merci
Devrait être résolu.
La variable d'environnement DEFAULT_FROM_DOMAIN remplace désormais également le domaine example.com par défaut.
La description n'est cependant pas modifiée et peut être modifiée à partir du site d'administration de Django.
Corrigé dans #95