<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Crème CRM - Tous les forums]]></title>
		<link>https://www.cremecrm.com/forum/</link>
		<description><![CDATA[Crème CRM - https://www.cremecrm.com/forum]]></description>
		<pubDate>Tue, 05 May 2026 12:44:18 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Crème 2.8]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=286</link>
			<pubDate>Tue, 07 Apr 2026 14:20:17 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=286</guid>
			<description><![CDATA[On Avril 7<span style="font-size: xx-small;" class="mycode_size">th</span> 2026 the version 2.8 of CrèmeCRM has been released, 7 months after Creme 2.7 (Septembre 2<span style="font-size: xx-small;" class="mycode_size">nd</span> 2025).<br />
<br />
It's a relatively smaller version as usual, in order to be better synchronised with Django releases, and so avoiding period when Creme is supported but the underlying version of Django is not supported anymore.<br />
<br />
We a have prioritized small and middle features, but we managed to implement a lot of.<br />
<br />
On technical side, Python 3.14 is now officially supported.<br />
<br />
On user side, major changes are:<br />
- Many improvements on credentials have be made:<br />
  - users can have several roles (<a href="https://www.cremecrm.com/forum/showthread.php?tid=282" target="_blank" rel="noopener" class="mycode_url">details</a>).<br />
  - roles can be disabled.<br />
  - roles manage now the types of entity which you are allowed to list, and 2 special permissions can be set: users management & roles management (you had to be superuser before).<br />
- You can now pin your favorite entities  (<a href="https://www.cremecrm.com/forum/showthread.php?tid=283" target="_blank" rel="noopener" class="mycode_url">details</a>). The way the last viewed entities has been improved too.<br />
- The HTML text editor (used for the HTML body of emails for example) has been upgraded; it's used in more places.<br />
- Some columns of list-view display now some results computed on all entities of the list:<br />
  - the sum and the average of totals (with & without VAT) of Invoices/Quotes/Credit notes/Sales Orders.<br />
  - the sum and the average of estimated & made sales of Opportunities.<br />
- You can now download several Documents, Invoices or Quotes as one '.zip' archive (<a href="https://www.cremecrm.com/forum/showthread.php?tid=284" target="_blank" rel="noopener" class="mycode_url">details</a>).<br />
- The custom fields can now have a description and a default value (<a href="https://www.cremecrm.com/forum/showthread.php?tid=285" target="_blank" rel="noopener" class="mycode_url">details</a>).<br />
<br />
Hope you'll enjoy this release!]]></description>
			<content:encoded><![CDATA[On Avril 7<span style="font-size: xx-small;" class="mycode_size">th</span> 2026 the version 2.8 of CrèmeCRM has been released, 7 months after Creme 2.7 (Septembre 2<span style="font-size: xx-small;" class="mycode_size">nd</span> 2025).<br />
<br />
It's a relatively smaller version as usual, in order to be better synchronised with Django releases, and so avoiding period when Creme is supported but the underlying version of Django is not supported anymore.<br />
<br />
We a have prioritized small and middle features, but we managed to implement a lot of.<br />
<br />
On technical side, Python 3.14 is now officially supported.<br />
<br />
On user side, major changes are:<br />
- Many improvements on credentials have be made:<br />
  - users can have several roles (<a href="https://www.cremecrm.com/forum/showthread.php?tid=282" target="_blank" rel="noopener" class="mycode_url">details</a>).<br />
  - roles can be disabled.<br />
  - roles manage now the types of entity which you are allowed to list, and 2 special permissions can be set: users management & roles management (you had to be superuser before).<br />
- You can now pin your favorite entities  (<a href="https://www.cremecrm.com/forum/showthread.php?tid=283" target="_blank" rel="noopener" class="mycode_url">details</a>). The way the last viewed entities has been improved too.<br />
- The HTML text editor (used for the HTML body of emails for example) has been upgraded; it's used in more places.<br />
- Some columns of list-view display now some results computed on all entities of the list:<br />
  - the sum and the average of totals (with & without VAT) of Invoices/Quotes/Credit notes/Sales Orders.<br />
  - the sum and the average of estimated & made sales of Opportunities.<br />
- You can now download several Documents, Invoices or Quotes as one '.zip' archive (<a href="https://www.cremecrm.com/forum/showthread.php?tid=284" target="_blank" rel="noopener" class="mycode_url">details</a>).<br />
- The custom fields can now have a description and a default value (<a href="https://www.cremecrm.com/forum/showthread.php?tid=285" target="_blank" rel="noopener" class="mycode_url">details</a>).<br />
<br />
Hope you'll enjoy this release!]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[New feature (Creme 2.8): improved custom fields]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=285</link>
			<pubDate>Tue, 07 Apr 2026 14:11:20 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=285</guid>
			<description><![CDATA[With Creme 2.8, custom fields have been improved with 2 new features:<br />
 - they can get a description; if it's filled, it's used in forms as help text in the corresponding field.<br />
 - they can get a default value; if it's filled, it's used in creation forms as initial value in the corresponding field.<br />
<br />
The configuration of custom fields has slightly changed in order to get these new features. The form to create a new custom field is now a wizard with 2 steps. In the first one, the description has appeared :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_custom_fields1.png" loading="lazy"  alt="[Image: creme_28_EN_custom_fields1.png]" class="mycode_img" /><br />
<br />
In the second step, you can define a default value (excepted for fields with type "choices" et "multiple choices"):<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_custom_fields2.png" loading="lazy"  alt="[Image: creme_28_EN_custom_fields2.png]" class="mycode_img" /><br />
<br />
The form for the related type of entity will look like:<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_custom_fields3.png" loading="lazy"  alt="[Image: creme_28_EN_custom_fields3.png]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[With Creme 2.8, custom fields have been improved with 2 new features:<br />
 - they can get a description; if it's filled, it's used in forms as help text in the corresponding field.<br />
 - they can get a default value; if it's filled, it's used in creation forms as initial value in the corresponding field.<br />
<br />
The configuration of custom fields has slightly changed in order to get these new features. The form to create a new custom field is now a wizard with 2 steps. In the first one, the description has appeared :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_custom_fields1.png" loading="lazy"  alt="[Image: creme_28_EN_custom_fields1.png]" class="mycode_img" /><br />
<br />
In the second step, you can define a default value (excepted for fields with type "choices" et "multiple choices"):<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_custom_fields2.png" loading="lazy"  alt="[Image: creme_28_EN_custom_fields2.png]" class="mycode_img" /><br />
<br />
The form for the related type of entity will look like:<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_custom_fields3.png" loading="lazy"  alt="[Image: creme_28_EN_custom_fields3.png]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[New feature (Creme 2.8) : multi download]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=284</link>
			<pubDate>Tue, 07 Apr 2026 14:09:54 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=284</guid>
			<description><![CDATA[Creme 2.8 allows to perform "multiple" download from the list-views of the following types of entities:<br />
 - Documents<br />
 - Invoices & Quotes<br />
<br />
You can now select several entities, then download a .zip archive:<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_multi_dl.png" loading="lazy"  alt="[Image: creme_28_EN_multi_dl.png]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[Creme 2.8 allows to perform "multiple" download from the list-views of the following types of entities:<br />
 - Documents<br />
 - Invoices & Quotes<br />
<br />
You can now select several entities, then download a .zip archive:<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_multi_dl.png" loading="lazy"  alt="[Image: creme_28_EN_multi_dl.png]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[New feature (Creme 2.8): entity pinning]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=283</link>
			<pubDate>Tue, 07 Apr 2026 14:08:51 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=283</guid>
			<description><![CDATA[You can now pin the entities you want often to access (i.e. to go to their detail-view).<br />
<br />
In the header block, a new button has appeared :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_pin1.png" loading="lazy"  alt="[Image: creme_28_EN_pin1.png]" class="mycode_img" /><br />
<br />
When an entity is pinned, a small sticker is displayed :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_pin2.png" loading="lazy"  alt="[Image: creme_28_EN_pin2.png]" class="mycode_img" /><br />
<br />
Then you can get the last pinned entities in the menu entry "Quick access"; this entry replaces the entry which displayed only the last viewed items, and displays these ones and also the pinned entities:<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_pin3.png" loading="lazy"  alt="[Image: creme_28_EN_pin3.png]" class="mycode_img" /><br />
<br />
A new block is available for home; it displays all the pinned entities :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_pin4.png" loading="lazy"  alt="[Image: creme_28_EN_pin4.png]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[You can now pin the entities you want often to access (i.e. to go to their detail-view).<br />
<br />
In the header block, a new button has appeared :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_pin1.png" loading="lazy"  alt="[Image: creme_28_EN_pin1.png]" class="mycode_img" /><br />
<br />
When an entity is pinned, a small sticker is displayed :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_pin2.png" loading="lazy"  alt="[Image: creme_28_EN_pin2.png]" class="mycode_img" /><br />
<br />
Then you can get the last pinned entities in the menu entry "Quick access"; this entry replaces the entry which displayed only the last viewed items, and displays these ones and also the pinned entities:<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_pin3.png" loading="lazy"  alt="[Image: creme_28_EN_pin3.png]" class="mycode_img" /><br />
<br />
A new block is available for home; it displays all the pinned entities :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_pin4.png" loading="lazy"  alt="[Image: creme_28_EN_pin4.png]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[New feature (Creme 2.8) : multiple roles]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=282</link>
			<pubDate>Tue, 07 Apr 2026 14:05:19 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=282</guid>
			<description><![CDATA[Roles are the foundation of the permission management for users. But they represent also different ways to use Creme; so the configuration of blocks, buttons, menus or forms can be specific to a role.<br />
<br />
Some people have several functions in your organisation, and so get several users; they log in with the right user depending on the job to do. But it's annoying to log out then log in each time (and having several users corresponding to only one person could be confusing too).<br />
<br />
Creme 2.8 proposes an answer to this: multiple roles. A user can have several roles, and can switch from one to another without having to log out.<br />
<br />
In the configuration interface, the creation (& edition) form for user accepts several roles (before it accepted only one):<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_multi_role1.png" loading="lazy"  alt="[Image: creme_28_EN_multi_role1.png]" class="mycode_img" /><br />
<br />
A user can switch its active role from the main menu:<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_multi_role2.png" loading="lazy"  alt="[Image: creme_28_EN_multi_role2.png]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[Roles are the foundation of the permission management for users. But they represent also different ways to use Creme; so the configuration of blocks, buttons, menus or forms can be specific to a role.<br />
<br />
Some people have several functions in your organisation, and so get several users; they log in with the right user depending on the job to do. But it's annoying to log out then log in each time (and having several users corresponding to only one person could be confusing too).<br />
<br />
Creme 2.8 proposes an answer to this: multiple roles. A user can have several roles, and can switch from one to another without having to log out.<br />
<br />
In the configuration interface, the creation (& edition) form for user accepts several roles (before it accepted only one):<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_multi_role1.png" loading="lazy"  alt="[Image: creme_28_EN_multi_role1.png]" class="mycode_img" /><br />
<br />
A user can switch its active role from the main menu:<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_EN_multi_role2.png" loading="lazy"  alt="[Image: creme_28_EN_multi_role2.png]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Crème 2.8]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=277</link>
			<pubDate>Tue, 07 Apr 2026 13:59:58 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=277</guid>
			<description><![CDATA[Le 7 Avril 2026 est sortie la version 2.8 de CrèmeCRM, environ 7 mois après Creme 2.7 (2 Septembre 2025).<br />
<br />
C'est une version plus courte qu'à l'accoutumée, qui nous permet de mieux nous synchroniser avec les versions de Django et ainsi d'éviter que la fin du support d'une version de Creme se fasse sur une version de Django qui elle n'est plus supportée.<br />
<br />
Nous nous sommes concentré.e.s cette fois sur des fonctionnalités petites et moyennes, mais cela a permis d'en ajouter pas mal malgré la petite taille de cette version.<br />
<br />
Du côté technique, Python 3.14 est officiellement géré.<br />
<br />
Du côté utilisateur, les changements les plus notables sont :<br />
- Il y a eu de nombreuses améliorations concernant les droits :<br />
  - les utilisateurs peuvent avoir plusieurs roles (<a href="https://www.cremecrm.com/forum/showthread.php?tid=278" target="_blank" rel="noopener" class="mycode_url">détails</a>).<br />
  - les rôles peuvent désormais être désactivés.<br />
  - les rôles gèrent maintenant les types de fiches qu'on peut lister, et 2 permissions spéciales peuvent être données: administration des utilisateurs & des rôles (il fallait être super-utilisateur pour ça avant).<br />
- Vos fiches favorites peuvent maintenant être épinglés (<a href="https://www.cremecrm.com/forum/showthread.php?tid=279" target="_blank" rel="noopener" class="mycode_url">détails</a>). La façon dont les fiches récentes sont gérées a été améliorée au passage.<br />
- L'éditeur de texte HTML (utilisé pour les corps HTML d'e-mail par exemple) a été mis à jour, et est utilisé à plus d'endroits.<br />
- Certaines colonnes de vue en liste affichent désormais des totaux calculés sur toutes les fiches de la liste :<br />
  - la somme et la moyenne des totaux (avec et sans TVA) des Factures/Devis/Avoirs/Bons de commande.<br />
  - la somme et la moyenne des CA estimé & final des Opportunités d'affaire.<br />
- On peut désormais télécharger plusieurs Documents, Factures ou Devis en une fois sous forme d'archive '.zip' (<a href="https://www.cremecrm.com/forum/showthread.php?tid=280" target="_blank" rel="noopener" class="mycode_url">détails</a>).<br />
- Les champs personnalisés peuvent posséder une description, ainsi qu'une valeur par défaut (<a href="https://www.cremecrm.com/forum/showthread.php?tid=281" target="_blank" rel="noopener" class="mycode_url">détails</a>).<br />
<br />
N'hésitez pas à tester cette nouvelle version et à venir poser vos questions ici.]]></description>
			<content:encoded><![CDATA[Le 7 Avril 2026 est sortie la version 2.8 de CrèmeCRM, environ 7 mois après Creme 2.7 (2 Septembre 2025).<br />
<br />
C'est une version plus courte qu'à l'accoutumée, qui nous permet de mieux nous synchroniser avec les versions de Django et ainsi d'éviter que la fin du support d'une version de Creme se fasse sur une version de Django qui elle n'est plus supportée.<br />
<br />
Nous nous sommes concentré.e.s cette fois sur des fonctionnalités petites et moyennes, mais cela a permis d'en ajouter pas mal malgré la petite taille de cette version.<br />
<br />
Du côté technique, Python 3.14 est officiellement géré.<br />
<br />
Du côté utilisateur, les changements les plus notables sont :<br />
- Il y a eu de nombreuses améliorations concernant les droits :<br />
  - les utilisateurs peuvent avoir plusieurs roles (<a href="https://www.cremecrm.com/forum/showthread.php?tid=278" target="_blank" rel="noopener" class="mycode_url">détails</a>).<br />
  - les rôles peuvent désormais être désactivés.<br />
  - les rôles gèrent maintenant les types de fiches qu'on peut lister, et 2 permissions spéciales peuvent être données: administration des utilisateurs & des rôles (il fallait être super-utilisateur pour ça avant).<br />
- Vos fiches favorites peuvent maintenant être épinglés (<a href="https://www.cremecrm.com/forum/showthread.php?tid=279" target="_blank" rel="noopener" class="mycode_url">détails</a>). La façon dont les fiches récentes sont gérées a été améliorée au passage.<br />
- L'éditeur de texte HTML (utilisé pour les corps HTML d'e-mail par exemple) a été mis à jour, et est utilisé à plus d'endroits.<br />
- Certaines colonnes de vue en liste affichent désormais des totaux calculés sur toutes les fiches de la liste :<br />
  - la somme et la moyenne des totaux (avec et sans TVA) des Factures/Devis/Avoirs/Bons de commande.<br />
  - la somme et la moyenne des CA estimé & final des Opportunités d'affaire.<br />
- On peut désormais télécharger plusieurs Documents, Factures ou Devis en une fois sous forme d'archive '.zip' (<a href="https://www.cremecrm.com/forum/showthread.php?tid=280" target="_blank" rel="noopener" class="mycode_url">détails</a>).<br />
- Les champs personnalisés peuvent posséder une description, ainsi qu'une valeur par défaut (<a href="https://www.cremecrm.com/forum/showthread.php?tid=281" target="_blank" rel="noopener" class="mycode_url">détails</a>).<br />
<br />
N'hésitez pas à tester cette nouvelle version et à venir poser vos questions ici.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Installation de Crème CRM 2.8]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=287</link>
			<pubDate>Tue, 07 Apr 2026 13:54:31 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=287</guid>
			<description><![CDATA[<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Introduction</span></span><br />
<br />
<br />
<br />
Il s'agira ici d'installer Creme 2.8 soit depuis zéro, soit depuis une installation de Creme 2.7 (notez que vous ne devriez migrer que d'une version à la fois -- donc si vous êtes en 2.6, vous devez migrer vers 2.7 avant de pouvoir migrer vers 2.8 par exemple).<br />
<br />
<br />
<br />
Ce tutoriel d'installation parle des plateformes suivantes :<br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">GNU/Linux</span> en se concentrant sur Debian & Ubuntu ; lorsque des noms de paquets sont donnés, ce sont les noms dans ces 2 distributions, et il vous faudra chercher les équivalents sur votre propre distribution (n'hésitez pas pas à nous indiquer si vous avez des noms de paquets différents -- ils peuvent changer selon les versions de Debian par example -- ou si vous avez installé sur une autre distribution, afin que nous puissions améliorer ce tutoriel).<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Windows</span> ; attention l'installation sous Windows est un peu plus complexe à cause du manque par défaut d'un gestionnaire de paquets. En plus ce n'est pas la plateforme la plus testée (mais si vous avez des problèmes/retours/patches vous pouvez en parler dans les commentaires notamment).<br />
</li>
</ul>
Le code de Creme ne faisant pas spécialement de "linuxeries", l'installer sur d'autres Unix (comme MacOSX) ne devrait pas dans l'absolu poser de souci particulier. Il nous est cependant difficile pour le moment de vous indiquer une marche à suivre précise n'utilisant pas (encore) ces systèmes. Là encore, tout retour de personnes ayant essayé est le bienvenu ; nous savons par exemple que des gens font tourner Creme avec succès sur FreeBSD.<br />
<br />
<br />
<br />
Pour ce tutoriel d'installation de Crème CRM on va faire les choses du mieux possible. On va donc installer des choses qui pourraient vous sembler inutiles mais qui à terme permettront d'avoir une installation pérenne et qui ne rentrera pas en collision avec d'autres logiciels que vous pourriez vouloir installer. <br />
<br />
<br />
<br />
Ce tutoriel vous permet d'installer tout le nécessaire pour faire fonctionner Crème avec le serveur de développement intégré dans Django. Le serveur de développement n'est pas une façon pérenne de faire fonctionner une application Django. Mais c'est un moyen simple de vérifier que tout fonctionne et vous pouvez faire quelques tests avec pour vérifier que Crème vous convient.  Le tutoriel vous permettant d'utiliser Apache avec Crème (plus compliqué à faire fonctionner, mais c'est une façon pérenne de faire les choses) est le sujet d'un autre billet indiqué à la fin. <br />
<br />
<br />
<br />
Une remarque très importante : si l'utilisation du serveur de développement est déconseillé pour une utilisation sur du long terme dans le cadre d'une machine personnelle, elle est par contre totalement interdite dans le cadre d'un hébergement sur un serveur. Si vous comptez installer Crème  tout de suite sur un serveur, il ne faut pas, pas une seule seconde, utiliser le serveur de développement. En effet celui-ci est fait pour le test et rien d'autre. Il n'est pas prévu, ni en terme de performance ni en terme de sécurité, pour être utilisé dans un vrai contexte de production. <br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Avant propos</span></span><br />
<br />
<br />
<br />
Notre objectif est d'installer & configurer un environnement <a href="http://www.virtualenv.org/en/latest/" target="_blank" rel="noopener" class="mycode_url">Virtualenv</a>. Virtualenv vous permet en effet d'avoir plusieurs environnements virtuels Python. L’intérêt est de pouvoir cloisonner les dépendances par projet. Vous êtes ainsi sûr que votre Crème n’arrêtera pas de fonctionner juste parce que vous avez dû mettre à jour une librairie Python pour pouvoir installer un autre logiciel. On ne va pas se contenter d'installer Virtualenv et on va installer aussi <a href="http://www.doughellmann.com/docs/virtualenvwrapper" target="_blank" rel="noopener" class="mycode_url">Virtualenvwrapper</a> qui est une surcouche à Virtualenv et qui vous simplifiera les choses.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos des migrations</span> : nous allons installer Creme 2.8 en parallèle de votre installation de Creme 2.7, en dupliquant les données. Ainsi en cas de gros problèmes vous pourrez revenir à votre installation précédente, que nous n'aurons pas détruite ; les éventuelles nouvelles données rentrées dans Creme 2.8 seront évidemment absentes de votre vieille installation, mais il s'agit ici plutôt de détecter les gros dysfonctionnements que vous auriez immédiatement.<br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Installation de Python</span></span><br />
<br />
<br />
<br />
Pour commencer, il vous faut avoir Python 3 (au moins 3.10) sur votre système ainsi que l'installeur 'pip' qui permet de télécharger & installer des paquets python.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Sous Windows :</span><br />
<br />
Il faut vous rendre ici : <a href="https://www.python.org/downloads/windows/" target="_blank" rel="noopener" class="mycode_url">https://www.python.org/downloads/windows/</a><br />
<br />
L'installeur pour Windows contient l'interpréteur Python ainsi que 'pip'.<br />
<br />
Note: il est important que vous partiez d'une installation vide de Python ; si vous avez déjà des paquets externes pour Python qui ne sont pas installés dans un Virtual Env, ces derniers prendront le pas sur les paquets du Virtual Env (et donc de mauvaises versions de paquets pourront être utilisées empêchant Creme de fonctionner) (ce problème étant spécifique à Windows).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Sous Linux :</span><br />
<br />
Utilisez le gestionnaire de paquet de votre distribution ; si vous êtes sous Debian ou Ubuntu il vous suffit de faire : <br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>sudo apt-get install python3<br />
sudo apt-get install python-setuptools<br />
sudo apt-get install python-pip</code></div></div><br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Installation des logiciels externes</span></span><br />
<br />
<br />
<br />
En plus de Python il va vous falloir installer :<br />
<ul class="mycode_list"><li>Un serveur web compatible avec Python. Il y a le choix mais le grand classique reste Apache (version 2.4 actuellement). Comme indiqué plus haut vous pouvez aussi dans un premier temps utiliser le serveur de développement (inclus avec Django) avant de passer à un serveur de production comme Apache ou NginX.<br />
</li>
<li>Un serveur de base de données: MySQL (8.0.11 ou plus), MariaDB (10.5 ou plus) ou PostGreSQL (14 ou plus) ; dans un premier temps vous pouvez aussi tester avec une base SQLite (rien besoin d'installer c'est fourni avec Python).<br />
</li>
<li>Redis ; ça fonctionne avec des versions anciennes (3.X) ou récentes (4.X +) donc cela ne devrait pas être un problème (préférez les versions plus récentes évidemment): <a href="https://redis.io/download" target="_blank" rel="noopener" class="mycode_url">https://redis.io/download</a><br />
Note: sous Unix il est possible de s'en passer et d'utiliser une socket Unix afin de communiquer avec le serveur de job (vous pourrez regarder, une fois votre installation globalement fonctionnelle au setting JOBMANAGER_BROKER).<br />
</li>
</ul>
Sous Windows, <a href="http://www.wampserver.com/" target="_blank" rel="noopener" class="mycode_url">wampserver</a> vous facilitera sûrement la vie si vous comptez installer Apache et MySQL.<br />
<br />
<br />
<br />
Sous Linux, vérifiez que vous avez les paquets suivants (ce sont les noms sous Ubuntu ; ils peuvent être différents sous une autre distribution évidemment) :<br />
<ul class="mycode_list"><li>mysql-client & mysql-server (si vous utilisez MySQL)<br />
</li>
<li>postgresql & postgresql-client-common (si vous utilisez PostGreSQL)<br />
</li>
<li>redis-server (sauf si vous utilisez une socket Unix comme indiqué plus haut)<br />
</li>
<li>language-pack-fr<br />
</li>
</ul>
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">(Linux) Installation des bibliothèques "système"</span></span><br />
<br />
<br />
<br />
Pour pouvoir installer certains paquets dans votre environnement Python, il vous faudra certaines bibliothèques de développement afin de pouvoir compiler certains paquets.<br />
<br />
<br />
<br />
Avant d'aller plus loin, il faut que vous vérifiez que les packages suivants sont bien installés, sinon, installez les : <br />
<ul class="mycode_list"><li>python3-dev<br />
</li>
<li>libmysqlclient-dev (si vous utilisez MySQL)<br />
</li>
<li>libpq-dev  (si vous utilisez PostGreSQL)<br />
</li>
<li>libjpeg-dev (et potentiellement les autres bibliothèques de gestion d'images selon vos besoins, comme libpng*-dev, libtiff*-dev, libgif-dev...)<br />
</li>
<li>libcairo-dev<br />
</li>
</ul>
<br />
<br />
Là encore, il s'agit des noms sous Debian/Ubuntu ; sous Fedora le suffixe est plutôt"-devel", donc "libpq-dev" s’appellera par exemple "libpq-devel".<br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Installation de l'environnement virtuel</span></span><br />
<br />
<br />
<br />
Nous allons créer un environnement virtuel Python (<span style="font-style: italic;" class="mycode_i">virtualenv</span>) pour Crème, qui contiendra toutes les bibliothèques Python nécessaires dans les bonnes versions (donc sans que votre système n'aient à les fournir). <br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos des migrations</span> : créez un nouveau Virtualenv pour Creme 2.8, et gardez donc intact celui de de votre Creme 2.7 .<br />
<br />
<br />
<br />
Une fois cela fait et après avoir rechargé votre configuration, vous pouvez créer votre <span style="font-style: italic;" class="mycode_i">virtualenv</span> en tapant la commande : <br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>python3 -m venv ~/venv/creme_2_8</code></div></div><br />
<br />
Notes :<br />
<br />
 - "python3" désigne l'exécutable de Python 3 sur votre OS (sous Unix vous aurez souvent un lien python3.XX qui référence le même binaire).<br />
<br />
 -  on a choisi ici de créer un répertoire "venv" (qui pourrait contenir tous vos <span style="font-style: italic;" class="mycode_i">virtualenv</span>) dans votre répertoire HOME, mais ce n'est évidemment pas une obligation. Sous <span style="font-weight: bold;" class="mycode_b">Windows</span> le chemin ressemblerait plus à "C:\chemin\vers\nouveau\virtual\environment".<br />
<br />
<br />
<br />
Une fois que votre <span style="font-style: italic;" class="mycode_i">virtualenv</span> est créé, il faut l'activer pour votre console. Vous allez en effet installer de nouveaux packages Python et faire des commandes Django et tout doit se faire dans votre <span style="font-style: italic;" class="mycode_i">virtualenv</span>. <br />
<br />
<br />
<br />
Sous Unix+Bash, vous activez comme ceci :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>source ~/venv/creme_2_8/bin/activate</code></div></div><br />
<br />
Sous Windows avec l'invite de commande classique :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>&lt;chemin_vers_venv&gt;&#92;Scripts&#92;activate.bat</code></div></div><br />
<br />
La commande "deactivate" permet de sortir d'un <span style="font-style: italic;" class="mycode_i">virtualenv</span> pour revenir à votre environnement système classique. <br />
<br />
<br />
<br />
Pour plus de détails (si vous utilisez un autre système/shell par exemple), regardez la <a href="https://docs.python.org/3/library/venv.html" target="_blank" rel="noopener" class="mycode_url">documentation officielle</a>.<br />
<br />
<br />
<br />
Maintenant que vous avez activé votre <span style="font-style: italic;" class="mycode_i">virtualenv</span>, il vous faut installer le paquet creme-crm, qui installera aussi les dépendances nécessaires. Il existe des variantes, principalement pour choisir votre serveur de base de données (MySQL ou PostgreSQL -- SQLite n'ayant pas de besoin particulier). Les avantages et inconvénients des différents types de base sont expliqués plus bas si vous avez des doutes.<br />
<br />
<br />
<br />
Si vous souhaitez utiliser SQLite, il vous suffit de taper :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>pip install creme-crm~=2.8</code></div></div><br />
<br />
Pour MySQL :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>pip install creme-crm[mysql]~=2.8</code></div></div><br />
<br />
Pour PostgreSQL :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>pip install creme-crm[pgsql]~=2.8</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Notes sur MariaDB</span><br />
<br />
<br />
<br />
Si vous avez installé MariaDB plutôt que MySQL (paquet "<span style="font-style: italic;" class="mycode_i">libmariadbclient-dev</span>" sur Debian10), et que vous avez une erreur "<span style="font-weight: bold;" class="mycode_b"> /bin/sh: 1: mysql_config: not found</span>", créez le lien symbolique suivant :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>ln -s /usr/bin/mariadb_config /usr/bin/mysql_config</code></div></div><br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Notes pour Windows:</span><br />
<br />
<br />
<br />
Certains paquets (comme "<span style="font-style: italic;" class="mycode_i">mysqlclient</span>") peuvent être retords à s'installer, et le site suivant, qui contient des paquets pré-compilés, pourrait grandement vous aider: <a href="https://www.lfd.uci.edu/~gohlke/pythonlibs/" target="_blank" rel="noopener" class="mycode_url">https://www.lfd.uci.edu/~gohlke/pythonlibs/</a><br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Création de votre projet</span></span><br />
<br />
<br />
<br />
Dans Creme 2.8, une instance est bien séparée des sources de Creme elles-mêmes. Nous allons lancer une commande qui va créer un répertoire contenant entre autres la configuration de votre instance. Placez vous donc dans votre arborescence à un endroit adéquate, et faîtes :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme creme_start_project my_project28</code></div></div><br />
<br />
Un répertoire "my_project28" a normalement été créé (note: c'est lui que vous devriez mettre sous version, avec git/mercurial/svn...). Déplacez vous dans ce répertoire (les commandes qui suivront partirons du principe qu'on est resté dans ce premier répertoire "my_project28") :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>cd my_project28</code></div></div><br />
<br />
Il contient principalement un autre répertoire s'appelant lui aussi "my_project28", dans lequel on trouve un fichier nommé "settings.py" qui va contenir la configuration de notre instance. Si vous ouvrez ce fichier vous trouverez quelques valeurs de bases définies par défaut, et pas mal d'explications sur les quelques valeurs qu'il reste à définir pour avoir une instance  fonctionnelle. On vous y explique aussi qu'il est important pour faire les choses proprement de séparer les <span style="font-style: italic;" class="mycode_i">settings</span> liés à votre projet, et ceux liés à une instance en particulier. Mettons que plusieurs développeurs interviennent sur le projet, avec chacun une instance du projet sur sa machine en local (chaque instance utilisant une base de données de test en local) ; on voit que certains paramètres vont être partagés au niveau du projet (la langue, les modules installés...), et certains vont être spécifiques à chaque instance (la base de données...).<br />
<br />
<br />
<br />
Éditez le fichier "my_project28/settings.py", et changez les valeurs suivantes, pour la langue et le fuseau horaire de base :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>LANGUAGE_CODE = 'fr'<br />
TIME_ZONE = 'Europe/Paris'</code></div></div><br />
Il faut aussi, pour un fonctionnement correct, définir le domaine sur lequel va être accessible votre instance (cela permet notamment lorsque des e-mails sont envoyés par Creme d'inclure des liens HTML vers des fiches Creme). Exemple :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>SITE_DOMAIN = 'http://creme.mon-entreprise.fr'</code></div></div><br />
Note: on garde la listes des apps -- les modules Creme/Django -- par défaut ; elle est contenue par le <span style="font-style: italic;" class="mycode_i">setting</span> INSTALLED_APP pour information. <br />
<br />
<br />
<br />
En ce qui concerne les paramètres liés à votre instance, les commentaires dans "settings.py" expliquent les différentes approches. Les administrateurs confirmés choisiront leur méthode préférée ; ici nous allons partir sur une méthode simple, facile à expliquer et à mettre en place. À la fin du fichier "settings.py", ajoutez ces quelques lignes qui importent les paramètres venant du fichier "local_settings.py" :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>try:<br />
    from .local_settings import *<br />
except ImportError:<br />
    pass</code></div></div><br />
<br />
Note: un fichier "my_project28/local_settings.py", que nous allons remplir juste après, a normalement déjà été créé par la commande "creme_start_project". Si vous optez pour une autre méthode pour gérer vos paramètres d'instances (comme la méthode à base de variables d'environnement), vous pourrez le supprimer.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Cas d'une nouvelle installation</span></span><br />
<br />
<br />
<br />
Depuis le répertoire "my_project28/" (celui le plus haut niveau), lancez la commande suivante :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme build_secret_key --settings=my_project28.settings</code></div></div><br />
<br />
Celle-ci a généré votre clé secrète, qu'il faudra mettre dans votre "local_settings.py", dans la variable SECRET_KEY (entre les '', à la place de la valeur par défaut). <br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Cas d'une migration depuis Creme 2.7</span></span><br />
<br />
<br />
<br />
Copiez les valeurs présentes dans les fichiers "settings.py" & "local_settings.py" de votre vieille installation dans ceux de votre projet, notamment SECRET_KEY & DATABASES (nous revenons sur cette dernière juste après évidemment).<br />
<br />
<br />
<br />
Dans votre installation de Creme 2.7, allez dans le répertoire configuré comme MEDIA_ROOT dans les vieux <span style="font-style: italic;" class="mycode_i">settings</span> ("my_project27/my_project27/media/upload" par défaut). Si vous avez utilisé des Documents dans Creme, ou bien exporté des factures/Devis en PDF, vous devriez avoir des sous-répertoires ("documents", "billing" etc...). Si c'est bien le cas, <span style="font-weight: bold;" class="mycode_b">copier</span> ces répertoires (et leur contenu évidemment) dans le répertoire MEDIA_ROOT du nouveau projet ("my_project28/my_project28/media/upload", par défaut).<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Configuration de la base de données</span></span><br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Attention, en cas de migration depuis Creme 2.7</span>:  comme nous l'avons dit en introduction, nous allons dupliquer la base de données plutôt que d'en créer une nouvelle, donc n'oublier pas de <span style="font-weight: bold;" class="mycode_b">mettre le nom de votre nouvelle base</span> dans le fichier "local_settings.py" de votre projet. En effet comme il contient le nom de votre ancienne base, c'est celle-ci qui serait migrée (mas de panique si vous avez bien dupliqué au préalable, au pire votre ancienne base n'est pas perdu elle a juste un nouveau nom).<br />
<br />
<br />
<br />
Pour le moment, la variable DATABASES doit contenir la valeur suivante (que nous allons modifier/compléter par la suite) :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>DATABASES = {<br />
    'default': {<br />
        # Possible backends: 'postgresql', 'mysql', 'sqlite3'.<br />
        'ENGINE': 'django.db.backends.sqlite3',<br />
<br />
        # Name of the database, or path to the database file if using 'sqlite3'.<br />
        'NAME': BASE_DIR / 'db.sqlite3',<br />
<br />
        # Not used with sqlite3.<br />
        'USER': '',<br />
        'PASSWORD': '',<br />
<br />
        # Set to empty string for localhost. Not used with 'sqlite3'.<br />
        'HOST': '',<br />
<br />
        # Set to empty string for default. Not used with 'sqlite3'.<br />
        'PORT': '',<br />
<br />
        # Extra parameters for database connection.<br />
        # Consult backend module's document for available keywords.<br />
        # 'OPTIONS': {},<br />
    },<br />
}</code></div></div><br />
<br />
Avant de passer au déploiement de Crème proprement dit, on va devoir configurer la base de données. Creme est testé avec trois systèmes de gestion de base de données: SQLite, MySQL & PostgreSQL. Django permet aussi d'utiliser une base Oracle, mais nous n'avons jamais eu l'occasion de tester une telle configuration (mais pourquoi utiliser un SGBDR propriétaire quand l'offre libre est aussi bonne ?). Il existe aussi des <span style="font-style: italic;" class="mycode_i">backends</span> pour d'autres SGBDR (firebird, sqlserver ...) qui sont distribués à part de Django ; là encore nous ne les avons pas testés, et ne pouvons garantir leur fonctionnement (mais si vous avez essayé, vos retours sont évidemment les bienvenus, ne serait-ce que par curiosité technique).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">SQLite</span></span><br />
<br />
<br />
<br />
SQLite est surtout utile si vous êtes un développeur, afin de tester rapidement votre travail. C'est aussi envisageable si vous comptez utiliser Creme<br />
<br />
en tant qu'application monoposte et avec peu de données (c'est sûrement une mauvaise idée pour des dizaines de milliers de fiches). Si vous n'êtes pas dans ces 2 cas, nous vous <span style="font-weight: bold;" class="mycode_b">déconseillons vivement</span> une telle configuration.<br />
<br />
<br />
<br />
Si vous choisissez SQLite, la configuration est très simple (pas d'utilisateur ou de mot de passe) ; éditez la variable DATABASES de votre local_settings.py ainsi :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>DATABASES = {<br />
    'default': {<br />
        'ENGINE':   'django.db.backends.sqlite3',<br />
        'NAME':     '/chemin/absolu/vers/un/fichier.db',<br />
        'HOST':     '',<br />
        'PORT':     '',<br />
    },<br />
}</code></div></div><br />
<br />
Vous devez évidemment mettre une chemin valide en tant que NAME (le fichier sera créé s'il n'existe pas, mais faites attention que Creme ait bien les permissions d'écrire dans le répertoire choisi).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos des migrations</span> : pour dupliquer une base SQLite il suffit de copier l'ancien fichier.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">MySQL</span></span><br />
<br />
<br />
<br />
MySQL est un choix classique pour un serveur de production ; il est très répandu et facile à configurer. En revanche, il n'est pas toujours possible de le configurer aussi finement qu'on le voudrait, et a tendance à voir ses performances varier étrangement au grès des versions (la plupart du temps dans le bon sens, mais pas toujours) . C'est donc un bon choix si vous le connaissez déjà, et que vous ne visez pas des volumes importants de données (pour quelques centaines de milliers de fiches ça devrait être satisfaisant -- ça dépend de votre matériel évidemment).<br />
<br />
<br />
<br />
Pour que Crème puisse utiliser MySQL, il faut créer une base de données et un utilisateur qui a les droits sur celle-ci. Vous pouvez bien entendu le faire en graphique grâce à un outil d'administration de BD.<br />
<br />
<br />
<br />
Voici comment le faire en console. Notez qu'en fonction de la version de MySQL les commandes peuvent changer ; les instructions suivantes fonctionnent avec MySQL 8 ; référez vous à la documentation de votre version de MySQL si les commandes ne fonctionnent pas.<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos de MariaDB</span> :<br />
<br />
- les versions 10.5 et supérieures sont officiellement gérées par Django. En revanche nous sommes tombés plusieurs fois sur des erreurs un peu ésotériques (c'est aussi vrai avec MySQL ceci dit) et ce n'est pas forcément la base que nous vous conseillerions.<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos des migrations</span> : il ne faut pas créer pas une base depuis 0, il faut dupliquer l'ancienne, et mettre les mêmes privilèges sur la nouvelle base. Par exemple dans PHPMyadmin, si vous allez sur votre ancienne base, il y  a un onglet "Opérations" qui contient une section "Copier la base de données vers" (qui permet de conserver les privilèges -- normalement la case pour les conserver est cochée par défaut). N'oubliez pas plus bas de mettre le nouveau nom dans la variable 'NAME'.<br />
<br />
<br />
<br />
D'abord logguez vous dans MySQL avec la commande suivante : <br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>mysql -u root -p</code></div></div><br />
<br />
Puis passez sur la base de configuration avec la commande : <br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>use mysql;</code></div></div><br />
<br />
Ajoutez maintenant votre utilisateur (en remplaçant les valeurs d'exemple par vos propres valeurs) avec la commande : <br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>CREATE USER 'cremeuser'@'localhost' IDENTIFIED BY '34jkfue1dioaA';</code></div></div><br />
<br />
Puis nous créons la base de données :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>CREATE DATABASE cremecrmdb;</code></div></div><br />
<br />
et enfin nous donnons à votre l'utilisateur toutes les permissions sur la base de données de Creme :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>GRANT ALL PRIVILEGES ON cremecrmdb.* TO 'cremeuser'@'localhost' WITH GRANT OPTION;</code></div></div><br />
<br />
Éditez la variable DATABASES de votre local_settings.py ainsi (vous devrez si nécessaire remplacer les noms de la base, de l'utilisateur et son mot de passe par les valeurs que vous avez défini précédemment)  :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>DATABASES = {<br />
    'default': {<br />
        'ENGINE':   'django.db.backends.mysql',<br />
        'NAME':     'cremecrmdb',<br />
        'USER':     'cremeuser',<br />
        'PASSWORD': '34jkfue1dioaA',<br />
        'HOST':     '',    # Une chaîne vide pour le localhost.<br />
        'PORT':     '',    # Une chaîne vide pour le port par défaut.<br />
    },</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">PostgreSQL</span></span><br />
<br />
<br />
<br />
PostgreSQL est sûrement le meilleur choix pour les volumes de données importants ; non seulement ses performances sont excellentes, mais c'est aussi le SGBDR le plus rigoureux en terme de cohérence des données.<br />
<br />
<br />
<br />
Les instructions du début de ce tutoriel étaient plutôt faites pour un déploiement avec MySQL ; aussi il va falloir installer des paquets supplémentaires si vous souhaitez utiliser PostgreSQL.<br />
<br />
<br />
<br />
Comme pour MySQL, il vous faut maintenant créer un utilisateur dédié à Creme, ainsi qu'une base sur lequel l'utilisateur a tous les droits. Là encore c'est possible en console comme en graphique (en graphique, le programme "pgAdmin III" fait un très bon travail).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos des migrations</span> : comme déjà dit, il ne faut pas créer pas une base depuis 0, il faut dupliquer l'ancienne, et mettre les mêmes privilèges sur la nouvelle base. N'oubliez pas ci-dessous de mettre le nouveau nom dans la variable 'NAME'.<br />
<br />
<br />
<br />
Lorsque c'est fait, éditez la variable DATABASES de votre local_settings.py ainsi (vous devrez remplacer les noms de la base de l'utilisateur et son mot de passe par les valeurs que vous avez choisies juste avant)  :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>DATABASES = {<br />
    'default': {<br />
        'ENGINE':   'django.db.backends.postgresql',<br />
        'NAME':     'nom_de_la_base',<br />
        'USER':     'nom_de_l_utilisateur',<br />
        'PASSWORD': 'm0t_de_p4&#36;&#36;',<br />
        'HOST':     '',    # Une chaîne vide pour le localhost.<br />
        'PORT':     '',    # Une chaîne vide pour le port par défaut.<br />
    },</code></div></div><br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Remplissage de la base de données</span></span><br />
<br />
<br />
<br />
Toujours dans le répertoire racine "my_project28/", tapez la commande suivante pour créer les tables de la base :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme migrate --settings=my_project28.settings</code></div></div><br />
Puis on remplit la base avec les données initiales (utilisateur administrateur, société initiale, configuration par défaut etc…) :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme creme_populate --settings=my_project28.settings</code></div></div><br />
<br />
Ne vous inquiétez pas des messages du genre <Disable populate for "vcfs": it does not have any "populate.py" script>, ils indiquent juste que certaines apps n'ont pas besoin de créer des données initiales.<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Génération des <span style="font-style: italic;" class="mycode_i">bundles d'assets</span> statiques</span></span><br />
<br />
<br />
<br />
Il s'agit de créer des fichiers optimisés pour le CSS et le JavaScript, ainsi que des images avec des noms pensés pour être mises en cache intelligemment :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme generatemedia --settings=my_project28.settings</code></div></div><br />
<br />
Voici la sortie que vous devriez avoir :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>Generating l10n.js with variation {'language': 'en'}<br />
Generating l10n.js with variation {'language': 'fr'}<br />
Generating lib.js with variation {}<br />
Generating main.js with variation {}<br />
Generating testlib.js with variation {}<br />
Generating testcore.js with variation {}<br />
Generating icecreammain.css with variation {}<br />
Generating chantillymain.css with variation {}</code></div></div><br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Choix des apps installées</span></span><br />
<br />
<br />
<br />
Pour des raisons de simplicité, nous avons choisi d'installer Creme avec sa liste d'apps par défaut, qui couvre la plupart des besoins courants. Sont écartées de cette liste l'app "mobile" pour proposer en plus un ensemble de vues plus adaptées aux smartphones, et "polls" qui permet de faire des questionnaires/sondages internes.<br />
<br />
<br />
<br />
Creme étant modulaire, vous pouvez choisir plus finement les apps installées ; même si pour une première installation, vous devriez sûrement garder la liste de base (vous pouvez passer au chapitre suivant). Pour avoir une liste personnalisée, modifiez variable INSTALLED_APPS comme indiqué dans les commentaires de "project/settings.py".<br />
<br />
<br />
<br />
2 points importants :<br />
<br />
- vous ne pouvez enlever (en pratique mettez plutôt en commentaire avec un '#' en début de ligne) que les apps dans la section CREME OPTIONAL APPS, qui sont optionnelles comme l'indique le nom.<br />
<br />
- dans la liste sont indiquées des dépendances ; certaines apps nécessitent la présence d'autres apps. Cependant pas de craintes, si vous oubliez une dépendance, Creme générera une erreur assez claire à ce sujet.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Choix avant l'installation</span></span><br />
<br />
<br />
<br />
Si vous n'avez pas encore créé la base de données, vous pouvez juste commenter/dé-commenter les noms des apps optionnelles, avant de faire les étapes des chapitres précédents (migrate, creme_populate, generatemedia).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Ajouter des apps après l'installation</span></span><br />
<br />
<br />
<br />
Si vous souhaitez ajouter des apps après installation (ex: après plusieurs jours/mois d'utilisation un besoin apparaît), dé-commentez les apps voulues (toujours en respectant les dépendances -- ex: si vous voulez "events", "opportunities" doit aussi être dé-commenté), puis lancez les même commandes que pour l'installation initiale: migrate, creme_populate, generatemedia.<br />
<br />
<br />
<br />
(en effet il faut bien créer les nouvelles tables, les peupler, et aussi installer le nouveau JavaScript/CSS/...)<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Désinstaller une app après l'installation</span></span><br />
<br />
<br />
<br />
Il existe plusieurs mécanismes, comme la configuration visuelle du menu ou la désactivation des type de relation, qui permettent de rendre très peu visible une app globalement inutile, et vous devriez commencer par là (car aucun risque de casser quoi que ce soit). Mais si vous le souhaitez vraiment, vous pouvez réellement désinstaller une app.<br />
<br />
<br />
<br />
C'est une opération un peu délicate, car des données relatives à l'app que vous voulez désinstaller peuvent exister en base, et être reliées à des données qui elles ne doivent pas être supprimées (car relatives à des apps que vous garder), tout en gardant un système cohérent... Donc :<br />
<br />
<br />
<br />
- privilégiez les apps pour lesquelles vous n'avez pas créé de données (typiquement aucune fiche).<br />
<br />
- faites une sauvegarde avant.<br />
<br />
<br />
<br />
La désinstallation d'une app se fait grâce à une commande, "creme_uninstall". Notez qu'il faut désinstaller une app à la fois (c'est déjà assez délicat comme ça...) ; si vous voulez désinstaller plusieurs apps, alors appliquez la méthode de désinstallation plusieurs fois, en respectant là encore les dépendances (ex: pour désinstaller "events" et "opportunities", faites le dans cet ordre, pour qu'à aucun moment une app n'ait pas ses dépendances installées). L'app que vous désinstallez doit être présente dans votre INSTALLED_APPS.<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme creme_uninstall --settings=my_project28.settings app_a_desinstaller</code></div></div><br />
<br />
Si tout s'est bien déroulé, la commande vous demandera une fois finie de mettre en commentaire l'app dans votre INSTALLED_CREME_APPS.<br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Lancement du serveur</span></span><br />
<br />
<br />
<br />
Une fois cela fait il ne nous reste plus qu'à lancer le serveur de test en faisant :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme runserver --settings=my_project28.settings</code></div></div><br />
<br />
Vous pouvez maintenant vous connecter sur <a href="http://localhost:8000" target="_blank" rel="noopener" class="mycode_url">http://localhost:8000</a> pour voir que votre Crème fonctionne. La commande 'creme_populate' vous a indiqué qu'elle a créé un utilisateur "root" (mot de passe "root") ; utilisez cet utilisateur pour vous connecter. Vous êtes <span style="font-weight: bold;" class="mycode_b">très vivement</span> encouragé à changer immédiatement le mot de passe  (dans le menu en haut > icône rouage > Utilisateurs).<br />
<br />
<br />
<br />
Mais, et je vais le répéter, ce serveur de développement n'est pas fait pour être utiliser dans un contexte de production. Par exemple, pour mettre en production avec Apache et mod_wsgi, vous pouvez suivre cet autre billet: <a href="https://www.cremecrm.com/forum/showthread.php?tid=110" target="_blank" rel="noopener" class="mycode_url">https://www.cremecrm.com/forum/showthread.php?tid=110</a><br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Lancement du gestionnaire de jobs</span></span><br />
<br />
<br />
<br />
Certaines fonctionnalités (import des fichiers CSV/XLS, envoi des campagnes d'e-mails...) sont effectuées par des jobs tournant en parallèle du serveur Web. Ces jobs sont gérés par un gestionnaire qui s'occupent de créer ces processus lorsque c'est nécessaire.<br />
<br />
<br />
<br />
Ce gestionnaire doit être lancé à part, et tourner en permanence  ; si ce n'est pas le cas, la majorité de Creme fonctionnera parfaitement, mais pas les fonctionnalités basées sur les jobs. Si vous allez sur la liste des jobs (menu > Outils > Jobs) un message d'erreur vous indiquera si le gestionnaire est injoignable. Pour lancer le gestionnaire :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme creme_job_manager --settings=my_project28.settings</code></div></div><br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mise à jour</span></span><br />
<br />
<br />
<br />
Il est évidemment conseillé de régulièrement faire des sauvegarde de votre base de données, ainsi que des fichiers télé-versés dans "my_project28/media/upload/" ; c'est d'autant plus vrai avant une mise-à-jour.<br />
<br />
<br />
<br />
Vous pouvez vous tenir à jour des nouvelles <span style="font-style: italic;" class="mycode_i">releases</span> grâce par exemple à la <a href="https://pypi.org/project/creme-crm/#history" target="_blank" rel="noopener" class="mycode_url">page du paquet sur pyPI</a> qui explique comment faire faire (par exemple en suivant le flux RSS fait pour).<br />
<br />
<br />
<br />
Plus tard lorsque sortiront des versions de corrections pour Creme2.6, vous pourrez mettre à jour Creme et ses dépendances avec (adaptez avec le tag utilisé auparavant suivant votre SGBD -- MySQL dans cet exemple) :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>pip install -U creme-crm[mysql]==2.8.XYZ</code></div></div><br />
<br />
Le fichier CHANGELOG.TXT contient les nouveautés, ainsi que des notes sur les commandes. Dans le doute vous pouvez toujours mettre à jour la base de données avec les commandes "migrate" & "creme_populate"  (au pire les commandes ne feront rien) et ré-générer les <span style="font-style: italic;" class="mycode_i">assets</span> statiques comme au dessus avec "generatemedia".]]></description>
			<content:encoded><![CDATA[<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Introduction</span></span><br />
<br />
<br />
<br />
Il s'agira ici d'installer Creme 2.8 soit depuis zéro, soit depuis une installation de Creme 2.7 (notez que vous ne devriez migrer que d'une version à la fois -- donc si vous êtes en 2.6, vous devez migrer vers 2.7 avant de pouvoir migrer vers 2.8 par exemple).<br />
<br />
<br />
<br />
Ce tutoriel d'installation parle des plateformes suivantes :<br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">GNU/Linux</span> en se concentrant sur Debian & Ubuntu ; lorsque des noms de paquets sont donnés, ce sont les noms dans ces 2 distributions, et il vous faudra chercher les équivalents sur votre propre distribution (n'hésitez pas pas à nous indiquer si vous avez des noms de paquets différents -- ils peuvent changer selon les versions de Debian par example -- ou si vous avez installé sur une autre distribution, afin que nous puissions améliorer ce tutoriel).<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Windows</span> ; attention l'installation sous Windows est un peu plus complexe à cause du manque par défaut d'un gestionnaire de paquets. En plus ce n'est pas la plateforme la plus testée (mais si vous avez des problèmes/retours/patches vous pouvez en parler dans les commentaires notamment).<br />
</li>
</ul>
Le code de Creme ne faisant pas spécialement de "linuxeries", l'installer sur d'autres Unix (comme MacOSX) ne devrait pas dans l'absolu poser de souci particulier. Il nous est cependant difficile pour le moment de vous indiquer une marche à suivre précise n'utilisant pas (encore) ces systèmes. Là encore, tout retour de personnes ayant essayé est le bienvenu ; nous savons par exemple que des gens font tourner Creme avec succès sur FreeBSD.<br />
<br />
<br />
<br />
Pour ce tutoriel d'installation de Crème CRM on va faire les choses du mieux possible. On va donc installer des choses qui pourraient vous sembler inutiles mais qui à terme permettront d'avoir une installation pérenne et qui ne rentrera pas en collision avec d'autres logiciels que vous pourriez vouloir installer. <br />
<br />
<br />
<br />
Ce tutoriel vous permet d'installer tout le nécessaire pour faire fonctionner Crème avec le serveur de développement intégré dans Django. Le serveur de développement n'est pas une façon pérenne de faire fonctionner une application Django. Mais c'est un moyen simple de vérifier que tout fonctionne et vous pouvez faire quelques tests avec pour vérifier que Crème vous convient.  Le tutoriel vous permettant d'utiliser Apache avec Crème (plus compliqué à faire fonctionner, mais c'est une façon pérenne de faire les choses) est le sujet d'un autre billet indiqué à la fin. <br />
<br />
<br />
<br />
Une remarque très importante : si l'utilisation du serveur de développement est déconseillé pour une utilisation sur du long terme dans le cadre d'une machine personnelle, elle est par contre totalement interdite dans le cadre d'un hébergement sur un serveur. Si vous comptez installer Crème  tout de suite sur un serveur, il ne faut pas, pas une seule seconde, utiliser le serveur de développement. En effet celui-ci est fait pour le test et rien d'autre. Il n'est pas prévu, ni en terme de performance ni en terme de sécurité, pour être utilisé dans un vrai contexte de production. <br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Avant propos</span></span><br />
<br />
<br />
<br />
Notre objectif est d'installer & configurer un environnement <a href="http://www.virtualenv.org/en/latest/" target="_blank" rel="noopener" class="mycode_url">Virtualenv</a>. Virtualenv vous permet en effet d'avoir plusieurs environnements virtuels Python. L’intérêt est de pouvoir cloisonner les dépendances par projet. Vous êtes ainsi sûr que votre Crème n’arrêtera pas de fonctionner juste parce que vous avez dû mettre à jour une librairie Python pour pouvoir installer un autre logiciel. On ne va pas se contenter d'installer Virtualenv et on va installer aussi <a href="http://www.doughellmann.com/docs/virtualenvwrapper" target="_blank" rel="noopener" class="mycode_url">Virtualenvwrapper</a> qui est une surcouche à Virtualenv et qui vous simplifiera les choses.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos des migrations</span> : nous allons installer Creme 2.8 en parallèle de votre installation de Creme 2.7, en dupliquant les données. Ainsi en cas de gros problèmes vous pourrez revenir à votre installation précédente, que nous n'aurons pas détruite ; les éventuelles nouvelles données rentrées dans Creme 2.8 seront évidemment absentes de votre vieille installation, mais il s'agit ici plutôt de détecter les gros dysfonctionnements que vous auriez immédiatement.<br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Installation de Python</span></span><br />
<br />
<br />
<br />
Pour commencer, il vous faut avoir Python 3 (au moins 3.10) sur votre système ainsi que l'installeur 'pip' qui permet de télécharger & installer des paquets python.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Sous Windows :</span><br />
<br />
Il faut vous rendre ici : <a href="https://www.python.org/downloads/windows/" target="_blank" rel="noopener" class="mycode_url">https://www.python.org/downloads/windows/</a><br />
<br />
L'installeur pour Windows contient l'interpréteur Python ainsi que 'pip'.<br />
<br />
Note: il est important que vous partiez d'une installation vide de Python ; si vous avez déjà des paquets externes pour Python qui ne sont pas installés dans un Virtual Env, ces derniers prendront le pas sur les paquets du Virtual Env (et donc de mauvaises versions de paquets pourront être utilisées empêchant Creme de fonctionner) (ce problème étant spécifique à Windows).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Sous Linux :</span><br />
<br />
Utilisez le gestionnaire de paquet de votre distribution ; si vous êtes sous Debian ou Ubuntu il vous suffit de faire : <br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>sudo apt-get install python3<br />
sudo apt-get install python-setuptools<br />
sudo apt-get install python-pip</code></div></div><br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Installation des logiciels externes</span></span><br />
<br />
<br />
<br />
En plus de Python il va vous falloir installer :<br />
<ul class="mycode_list"><li>Un serveur web compatible avec Python. Il y a le choix mais le grand classique reste Apache (version 2.4 actuellement). Comme indiqué plus haut vous pouvez aussi dans un premier temps utiliser le serveur de développement (inclus avec Django) avant de passer à un serveur de production comme Apache ou NginX.<br />
</li>
<li>Un serveur de base de données: MySQL (8.0.11 ou plus), MariaDB (10.5 ou plus) ou PostGreSQL (14 ou plus) ; dans un premier temps vous pouvez aussi tester avec une base SQLite (rien besoin d'installer c'est fourni avec Python).<br />
</li>
<li>Redis ; ça fonctionne avec des versions anciennes (3.X) ou récentes (4.X +) donc cela ne devrait pas être un problème (préférez les versions plus récentes évidemment): <a href="https://redis.io/download" target="_blank" rel="noopener" class="mycode_url">https://redis.io/download</a><br />
Note: sous Unix il est possible de s'en passer et d'utiliser une socket Unix afin de communiquer avec le serveur de job (vous pourrez regarder, une fois votre installation globalement fonctionnelle au setting JOBMANAGER_BROKER).<br />
</li>
</ul>
Sous Windows, <a href="http://www.wampserver.com/" target="_blank" rel="noopener" class="mycode_url">wampserver</a> vous facilitera sûrement la vie si vous comptez installer Apache et MySQL.<br />
<br />
<br />
<br />
Sous Linux, vérifiez que vous avez les paquets suivants (ce sont les noms sous Ubuntu ; ils peuvent être différents sous une autre distribution évidemment) :<br />
<ul class="mycode_list"><li>mysql-client & mysql-server (si vous utilisez MySQL)<br />
</li>
<li>postgresql & postgresql-client-common (si vous utilisez PostGreSQL)<br />
</li>
<li>redis-server (sauf si vous utilisez une socket Unix comme indiqué plus haut)<br />
</li>
<li>language-pack-fr<br />
</li>
</ul>
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">(Linux) Installation des bibliothèques "système"</span></span><br />
<br />
<br />
<br />
Pour pouvoir installer certains paquets dans votre environnement Python, il vous faudra certaines bibliothèques de développement afin de pouvoir compiler certains paquets.<br />
<br />
<br />
<br />
Avant d'aller plus loin, il faut que vous vérifiez que les packages suivants sont bien installés, sinon, installez les : <br />
<ul class="mycode_list"><li>python3-dev<br />
</li>
<li>libmysqlclient-dev (si vous utilisez MySQL)<br />
</li>
<li>libpq-dev  (si vous utilisez PostGreSQL)<br />
</li>
<li>libjpeg-dev (et potentiellement les autres bibliothèques de gestion d'images selon vos besoins, comme libpng*-dev, libtiff*-dev, libgif-dev...)<br />
</li>
<li>libcairo-dev<br />
</li>
</ul>
<br />
<br />
Là encore, il s'agit des noms sous Debian/Ubuntu ; sous Fedora le suffixe est plutôt"-devel", donc "libpq-dev" s’appellera par exemple "libpq-devel".<br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Installation de l'environnement virtuel</span></span><br />
<br />
<br />
<br />
Nous allons créer un environnement virtuel Python (<span style="font-style: italic;" class="mycode_i">virtualenv</span>) pour Crème, qui contiendra toutes les bibliothèques Python nécessaires dans les bonnes versions (donc sans que votre système n'aient à les fournir). <br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos des migrations</span> : créez un nouveau Virtualenv pour Creme 2.8, et gardez donc intact celui de de votre Creme 2.7 .<br />
<br />
<br />
<br />
Une fois cela fait et après avoir rechargé votre configuration, vous pouvez créer votre <span style="font-style: italic;" class="mycode_i">virtualenv</span> en tapant la commande : <br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>python3 -m venv ~/venv/creme_2_8</code></div></div><br />
<br />
Notes :<br />
<br />
 - "python3" désigne l'exécutable de Python 3 sur votre OS (sous Unix vous aurez souvent un lien python3.XX qui référence le même binaire).<br />
<br />
 -  on a choisi ici de créer un répertoire "venv" (qui pourrait contenir tous vos <span style="font-style: italic;" class="mycode_i">virtualenv</span>) dans votre répertoire HOME, mais ce n'est évidemment pas une obligation. Sous <span style="font-weight: bold;" class="mycode_b">Windows</span> le chemin ressemblerait plus à "C:\chemin\vers\nouveau\virtual\environment".<br />
<br />
<br />
<br />
Une fois que votre <span style="font-style: italic;" class="mycode_i">virtualenv</span> est créé, il faut l'activer pour votre console. Vous allez en effet installer de nouveaux packages Python et faire des commandes Django et tout doit se faire dans votre <span style="font-style: italic;" class="mycode_i">virtualenv</span>. <br />
<br />
<br />
<br />
Sous Unix+Bash, vous activez comme ceci :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>source ~/venv/creme_2_8/bin/activate</code></div></div><br />
<br />
Sous Windows avec l'invite de commande classique :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>&lt;chemin_vers_venv&gt;&#92;Scripts&#92;activate.bat</code></div></div><br />
<br />
La commande "deactivate" permet de sortir d'un <span style="font-style: italic;" class="mycode_i">virtualenv</span> pour revenir à votre environnement système classique. <br />
<br />
<br />
<br />
Pour plus de détails (si vous utilisez un autre système/shell par exemple), regardez la <a href="https://docs.python.org/3/library/venv.html" target="_blank" rel="noopener" class="mycode_url">documentation officielle</a>.<br />
<br />
<br />
<br />
Maintenant que vous avez activé votre <span style="font-style: italic;" class="mycode_i">virtualenv</span>, il vous faut installer le paquet creme-crm, qui installera aussi les dépendances nécessaires. Il existe des variantes, principalement pour choisir votre serveur de base de données (MySQL ou PostgreSQL -- SQLite n'ayant pas de besoin particulier). Les avantages et inconvénients des différents types de base sont expliqués plus bas si vous avez des doutes.<br />
<br />
<br />
<br />
Si vous souhaitez utiliser SQLite, il vous suffit de taper :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>pip install creme-crm~=2.8</code></div></div><br />
<br />
Pour MySQL :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>pip install creme-crm[mysql]~=2.8</code></div></div><br />
<br />
Pour PostgreSQL :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>pip install creme-crm[pgsql]~=2.8</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Notes sur MariaDB</span><br />
<br />
<br />
<br />
Si vous avez installé MariaDB plutôt que MySQL (paquet "<span style="font-style: italic;" class="mycode_i">libmariadbclient-dev</span>" sur Debian10), et que vous avez une erreur "<span style="font-weight: bold;" class="mycode_b"> /bin/sh: 1: mysql_config: not found</span>", créez le lien symbolique suivant :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>ln -s /usr/bin/mariadb_config /usr/bin/mysql_config</code></div></div><br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Notes pour Windows:</span><br />
<br />
<br />
<br />
Certains paquets (comme "<span style="font-style: italic;" class="mycode_i">mysqlclient</span>") peuvent être retords à s'installer, et le site suivant, qui contient des paquets pré-compilés, pourrait grandement vous aider: <a href="https://www.lfd.uci.edu/~gohlke/pythonlibs/" target="_blank" rel="noopener" class="mycode_url">https://www.lfd.uci.edu/~gohlke/pythonlibs/</a><br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Création de votre projet</span></span><br />
<br />
<br />
<br />
Dans Creme 2.8, une instance est bien séparée des sources de Creme elles-mêmes. Nous allons lancer une commande qui va créer un répertoire contenant entre autres la configuration de votre instance. Placez vous donc dans votre arborescence à un endroit adéquate, et faîtes :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme creme_start_project my_project28</code></div></div><br />
<br />
Un répertoire "my_project28" a normalement été créé (note: c'est lui que vous devriez mettre sous version, avec git/mercurial/svn...). Déplacez vous dans ce répertoire (les commandes qui suivront partirons du principe qu'on est resté dans ce premier répertoire "my_project28") :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>cd my_project28</code></div></div><br />
<br />
Il contient principalement un autre répertoire s'appelant lui aussi "my_project28", dans lequel on trouve un fichier nommé "settings.py" qui va contenir la configuration de notre instance. Si vous ouvrez ce fichier vous trouverez quelques valeurs de bases définies par défaut, et pas mal d'explications sur les quelques valeurs qu'il reste à définir pour avoir une instance  fonctionnelle. On vous y explique aussi qu'il est important pour faire les choses proprement de séparer les <span style="font-style: italic;" class="mycode_i">settings</span> liés à votre projet, et ceux liés à une instance en particulier. Mettons que plusieurs développeurs interviennent sur le projet, avec chacun une instance du projet sur sa machine en local (chaque instance utilisant une base de données de test en local) ; on voit que certains paramètres vont être partagés au niveau du projet (la langue, les modules installés...), et certains vont être spécifiques à chaque instance (la base de données...).<br />
<br />
<br />
<br />
Éditez le fichier "my_project28/settings.py", et changez les valeurs suivantes, pour la langue et le fuseau horaire de base :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>LANGUAGE_CODE = 'fr'<br />
TIME_ZONE = 'Europe/Paris'</code></div></div><br />
Il faut aussi, pour un fonctionnement correct, définir le domaine sur lequel va être accessible votre instance (cela permet notamment lorsque des e-mails sont envoyés par Creme d'inclure des liens HTML vers des fiches Creme). Exemple :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>SITE_DOMAIN = 'http://creme.mon-entreprise.fr'</code></div></div><br />
Note: on garde la listes des apps -- les modules Creme/Django -- par défaut ; elle est contenue par le <span style="font-style: italic;" class="mycode_i">setting</span> INSTALLED_APP pour information. <br />
<br />
<br />
<br />
En ce qui concerne les paramètres liés à votre instance, les commentaires dans "settings.py" expliquent les différentes approches. Les administrateurs confirmés choisiront leur méthode préférée ; ici nous allons partir sur une méthode simple, facile à expliquer et à mettre en place. À la fin du fichier "settings.py", ajoutez ces quelques lignes qui importent les paramètres venant du fichier "local_settings.py" :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>try:<br />
    from .local_settings import *<br />
except ImportError:<br />
    pass</code></div></div><br />
<br />
Note: un fichier "my_project28/local_settings.py", que nous allons remplir juste après, a normalement déjà été créé par la commande "creme_start_project". Si vous optez pour une autre méthode pour gérer vos paramètres d'instances (comme la méthode à base de variables d'environnement), vous pourrez le supprimer.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Cas d'une nouvelle installation</span></span><br />
<br />
<br />
<br />
Depuis le répertoire "my_project28/" (celui le plus haut niveau), lancez la commande suivante :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme build_secret_key --settings=my_project28.settings</code></div></div><br />
<br />
Celle-ci a généré votre clé secrète, qu'il faudra mettre dans votre "local_settings.py", dans la variable SECRET_KEY (entre les '', à la place de la valeur par défaut). <br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Cas d'une migration depuis Creme 2.7</span></span><br />
<br />
<br />
<br />
Copiez les valeurs présentes dans les fichiers "settings.py" & "local_settings.py" de votre vieille installation dans ceux de votre projet, notamment SECRET_KEY & DATABASES (nous revenons sur cette dernière juste après évidemment).<br />
<br />
<br />
<br />
Dans votre installation de Creme 2.7, allez dans le répertoire configuré comme MEDIA_ROOT dans les vieux <span style="font-style: italic;" class="mycode_i">settings</span> ("my_project27/my_project27/media/upload" par défaut). Si vous avez utilisé des Documents dans Creme, ou bien exporté des factures/Devis en PDF, vous devriez avoir des sous-répertoires ("documents", "billing" etc...). Si c'est bien le cas, <span style="font-weight: bold;" class="mycode_b">copier</span> ces répertoires (et leur contenu évidemment) dans le répertoire MEDIA_ROOT du nouveau projet ("my_project28/my_project28/media/upload", par défaut).<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Configuration de la base de données</span></span><br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Attention, en cas de migration depuis Creme 2.7</span>:  comme nous l'avons dit en introduction, nous allons dupliquer la base de données plutôt que d'en créer une nouvelle, donc n'oublier pas de <span style="font-weight: bold;" class="mycode_b">mettre le nom de votre nouvelle base</span> dans le fichier "local_settings.py" de votre projet. En effet comme il contient le nom de votre ancienne base, c'est celle-ci qui serait migrée (mas de panique si vous avez bien dupliqué au préalable, au pire votre ancienne base n'est pas perdu elle a juste un nouveau nom).<br />
<br />
<br />
<br />
Pour le moment, la variable DATABASES doit contenir la valeur suivante (que nous allons modifier/compléter par la suite) :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>DATABASES = {<br />
    'default': {<br />
        # Possible backends: 'postgresql', 'mysql', 'sqlite3'.<br />
        'ENGINE': 'django.db.backends.sqlite3',<br />
<br />
        # Name of the database, or path to the database file if using 'sqlite3'.<br />
        'NAME': BASE_DIR / 'db.sqlite3',<br />
<br />
        # Not used with sqlite3.<br />
        'USER': '',<br />
        'PASSWORD': '',<br />
<br />
        # Set to empty string for localhost. Not used with 'sqlite3'.<br />
        'HOST': '',<br />
<br />
        # Set to empty string for default. Not used with 'sqlite3'.<br />
        'PORT': '',<br />
<br />
        # Extra parameters for database connection.<br />
        # Consult backend module's document for available keywords.<br />
        # 'OPTIONS': {},<br />
    },<br />
}</code></div></div><br />
<br />
Avant de passer au déploiement de Crème proprement dit, on va devoir configurer la base de données. Creme est testé avec trois systèmes de gestion de base de données: SQLite, MySQL & PostgreSQL. Django permet aussi d'utiliser une base Oracle, mais nous n'avons jamais eu l'occasion de tester une telle configuration (mais pourquoi utiliser un SGBDR propriétaire quand l'offre libre est aussi bonne ?). Il existe aussi des <span style="font-style: italic;" class="mycode_i">backends</span> pour d'autres SGBDR (firebird, sqlserver ...) qui sont distribués à part de Django ; là encore nous ne les avons pas testés, et ne pouvons garantir leur fonctionnement (mais si vous avez essayé, vos retours sont évidemment les bienvenus, ne serait-ce que par curiosité technique).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">SQLite</span></span><br />
<br />
<br />
<br />
SQLite est surtout utile si vous êtes un développeur, afin de tester rapidement votre travail. C'est aussi envisageable si vous comptez utiliser Creme<br />
<br />
en tant qu'application monoposte et avec peu de données (c'est sûrement une mauvaise idée pour des dizaines de milliers de fiches). Si vous n'êtes pas dans ces 2 cas, nous vous <span style="font-weight: bold;" class="mycode_b">déconseillons vivement</span> une telle configuration.<br />
<br />
<br />
<br />
Si vous choisissez SQLite, la configuration est très simple (pas d'utilisateur ou de mot de passe) ; éditez la variable DATABASES de votre local_settings.py ainsi :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>DATABASES = {<br />
    'default': {<br />
        'ENGINE':   'django.db.backends.sqlite3',<br />
        'NAME':     '/chemin/absolu/vers/un/fichier.db',<br />
        'HOST':     '',<br />
        'PORT':     '',<br />
    },<br />
}</code></div></div><br />
<br />
Vous devez évidemment mettre une chemin valide en tant que NAME (le fichier sera créé s'il n'existe pas, mais faites attention que Creme ait bien les permissions d'écrire dans le répertoire choisi).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos des migrations</span> : pour dupliquer une base SQLite il suffit de copier l'ancien fichier.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">MySQL</span></span><br />
<br />
<br />
<br />
MySQL est un choix classique pour un serveur de production ; il est très répandu et facile à configurer. En revanche, il n'est pas toujours possible de le configurer aussi finement qu'on le voudrait, et a tendance à voir ses performances varier étrangement au grès des versions (la plupart du temps dans le bon sens, mais pas toujours) . C'est donc un bon choix si vous le connaissez déjà, et que vous ne visez pas des volumes importants de données (pour quelques centaines de milliers de fiches ça devrait être satisfaisant -- ça dépend de votre matériel évidemment).<br />
<br />
<br />
<br />
Pour que Crème puisse utiliser MySQL, il faut créer une base de données et un utilisateur qui a les droits sur celle-ci. Vous pouvez bien entendu le faire en graphique grâce à un outil d'administration de BD.<br />
<br />
<br />
<br />
Voici comment le faire en console. Notez qu'en fonction de la version de MySQL les commandes peuvent changer ; les instructions suivantes fonctionnent avec MySQL 8 ; référez vous à la documentation de votre version de MySQL si les commandes ne fonctionnent pas.<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos de MariaDB</span> :<br />
<br />
- les versions 10.5 et supérieures sont officiellement gérées par Django. En revanche nous sommes tombés plusieurs fois sur des erreurs un peu ésotériques (c'est aussi vrai avec MySQL ceci dit) et ce n'est pas forcément la base que nous vous conseillerions.<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos des migrations</span> : il ne faut pas créer pas une base depuis 0, il faut dupliquer l'ancienne, et mettre les mêmes privilèges sur la nouvelle base. Par exemple dans PHPMyadmin, si vous allez sur votre ancienne base, il y  a un onglet "Opérations" qui contient une section "Copier la base de données vers" (qui permet de conserver les privilèges -- normalement la case pour les conserver est cochée par défaut). N'oubliez pas plus bas de mettre le nouveau nom dans la variable 'NAME'.<br />
<br />
<br />
<br />
D'abord logguez vous dans MySQL avec la commande suivante : <br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>mysql -u root -p</code></div></div><br />
<br />
Puis passez sur la base de configuration avec la commande : <br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>use mysql;</code></div></div><br />
<br />
Ajoutez maintenant votre utilisateur (en remplaçant les valeurs d'exemple par vos propres valeurs) avec la commande : <br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>CREATE USER 'cremeuser'@'localhost' IDENTIFIED BY '34jkfue1dioaA';</code></div></div><br />
<br />
Puis nous créons la base de données :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>CREATE DATABASE cremecrmdb;</code></div></div><br />
<br />
et enfin nous donnons à votre l'utilisateur toutes les permissions sur la base de données de Creme :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>GRANT ALL PRIVILEGES ON cremecrmdb.* TO 'cremeuser'@'localhost' WITH GRANT OPTION;</code></div></div><br />
<br />
Éditez la variable DATABASES de votre local_settings.py ainsi (vous devrez si nécessaire remplacer les noms de la base, de l'utilisateur et son mot de passe par les valeurs que vous avez défini précédemment)  :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>DATABASES = {<br />
    'default': {<br />
        'ENGINE':   'django.db.backends.mysql',<br />
        'NAME':     'cremecrmdb',<br />
        'USER':     'cremeuser',<br />
        'PASSWORD': '34jkfue1dioaA',<br />
        'HOST':     '',    # Une chaîne vide pour le localhost.<br />
        'PORT':     '',    # Une chaîne vide pour le port par défaut.<br />
    },</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">PostgreSQL</span></span><br />
<br />
<br />
<br />
PostgreSQL est sûrement le meilleur choix pour les volumes de données importants ; non seulement ses performances sont excellentes, mais c'est aussi le SGBDR le plus rigoureux en terme de cohérence des données.<br />
<br />
<br />
<br />
Les instructions du début de ce tutoriel étaient plutôt faites pour un déploiement avec MySQL ; aussi il va falloir installer des paquets supplémentaires si vous souhaitez utiliser PostgreSQL.<br />
<br />
<br />
<br />
Comme pour MySQL, il vous faut maintenant créer un utilisateur dédié à Creme, ainsi qu'une base sur lequel l'utilisateur a tous les droits. Là encore c'est possible en console comme en graphique (en graphique, le programme "pgAdmin III" fait un très bon travail).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">À propos des migrations</span> : comme déjà dit, il ne faut pas créer pas une base depuis 0, il faut dupliquer l'ancienne, et mettre les mêmes privilèges sur la nouvelle base. N'oubliez pas ci-dessous de mettre le nouveau nom dans la variable 'NAME'.<br />
<br />
<br />
<br />
Lorsque c'est fait, éditez la variable DATABASES de votre local_settings.py ainsi (vous devrez remplacer les noms de la base de l'utilisateur et son mot de passe par les valeurs que vous avez choisies juste avant)  :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>DATABASES = {<br />
    'default': {<br />
        'ENGINE':   'django.db.backends.postgresql',<br />
        'NAME':     'nom_de_la_base',<br />
        'USER':     'nom_de_l_utilisateur',<br />
        'PASSWORD': 'm0t_de_p4&#36;&#36;',<br />
        'HOST':     '',    # Une chaîne vide pour le localhost.<br />
        'PORT':     '',    # Une chaîne vide pour le port par défaut.<br />
    },</code></div></div><br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Remplissage de la base de données</span></span><br />
<br />
<br />
<br />
Toujours dans le répertoire racine "my_project28/", tapez la commande suivante pour créer les tables de la base :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme migrate --settings=my_project28.settings</code></div></div><br />
Puis on remplit la base avec les données initiales (utilisateur administrateur, société initiale, configuration par défaut etc…) :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme creme_populate --settings=my_project28.settings</code></div></div><br />
<br />
Ne vous inquiétez pas des messages du genre <Disable populate for "vcfs": it does not have any "populate.py" script>, ils indiquent juste que certaines apps n'ont pas besoin de créer des données initiales.<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Génération des <span style="font-style: italic;" class="mycode_i">bundles d'assets</span> statiques</span></span><br />
<br />
<br />
<br />
Il s'agit de créer des fichiers optimisés pour le CSS et le JavaScript, ainsi que des images avec des noms pensés pour être mises en cache intelligemment :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme generatemedia --settings=my_project28.settings</code></div></div><br />
<br />
Voici la sortie que vous devriez avoir :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>Generating l10n.js with variation {'language': 'en'}<br />
Generating l10n.js with variation {'language': 'fr'}<br />
Generating lib.js with variation {}<br />
Generating main.js with variation {}<br />
Generating testlib.js with variation {}<br />
Generating testcore.js with variation {}<br />
Generating icecreammain.css with variation {}<br />
Generating chantillymain.css with variation {}</code></div></div><br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Choix des apps installées</span></span><br />
<br />
<br />
<br />
Pour des raisons de simplicité, nous avons choisi d'installer Creme avec sa liste d'apps par défaut, qui couvre la plupart des besoins courants. Sont écartées de cette liste l'app "mobile" pour proposer en plus un ensemble de vues plus adaptées aux smartphones, et "polls" qui permet de faire des questionnaires/sondages internes.<br />
<br />
<br />
<br />
Creme étant modulaire, vous pouvez choisir plus finement les apps installées ; même si pour une première installation, vous devriez sûrement garder la liste de base (vous pouvez passer au chapitre suivant). Pour avoir une liste personnalisée, modifiez variable INSTALLED_APPS comme indiqué dans les commentaires de "project/settings.py".<br />
<br />
<br />
<br />
2 points importants :<br />
<br />
- vous ne pouvez enlever (en pratique mettez plutôt en commentaire avec un '#' en début de ligne) que les apps dans la section CREME OPTIONAL APPS, qui sont optionnelles comme l'indique le nom.<br />
<br />
- dans la liste sont indiquées des dépendances ; certaines apps nécessitent la présence d'autres apps. Cependant pas de craintes, si vous oubliez une dépendance, Creme générera une erreur assez claire à ce sujet.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Choix avant l'installation</span></span><br />
<br />
<br />
<br />
Si vous n'avez pas encore créé la base de données, vous pouvez juste commenter/dé-commenter les noms des apps optionnelles, avant de faire les étapes des chapitres précédents (migrate, creme_populate, generatemedia).<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Ajouter des apps après l'installation</span></span><br />
<br />
<br />
<br />
Si vous souhaitez ajouter des apps après installation (ex: après plusieurs jours/mois d'utilisation un besoin apparaît), dé-commentez les apps voulues (toujours en respectant les dépendances -- ex: si vous voulez "events", "opportunities" doit aussi être dé-commenté), puis lancez les même commandes que pour l'installation initiale: migrate, creme_populate, generatemedia.<br />
<br />
<br />
<br />
(en effet il faut bien créer les nouvelles tables, les peupler, et aussi installer le nouveau JavaScript/CSS/...)<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Désinstaller une app après l'installation</span></span><br />
<br />
<br />
<br />
Il existe plusieurs mécanismes, comme la configuration visuelle du menu ou la désactivation des type de relation, qui permettent de rendre très peu visible une app globalement inutile, et vous devriez commencer par là (car aucun risque de casser quoi que ce soit). Mais si vous le souhaitez vraiment, vous pouvez réellement désinstaller une app.<br />
<br />
<br />
<br />
C'est une opération un peu délicate, car des données relatives à l'app que vous voulez désinstaller peuvent exister en base, et être reliées à des données qui elles ne doivent pas être supprimées (car relatives à des apps que vous garder), tout en gardant un système cohérent... Donc :<br />
<br />
<br />
<br />
- privilégiez les apps pour lesquelles vous n'avez pas créé de données (typiquement aucune fiche).<br />
<br />
- faites une sauvegarde avant.<br />
<br />
<br />
<br />
La désinstallation d'une app se fait grâce à une commande, "creme_uninstall". Notez qu'il faut désinstaller une app à la fois (c'est déjà assez délicat comme ça...) ; si vous voulez désinstaller plusieurs apps, alors appliquez la méthode de désinstallation plusieurs fois, en respectant là encore les dépendances (ex: pour désinstaller "events" et "opportunities", faites le dans cet ordre, pour qu'à aucun moment une app n'ait pas ses dépendances installées). L'app que vous désinstallez doit être présente dans votre INSTALLED_APPS.<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme creme_uninstall --settings=my_project28.settings app_a_desinstaller</code></div></div><br />
<br />
Si tout s'est bien déroulé, la commande vous demandera une fois finie de mettre en commentaire l'app dans votre INSTALLED_CREME_APPS.<br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Lancement du serveur</span></span><br />
<br />
<br />
<br />
Une fois cela fait il ne nous reste plus qu'à lancer le serveur de test en faisant :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme runserver --settings=my_project28.settings</code></div></div><br />
<br />
Vous pouvez maintenant vous connecter sur <a href="http://localhost:8000" target="_blank" rel="noopener" class="mycode_url">http://localhost:8000</a> pour voir que votre Crème fonctionne. La commande 'creme_populate' vous a indiqué qu'elle a créé un utilisateur "root" (mot de passe "root") ; utilisez cet utilisateur pour vous connecter. Vous êtes <span style="font-weight: bold;" class="mycode_b">très vivement</span> encouragé à changer immédiatement le mot de passe  (dans le menu en haut > icône rouage > Utilisateurs).<br />
<br />
<br />
<br />
Mais, et je vais le répéter, ce serveur de développement n'est pas fait pour être utiliser dans un contexte de production. Par exemple, pour mettre en production avec Apache et mod_wsgi, vous pouvez suivre cet autre billet: <a href="https://www.cremecrm.com/forum/showthread.php?tid=110" target="_blank" rel="noopener" class="mycode_url">https://www.cremecrm.com/forum/showthread.php?tid=110</a><br />
<br />
<br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Lancement du gestionnaire de jobs</span></span><br />
<br />
<br />
<br />
Certaines fonctionnalités (import des fichiers CSV/XLS, envoi des campagnes d'e-mails...) sont effectuées par des jobs tournant en parallèle du serveur Web. Ces jobs sont gérés par un gestionnaire qui s'occupent de créer ces processus lorsque c'est nécessaire.<br />
<br />
<br />
<br />
Ce gestionnaire doit être lancé à part, et tourner en permanence  ; si ce n'est pas le cas, la majorité de Creme fonctionnera parfaitement, mais pas les fonctionnalités basées sur les jobs. Si vous allez sur la liste des jobs (menu > Outils > Jobs) un message d'erreur vous indiquera si le gestionnaire est injoignable. Pour lancer le gestionnaire :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>creme creme_job_manager --settings=my_project28.settings</code></div></div><br />
<br />
<span style="font-size: xx-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mise à jour</span></span><br />
<br />
<br />
<br />
Il est évidemment conseillé de régulièrement faire des sauvegarde de votre base de données, ainsi que des fichiers télé-versés dans "my_project28/media/upload/" ; c'est d'autant plus vrai avant une mise-à-jour.<br />
<br />
<br />
<br />
Vous pouvez vous tenir à jour des nouvelles <span style="font-style: italic;" class="mycode_i">releases</span> grâce par exemple à la <a href="https://pypi.org/project/creme-crm/#history" target="_blank" rel="noopener" class="mycode_url">page du paquet sur pyPI</a> qui explique comment faire faire (par exemple en suivant le flux RSS fait pour).<br />
<br />
<br />
<br />
Plus tard lorsque sortiront des versions de corrections pour Creme2.6, vous pourrez mettre à jour Creme et ses dépendances avec (adaptez avec le tag utilisé auparavant suivant votre SGBD -- MySQL dans cet exemple) :<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>pip install -U creme-crm[mysql]==2.8.XYZ</code></div></div><br />
<br />
Le fichier CHANGELOG.TXT contient les nouveautés, ainsi que des notes sur les commandes. Dans le doute vous pouvez toujours mettre à jour la base de données avec les commandes "migrate" & "creme_populate"  (au pire les commandes ne feront rien) et ré-générer les <span style="font-style: italic;" class="mycode_i">assets</span> statiques comme au dessus avec "generatemedia".]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Nouveauté (Creme 2.8) : téléchargement multiple]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=280</link>
			<pubDate>Tue, 07 Apr 2026 13:52:31 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=280</guid>
			<description><![CDATA[Creme 2.8 permet de faire des téléchargements multiples depuis les vues en liste des fiches suivantes :<br />
 - Documents<br />
 - Facture & Devis<br />
<br />
Cela vous permet de sélectionner plusieurs fiches, et de télécharger une archive .zip :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_multi_dl.png" loading="lazy"  alt="[Image: creme_28_FR_multi_dl.png]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[Creme 2.8 permet de faire des téléchargements multiples depuis les vues en liste des fiches suivantes :<br />
 - Documents<br />
 - Facture & Devis<br />
<br />
Cela vous permet de sélectionner plusieurs fiches, et de télécharger une archive .zip :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_multi_dl.png" loading="lazy"  alt="[Image: creme_28_FR_multi_dl.png]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Nouveauté (Creme 2.8) : champs personnalisés améliorés]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=281</link>
			<pubDate>Tue, 07 Apr 2026 13:47:20 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=281</guid>
			<description><![CDATA[Avec Creme 2.8, les champs personnalisés reçoivent 2 améliorations :<br />
 - ils peuvent recevoir une description ; si elle est remplie, elle est utilisée dans les formulaires comme texte d'aide du champ correspondant par exemple.<br />
 - ils peuvent recevoir une valeur par défaut ; si est est remplie, elle est utilisée dans les formulaires de création comme valeur initiale du champ correspondant.<br />
<br />
La configuration des champs personnalisées a un peu évolué afin d'accueillir ces nouvelles fonctionnalités. Le formulaire de création de champ est désormais un <span style="font-style: italic;" class="mycode_i">wizard</span> en 2 étapes. Dans la première vous avez la description qui est apparue :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_custom_fields1.png" loading="lazy"  alt="[Image: creme_28_FR_custom_fields1.png]" class="mycode_img" /><br />
<br />
Dans la 2ème étape, vous pouvez définir une valeur par défaut (sauf pour les champs de type "choix" et "choix multiples") :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_custom_fields2.png" loading="lazy"  alt="[Image: creme_28_FR_custom_fields2.png]" class="mycode_img" /><br />
<br />
Le formulaire de fiche ressemblera alors à ça :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_custom_fields3.png" loading="lazy"  alt="[Image: creme_28_FR_custom_fields3.png]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[Avec Creme 2.8, les champs personnalisés reçoivent 2 améliorations :<br />
 - ils peuvent recevoir une description ; si elle est remplie, elle est utilisée dans les formulaires comme texte d'aide du champ correspondant par exemple.<br />
 - ils peuvent recevoir une valeur par défaut ; si est est remplie, elle est utilisée dans les formulaires de création comme valeur initiale du champ correspondant.<br />
<br />
La configuration des champs personnalisées a un peu évolué afin d'accueillir ces nouvelles fonctionnalités. Le formulaire de création de champ est désormais un <span style="font-style: italic;" class="mycode_i">wizard</span> en 2 étapes. Dans la première vous avez la description qui est apparue :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_custom_fields1.png" loading="lazy"  alt="[Image: creme_28_FR_custom_fields1.png]" class="mycode_img" /><br />
<br />
Dans la 2ème étape, vous pouvez définir une valeur par défaut (sauf pour les champs de type "choix" et "choix multiples") :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_custom_fields2.png" loading="lazy"  alt="[Image: creme_28_FR_custom_fields2.png]" class="mycode_img" /><br />
<br />
Le formulaire de fiche ressemblera alors à ça :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_custom_fields3.png" loading="lazy"  alt="[Image: creme_28_FR_custom_fields3.png]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Nouveauté (Creme 2.8) : épinglage de fiche]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=279</link>
			<pubDate>Tue, 07 Apr 2026 13:45:18 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=279</guid>
			<description><![CDATA[Vous pouvez désormais épingler les fiches auxquelles vous accédez souvent (pour aller dans leur vue détaillé).<br />
<br />
Dans le bloc d'entête, un nouveau bouton est apparu :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_pin1.png" loading="lazy"  alt="[Image: creme_28_FR_pin1.png]" class="mycode_img" /><br />
<br />
Lorsqu'une fiche est épinglée, un petit macaron est présent :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_pin2.png" loading="lazy"  alt="[Image: creme_28_FR_pin2.png]" class="mycode_img" /><br />
<br />
Vous pouvez alors accéder aux dernières fiches épinglées dans l'entrée de menu "Accès rapide" ; cette entrée remplace l'entrée qui proposait uniquement les fiches visitées récemment, et propose ces dernières ainsi que les fiches épinglées :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_pin3.png" loading="lazy"  alt="[Image: creme_28_FR_pin3.png]" class="mycode_img" /><br />
<br />
Un nouveau bloc est disponible pour l'accueil, et qui affiche toutes les fiches épinglées :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_pin4.png" loading="lazy"  alt="[Image: creme_28_FR_pin4.png]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[Vous pouvez désormais épingler les fiches auxquelles vous accédez souvent (pour aller dans leur vue détaillé).<br />
<br />
Dans le bloc d'entête, un nouveau bouton est apparu :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_pin1.png" loading="lazy"  alt="[Image: creme_28_FR_pin1.png]" class="mycode_img" /><br />
<br />
Lorsqu'une fiche est épinglée, un petit macaron est présent :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_pin2.png" loading="lazy"  alt="[Image: creme_28_FR_pin2.png]" class="mycode_img" /><br />
<br />
Vous pouvez alors accéder aux dernières fiches épinglées dans l'entrée de menu "Accès rapide" ; cette entrée remplace l'entrée qui proposait uniquement les fiches visitées récemment, et propose ces dernières ainsi que les fiches épinglées :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_pin3.png" loading="lazy"  alt="[Image: creme_28_FR_pin3.png]" class="mycode_img" /><br />
<br />
Un nouveau bloc est disponible pour l'accueil, et qui affiche toutes les fiches épinglées :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_pin4.png" loading="lazy"  alt="[Image: creme_28_FR_pin4.png]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Nouveauté (Creme 2.8) : rôles multiples]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=278</link>
			<pubDate>Tue, 07 Apr 2026 13:42:57 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=278</guid>
			<description><![CDATA[Les rôles sont la base dans la gestion des droits des utilisateurs. Mais ils représentent aussi des façons différentes d'utiliser Creme ; ainsi la configuration des blocs, boutons, menus ou formulaires peut être spécifique à un role.<br />
<br />
Il arrive que des personnes aient plusieurs casquettes, et finissent par posséder plusieurs utilisateurs, se connectant avec le bon utilisateur en fonction des tâches à effectuer. Mais c'est un peu contraignant de devoir à chaque fois se déconnecter puis se reconnecter (et ça peut être gênant d'avoir plusieurs utilisateurs pour une seule identité).<br />
<br />
Creme 2.8 propose une solution: les rôles multiples. Un utilisateur peut posséder plusieurs rôles, et peut passer de l'un à l'autre sans devoir se déconnecter.<br />
<br />
Dans la configuration, le formulaire de création (et de modification) d'utilisateur accepte plusieurs rôles (plutôt qu'un seul auparavant) :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_multi_role1.png" loading="lazy"  alt="[Image: creme_28_FR_multi_role1.png]" class="mycode_img" /><br />
<br />
Un utilisateur peut changer son rôle actif depuis le menu principal :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_multi_role2.png" loading="lazy"  alt="[Image: creme_28_FR_multi_role2.png]" class="mycode_img" />]]></description>
			<content:encoded><![CDATA[Les rôles sont la base dans la gestion des droits des utilisateurs. Mais ils représentent aussi des façons différentes d'utiliser Creme ; ainsi la configuration des blocs, boutons, menus ou formulaires peut être spécifique à un role.<br />
<br />
Il arrive que des personnes aient plusieurs casquettes, et finissent par posséder plusieurs utilisateurs, se connectant avec le bon utilisateur en fonction des tâches à effectuer. Mais c'est un peu contraignant de devoir à chaque fois se déconnecter puis se reconnecter (et ça peut être gênant d'avoir plusieurs utilisateurs pour une seule identité).<br />
<br />
Creme 2.8 propose une solution: les rôles multiples. Un utilisateur peut posséder plusieurs rôles, et peut passer de l'un à l'autre sans devoir se déconnecter.<br />
<br />
Dans la configuration, le formulaire de création (et de modification) d'utilisateur accepte plusieurs rôles (plutôt qu'un seul auparavant) :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_multi_role1.png" loading="lazy"  alt="[Image: creme_28_FR_multi_role1.png]" class="mycode_img" /><br />
<br />
Un utilisateur peut changer son rôle actif depuis le menu principal :<br />
<br />
<img src="https://img.hybird.org/creme/img/creme28/creme_28_FR_multi_role2.png" loading="lazy"  alt="[Image: creme_28_FR_multi_role2.png]" class="mycode_img" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ValueError: invalid literal for int() with base 10: 'creme_config-userproperty8']]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=276</link>
			<pubDate>Thu, 15 Jan 2026 10:47:50 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=55">libresurf</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=276</guid>
			<description><![CDATA[Bonjour,<br />
<br />
Lors de la demande d'accès à la fiche d'une société (<a href="https://mon_serveur.org/persons/organisation/24" target="_blank" rel="noopener" class="mycode_url">https://mon_serveur.org/persons/organisation/24</a>), j'obtiens une erreur 500.<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>Creme — Erreur 500<br />
Une erreur interne s'est produite.</code></div></div><br />
<br />
Dans mes logs apache2, j'ai la sortie suivante :<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>[Thu Jan 15 10:30:04.687971 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] [2026-01-15 10:30:04] &#92;x1b[31mERROR&#92;x1b[0m - django.request : Internal Server Error: /persons/organisation/24 <br />
[Thu Jan 15 10:30:04.688006 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] Traceback (most recent call last): <br />
[Thu Jan 15 10:30:04.688011 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/fields/__init__.py", line 2128, in get_prep_value <br />
[Thu Jan 15 10:30:04.688015 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return int(value) <br />
[Thu Jan 15 10:30:04.688019 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] ValueError: invalid literal for int() with base 10: 'creme_config-userproperty8' <br />
[Thu Jan 15 10:30:04.688023 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]  <br />
[Thu Jan 15 10:30:04.688036 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] The above exception was the direct cause of the following exception: <br />
[Thu Jan 15 10:30:04.688039 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]  <br />
[Thu Jan 15 10:30:04.688042 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] Traceback (most recent call last): <br />
[Thu Jan 15 10:30:04.688044 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/core/handlers/exception.py", line 55, in inner <br />
[Thu Jan 15 10:30:04.688047 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     response = get_response(request) <br />
[Thu Jan 15 10:30:04.688050 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/core/handlers/base.py", line 220, in _get_response <br />
[Thu Jan 15 10:30:04.688053 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     response = response.render() <br />
[Thu Jan 15 10:30:04.688056 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/response.py", line 114, in render <br />
[Thu Jan 15 10:30:04.688059 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     self.content = self.rendered_content <br />
[Thu Jan 15 10:30:04.688062 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                    ^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688064 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/response.py", line 92, in rendered_content <br />
[Thu Jan 15 10:30:04.688067 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return template.render(context, self._request) <br />
[Thu Jan 15 10:30:04.688070 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688073 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/backends/django.py", line 107, in render <br />
[Thu Jan 15 10:30:04.688076 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.template.render(context) <br />
[Thu Jan 15 10:30:04.688078 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688081 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 172, in render <br />
[Thu Jan 15 10:30:04.688084 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self._render(context) <br />
[Thu Jan 15 10:30:04.688087 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688090 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 164, in _render <br />
[Thu Jan 15 10:30:04.688092 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688095 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688098 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688101 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688106 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688110 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688113 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688115 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688118 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 159, in render <br />
[Thu Jan 15 10:30:04.688121 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return compiled_parent._render(context) <br />
[Thu Jan 15 10:30:04.688124 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688127 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 164, in _render <br />
[Thu Jan 15 10:30:04.688129 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688132 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688135 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688138 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688141 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688144 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688147 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688149 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688152 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 159, in render <br />
[Thu Jan 15 10:30:04.688155 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return compiled_parent._render(context) <br />
[Thu Jan 15 10:30:04.688158 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688160 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 164, in _render <br />
[Thu Jan 15 10:30:04.688163 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688166 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688169 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688172 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688177 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688180 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688183 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688186 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688188 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 159, in render <br />
[Thu Jan 15 10:30:04.688191 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return compiled_parent._render(context) <br />
[Thu Jan 15 10:30:04.688194 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688197 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 164, in _render <br />
[Thu Jan 15 10:30:04.688200 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688202 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688205 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688208 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688211 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688214 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688217 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688219 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688222 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 65, in render <br />
[Thu Jan 15 10:30:04.688225 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     result = block.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688228 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688231 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688234 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688236 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688241 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688244 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688247 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 65, in render <br />
[Thu Jan 15 10:30:04.688250 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     result = block.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688253 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688256 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688259 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688261 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688264 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688267 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688270 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 65, in render <br />
[Thu Jan 15 10:30:04.688273 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     result = block.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688275 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688278 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688281 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688284 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688287 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688290 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688292 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/defaulttags.py", line 423, in render <br />
[Thu Jan 15 10:30:04.688295 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return strip_spaces_between_tags(self.nodelist.render(context).strip()) <br />
[Thu Jan 15 10:30:04.688298 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                      ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688301 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688304 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688309 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688312 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688315 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688318 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688320 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 65, in render <br />
[Thu Jan 15 10:30:04.688323 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     result = block.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688326 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688329 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688332 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688335 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688338 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688340 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688343 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/library.py", line 324, in render <br />
[Thu Jan 15 10:30:04.688346 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     output = self.func(*resolved_args, **resolved_kwargs) <br />
[Thu Jan 15 10:30:04.688349 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/templatetags/creme_bricks.py", line 1070, in brick_display <br />
[Thu Jan 15 10:30:04.688352 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return mark_safe(''.join(filter( <br />
[Thu Jan 15 10:30:04.688355 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                      ~~~~~~~^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688357 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         None, <br />
[Thu Jan 15 10:30:04.688360 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         ^^^^^ <br />
[Thu Jan 15 10:30:04.688363 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         (render(brick) for brick in bricks_to_render) <br />
[Thu Jan 15 10:30:04.688365 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688368 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ))) <br />
[Thu Jan 15 10:30:04.688371 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ^^ <br />
[Thu Jan 15 10:30:04.688374 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/templatetags/creme_bricks.py", line 1072, in &lt;genexpr&gt; <br />
[Thu Jan 15 10:30:04.688379 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     (render(brick) for brick in bricks_to_render) <br />
[Thu Jan 15 10:30:04.688382 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]      ~~~~~~^^^^^^^ <br />
[Thu Jan 15 10:30:04.688384 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/templatetags/creme_bricks.py", line 1037, in render <br />
[Thu Jan 15 10:30:04.688387 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return fun({**context_dict}) <br />
[Thu Jan 15 10:30:04.688390 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/bricks.py", line 368, in detailview_display <br />
[Thu Jan 15 10:30:04.688393 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     self._populate_explainers([*hlines, *related_hlines], user) <br />
[Thu Jan 15 10:30:04.688396 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688398 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/bricks.py", line 345, in _populate_explainers <br />
[Thu Jan 15 10:30:04.688401 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     for hline, explainer in zip(hlines, self.history_registry.line_explainers(hlines, user)): <br />
[Thu Jan 15 10:30:04.688404 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688407 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/gui/history.py", line 797, in line_explainers <br />
[Thu Jan 15 10:30:04.688410 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     fetcher.proceed() <br />
[Thu Jan 15 10:30:04.688413 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ~~~~~~~~~~~~~~~^^ <br />
[Thu Jan 15 10:30:04.688415 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/utils/db.py", line 336, in proceed <br />
[Thu Jan 15 10:30:04.688418 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     model: model._default_manager.in_bulk(pks) <br />
[Thu Jan 15 10:30:04.688421 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^ <br />
[Thu Jan 15 10:30:04.688424 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/manager.py", line 87, in manager_method <br />
[Thu Jan 15 10:30:04.688427 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return getattr(self.get_queryset(), name)(*args, **kwargs) <br />
[Thu Jan 15 10:30:04.688429 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688432 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/query.py", line 1166, in in_bulk <br />
[Thu Jan 15 10:30:04.688435 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     qs = self.filter(**{filter_key: id_list}) <br />
[Thu Jan 15 10:30:04.688438 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/query.py", line 1495, in filter <br />
[Thu Jan 15 10:30:04.688441 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self._filter_or_exclude(False, args, kwargs) <br />
[Thu Jan 15 10:30:04.688446 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688449 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/query.py", line 1513, in _filter_or_exclude <br />
[Thu Jan 15 10:30:04.688452 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     clone._filter_or_exclude_inplace(negate, args, kwargs) <br />
[Thu Jan 15 10:30:04.688454 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688457 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/query.py", line 1523, in _filter_or_exclude_inplace <br />
[Thu Jan 15 10:30:04.688460 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     self._query.add_q(Q(*args, **kwargs)) <br />
[Thu Jan 15 10:30:04.688463 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688466 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/sql/query.py", line 1646, in add_q <br />
[Thu Jan 15 10:30:04.688468 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     clause, _ = self._add_q(q_object, can_reuse) <br />
[Thu Jan 15 10:30:04.688471 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                 ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688474 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/sql/query.py", line 1678, in _add_q <br />
[Thu Jan 15 10:30:04.688477 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     child_clause, needed_inner = self.build_filter( <br />
[Thu Jan 15 10:30:04.688480 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                  ~~~~~~~~~~~~~~~~~^ <br />
[Thu Jan 15 10:30:04.688482 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         child, <br />
[Thu Jan 15 10:30:04.688485 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         ^^^^^^ <br />
[Thu Jan 15 10:30:04.688488 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ...&lt;7 lines&gt;... <br />
[Thu Jan 15 10:30:04.688490 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         update_join_types=update_join_types, <br />
[Thu Jan 15 10:30:04.688493 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688496 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ) <br />
[Thu Jan 15 10:30:04.688498 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ^ <br />
[Thu Jan 15 10:30:04.688501 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/sql/query.py", line 1588, in build_filter <br />
[Thu Jan 15 10:30:04.688504 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     condition = self.build_lookup(lookups, col, value) <br />
[Thu Jan 15 10:30:04.688507 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/sql/query.py", line 1415, in build_lookup <br />
[Thu Jan 15 10:30:04.688510 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     lookup = lookup_class(lhs, rhs) <br />
[Thu Jan 15 10:30:04.688515 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/lookups.py", line 38, in __init__ <br />
[Thu Jan 15 10:30:04.688518 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     self.rhs = self.get_prep_lookup() <br />
[Thu Jan 15 10:30:04.688520 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                ~~~~~~~~~~~~~~~~~~~~^^ <br />
[Thu Jan 15 10:30:04.688523 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/lookups.py", line 536, in get_prep_lookup <br />
[Thu Jan 15 10:30:04.688526 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return super().get_prep_lookup() <br />
[Thu Jan 15 10:30:04.688529 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~^^ <br />
[Thu Jan 15 10:30:04.688532 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/lookups.py", line 321, in get_prep_lookup <br />
[Thu Jan 15 10:30:04.688534 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     rhs_value = self.lhs.output_field.get_prep_value(rhs_value) <br />
[Thu Jan 15 10:30:04.688537 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/fields/__init__.py", line 2130, in get_prep_value <br />
[Thu Jan 15 10:30:04.688540 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     raise e.__class__( <br />
[Thu Jan 15 10:30:04.688543 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         "Field '%s' expected a number but got %r." % (self.name, value), <br />
[Thu Jan 15 10:30:04.688546 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ) from e <br />
[Thu Jan 15 10:30:04.688548 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] ValueError: Field 'id' expected a number but got 'creme_config-userproperty8'.</code></div></div><br />
<br />
À priori, c'est un problème de champs qui attend une valeur numérique, mais qui reçoit une valeur littérale avec 'creme_config-userproperty8' comme chaîne de caractères.<br />
Et là, je ne sais pas analyser plus loin l'origine de ce bug.<br />
<br />
Savez-vous comment corriger ce bug ?<br />
<br />
<br />
<br />
<span style="font-style: italic;" class="mycode_i">PS : pour information, j'ai migré vers la dernière version 2.7.4 de Crème CRM car je pensais que ça allait corriger le bug, mais j'avais déjà ce problème avec les versions 2.6.8 et suivantes (jusqu'à la version 2.6.16). Oui, j'ai mis progressivement à jour les versions avant de passer à la version 2.7.</span>]]></description>
			<content:encoded><![CDATA[Bonjour,<br />
<br />
Lors de la demande d'accès à la fiche d'une société (<a href="https://mon_serveur.org/persons/organisation/24" target="_blank" rel="noopener" class="mycode_url">https://mon_serveur.org/persons/organisation/24</a>), j'obtiens une erreur 500.<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>Creme — Erreur 500<br />
Une erreur interne s'est produite.</code></div></div><br />
<br />
Dans mes logs apache2, j'ai la sortie suivante :<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>[Thu Jan 15 10:30:04.687971 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] [2026-01-15 10:30:04] &#92;x1b[31mERROR&#92;x1b[0m - django.request : Internal Server Error: /persons/organisation/24 <br />
[Thu Jan 15 10:30:04.688006 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] Traceback (most recent call last): <br />
[Thu Jan 15 10:30:04.688011 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/fields/__init__.py", line 2128, in get_prep_value <br />
[Thu Jan 15 10:30:04.688015 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return int(value) <br />
[Thu Jan 15 10:30:04.688019 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] ValueError: invalid literal for int() with base 10: 'creme_config-userproperty8' <br />
[Thu Jan 15 10:30:04.688023 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]  <br />
[Thu Jan 15 10:30:04.688036 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] The above exception was the direct cause of the following exception: <br />
[Thu Jan 15 10:30:04.688039 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]  <br />
[Thu Jan 15 10:30:04.688042 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] Traceback (most recent call last): <br />
[Thu Jan 15 10:30:04.688044 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/core/handlers/exception.py", line 55, in inner <br />
[Thu Jan 15 10:30:04.688047 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     response = get_response(request) <br />
[Thu Jan 15 10:30:04.688050 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/core/handlers/base.py", line 220, in _get_response <br />
[Thu Jan 15 10:30:04.688053 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     response = response.render() <br />
[Thu Jan 15 10:30:04.688056 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/response.py", line 114, in render <br />
[Thu Jan 15 10:30:04.688059 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     self.content = self.rendered_content <br />
[Thu Jan 15 10:30:04.688062 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                    ^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688064 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/response.py", line 92, in rendered_content <br />
[Thu Jan 15 10:30:04.688067 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return template.render(context, self._request) <br />
[Thu Jan 15 10:30:04.688070 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688073 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/backends/django.py", line 107, in render <br />
[Thu Jan 15 10:30:04.688076 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.template.render(context) <br />
[Thu Jan 15 10:30:04.688078 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688081 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 172, in render <br />
[Thu Jan 15 10:30:04.688084 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self._render(context) <br />
[Thu Jan 15 10:30:04.688087 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688090 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 164, in _render <br />
[Thu Jan 15 10:30:04.688092 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688095 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688098 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688101 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688106 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688110 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688113 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688115 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688118 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 159, in render <br />
[Thu Jan 15 10:30:04.688121 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return compiled_parent._render(context) <br />
[Thu Jan 15 10:30:04.688124 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688127 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 164, in _render <br />
[Thu Jan 15 10:30:04.688129 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688132 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688135 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688138 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688141 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688144 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688147 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688149 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688152 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 159, in render <br />
[Thu Jan 15 10:30:04.688155 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return compiled_parent._render(context) <br />
[Thu Jan 15 10:30:04.688158 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688160 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 164, in _render <br />
[Thu Jan 15 10:30:04.688163 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688166 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688169 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688172 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688177 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688180 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688183 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688186 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688188 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 159, in render <br />
[Thu Jan 15 10:30:04.688191 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return compiled_parent._render(context) <br />
[Thu Jan 15 10:30:04.688194 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688197 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 164, in _render <br />
[Thu Jan 15 10:30:04.688200 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688202 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688205 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688208 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688211 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688214 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688217 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688219 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688222 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 65, in render <br />
[Thu Jan 15 10:30:04.688225 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     result = block.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688228 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688231 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688234 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688236 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688241 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688244 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688247 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 65, in render <br />
[Thu Jan 15 10:30:04.688250 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     result = block.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688253 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688256 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688259 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688261 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688264 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688267 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688270 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 65, in render <br />
[Thu Jan 15 10:30:04.688273 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     result = block.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688275 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688278 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688281 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688284 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688287 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688290 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688292 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/defaulttags.py", line 423, in render <br />
[Thu Jan 15 10:30:04.688295 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return strip_spaces_between_tags(self.nodelist.render(context).strip()) <br />
[Thu Jan 15 10:30:04.688298 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                      ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688301 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688304 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688309 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688312 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688315 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688318 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688320 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/loader_tags.py", line 65, in render <br />
[Thu Jan 15 10:30:04.688323 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     result = block.nodelist.render(context) <br />
[Thu Jan 15 10:30:04.688326 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 1018, in render <br />
[Thu Jan 15 10:30:04.688329 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return SafeString("".join([node.render_annotated(context) for node in self])) <br />
[Thu Jan 15 10:30:04.688332 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688335 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/base.py", line 979, in render_annotated <br />
[Thu Jan 15 10:30:04.688338 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self.render(context) <br />
[Thu Jan 15 10:30:04.688340 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688343 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/template/library.py", line 324, in render <br />
[Thu Jan 15 10:30:04.688346 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     output = self.func(*resolved_args, **resolved_kwargs) <br />
[Thu Jan 15 10:30:04.688349 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/templatetags/creme_bricks.py", line 1070, in brick_display <br />
[Thu Jan 15 10:30:04.688352 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return mark_safe(''.join(filter( <br />
[Thu Jan 15 10:30:04.688355 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                      ~~~~~~~^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688357 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         None, <br />
[Thu Jan 15 10:30:04.688360 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         ^^^^^ <br />
[Thu Jan 15 10:30:04.688363 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         (render(brick) for brick in bricks_to_render) <br />
[Thu Jan 15 10:30:04.688365 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688368 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ))) <br />
[Thu Jan 15 10:30:04.688371 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ^^ <br />
[Thu Jan 15 10:30:04.688374 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/templatetags/creme_bricks.py", line 1072, in &lt;genexpr&gt; <br />
[Thu Jan 15 10:30:04.688379 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     (render(brick) for brick in bricks_to_render) <br />
[Thu Jan 15 10:30:04.688382 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]      ~~~~~~^^^^^^^ <br />
[Thu Jan 15 10:30:04.688384 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/templatetags/creme_bricks.py", line 1037, in render <br />
[Thu Jan 15 10:30:04.688387 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return fun({**context_dict}) <br />
[Thu Jan 15 10:30:04.688390 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/bricks.py", line 368, in detailview_display <br />
[Thu Jan 15 10:30:04.688393 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     self._populate_explainers([*hlines, *related_hlines], user) <br />
[Thu Jan 15 10:30:04.688396 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688398 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/bricks.py", line 345, in _populate_explainers <br />
[Thu Jan 15 10:30:04.688401 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     for hline, explainer in zip(hlines, self.history_registry.line_explainers(hlines, user)): <br />
[Thu Jan 15 10:30:04.688404 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688407 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/gui/history.py", line 797, in line_explainers <br />
[Thu Jan 15 10:30:04.688410 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     fetcher.proceed() <br />
[Thu Jan 15 10:30:04.688413 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ~~~~~~~~~~~~~~~^^ <br />
[Thu Jan 15 10:30:04.688415 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/creme/creme_core/utils/db.py", line 336, in proceed <br />
[Thu Jan 15 10:30:04.688418 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     model: model._default_manager.in_bulk(pks) <br />
[Thu Jan 15 10:30:04.688421 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^ <br />
[Thu Jan 15 10:30:04.688424 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/manager.py", line 87, in manager_method <br />
[Thu Jan 15 10:30:04.688427 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return getattr(self.get_queryset(), name)(*args, **kwargs) <br />
[Thu Jan 15 10:30:04.688429 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688432 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/query.py", line 1166, in in_bulk <br />
[Thu Jan 15 10:30:04.688435 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     qs = self.filter(**{filter_key: id_list}) <br />
[Thu Jan 15 10:30:04.688438 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/query.py", line 1495, in filter <br />
[Thu Jan 15 10:30:04.688441 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return self._filter_or_exclude(False, args, kwargs) <br />
[Thu Jan 15 10:30:04.688446 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688449 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/query.py", line 1513, in _filter_or_exclude <br />
[Thu Jan 15 10:30:04.688452 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     clone._filter_or_exclude_inplace(negate, args, kwargs) <br />
[Thu Jan 15 10:30:04.688454 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688457 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/query.py", line 1523, in _filter_or_exclude_inplace <br />
[Thu Jan 15 10:30:04.688460 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     self._query.add_q(Q(*args, **kwargs)) <br />
[Thu Jan 15 10:30:04.688463 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688466 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/sql/query.py", line 1646, in add_q <br />
[Thu Jan 15 10:30:04.688468 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     clause, _ = self._add_q(q_object, can_reuse) <br />
[Thu Jan 15 10:30:04.688471 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                 ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688474 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/sql/query.py", line 1678, in _add_q <br />
[Thu Jan 15 10:30:04.688477 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     child_clause, needed_inner = self.build_filter( <br />
[Thu Jan 15 10:30:04.688480 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                                  ~~~~~~~~~~~~~~~~~^ <br />
[Thu Jan 15 10:30:04.688482 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         child, <br />
[Thu Jan 15 10:30:04.688485 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         ^^^^^^ <br />
[Thu Jan 15 10:30:04.688488 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ...&lt;7 lines&gt;... <br />
[Thu Jan 15 10:30:04.688490 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         update_join_types=update_join_types, <br />
[Thu Jan 15 10:30:04.688493 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <br />
[Thu Jan 15 10:30:04.688496 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ) <br />
[Thu Jan 15 10:30:04.688498 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ^ <br />
[Thu Jan 15 10:30:04.688501 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/sql/query.py", line 1588, in build_filter <br />
[Thu Jan 15 10:30:04.688504 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     condition = self.build_lookup(lookups, col, value) <br />
[Thu Jan 15 10:30:04.688507 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/sql/query.py", line 1415, in build_lookup <br />
[Thu Jan 15 10:30:04.688510 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     lookup = lookup_class(lhs, rhs) <br />
[Thu Jan 15 10:30:04.688515 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/lookups.py", line 38, in __init__ <br />
[Thu Jan 15 10:30:04.688518 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     self.rhs = self.get_prep_lookup() <br />
[Thu Jan 15 10:30:04.688520 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]                ~~~~~~~~~~~~~~~~~~~~^^ <br />
[Thu Jan 15 10:30:04.688523 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/lookups.py", line 536, in get_prep_lookup <br />
[Thu Jan 15 10:30:04.688526 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     return super().get_prep_lookup() <br />
[Thu Jan 15 10:30:04.688529 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]            ~~~~~~~~~~~~~~~~~~~~~~~^^ <br />
[Thu Jan 15 10:30:04.688532 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/lookups.py", line 321, in get_prep_lookup <br />
[Thu Jan 15 10:30:04.688534 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     rhs_value = self.lhs.output_field.get_prep_value(rhs_value) <br />
[Thu Jan 15 10:30:04.688537 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]   File "/srv/www/venv/creme_2_7/lib/python3.13/site-packages/django/db/models/fields/__init__.py", line 2130, in get_prep_value <br />
[Thu Jan 15 10:30:04.688540 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     raise e.__class__( <br />
[Thu Jan 15 10:30:04.688543 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]         "Field '%s' expected a number but got %r." % (self.name, value), <br />
[Thu Jan 15 10:30:04.688546 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX]     ) from e <br />
[Thu Jan 15 10:30:04.688548 2026] [wsgi:error] [pid 8487:tid 8505] [remote XXXX] ValueError: Field 'id' expected a number but got 'creme_config-userproperty8'.</code></div></div><br />
<br />
À priori, c'est un problème de champs qui attend une valeur numérique, mais qui reçoit une valeur littérale avec 'creme_config-userproperty8' comme chaîne de caractères.<br />
Et là, je ne sais pas analyser plus loin l'origine de ce bug.<br />
<br />
Savez-vous comment corriger ce bug ?<br />
<br />
<br />
<br />
<span style="font-style: italic;" class="mycode_i">PS : pour information, j'ai migré vers la dernière version 2.7.4 de Crème CRM car je pensais que ça allait corriger le bug, mais j'avais déjà ce problème avec les versions 2.6.8 et suivantes (jusqu'à la version 2.6.16). Oui, j'ai mis progressivement à jour les versions avant de passer à la version 2.7.</span>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Quand le CRM révèle les angles morts de nos workflows]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=275</link>
			<pubDate>Fri, 26 Dec 2025 12:49:40 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=600">Noran</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=275</guid>
			<description><![CDATA[Salut<br />
Dites, je bidouille mes workflows sur la v2.7 là et je réalise un truc : le <a href="https://crm-pour-pme.fr/qu-est-ce-qu-un-logiciel-CRM.php" target="_blank" rel="noopener" class="mycode_url">logiciel CRM</a> c'est vraiment un miroir de nos propres failles. Si on n'a pas de stratégie de relance carrée à la base, l'outil sert juste à empiler des fiches mortes. Du coup je cherche un moyen de détecter automatiquement les trous dans le pipe. Est-ce que vous savez si on peut scripter une alerte via le job manager quand un prospect ne bouge plus depuis X jours ? J'aimerais bien que le tableau de bord m'affiche direct les opportunités qui stagnent pour éviter de naviguer à vue. Si vous avez un bout de code ou une astuce de config pour automatiser ce genre de rapport intelligent, ça m'intéresse.]]></description>
			<content:encoded><![CDATA[Salut<br />
Dites, je bidouille mes workflows sur la v2.7 là et je réalise un truc : le <a href="https://crm-pour-pme.fr/qu-est-ce-qu-un-logiciel-CRM.php" target="_blank" rel="noopener" class="mycode_url">logiciel CRM</a> c'est vraiment un miroir de nos propres failles. Si on n'a pas de stratégie de relance carrée à la base, l'outil sert juste à empiler des fiches mortes. Du coup je cherche un moyen de détecter automatiquement les trous dans le pipe. Est-ce que vous savez si on peut scripter une alerte via le job manager quand un prospect ne bouge plus depuis X jours ? J'aimerais bien que le tableau de bord m'affiche direct les opportunités qui stagnent pour éviter de naviguer à vue. Si vous avez un bout de code ou une astuce de config pour automatiser ce genre de rapport intelligent, ça m'intéresse.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Crème 2.7]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=274</link>
			<pubDate>Thu, 02 Oct 2025 10:45:10 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=274</guid>
			<description><![CDATA[On September 2<span style="font-size: xx-small;" class="mycode_size">nd</span> 2025 the version 2.7 of CrèmeCRM has been released, 13 months after Creme 2.6 (August 2024).<br />
<br />
On technical side, Django has been upgraded to version 5.2, & so minimal versions are now:<br />
 - Python 3.10<br />
 - MySQL 8.0.11<br />
 - MariaDB 10.5<br />
 - PostGreSQL 14<br />
<br />
On user side, major changes are:<br />
- custom types of entity can now be created (<a href="https://www.cremecrm.com/forum/showthread.php?tid=270" target="_blank" rel="noopener" class="mycode_url">détails</a>).<br />
- a workflow engine (for automatic actions) has been added (<a href="https://www.cremecrm.com/forum/showthread.php?tid=271" target="_blank" rel="noopener" class="mycode_url">détails</a>)<br />
- the generation of Invoices/Quotes/... numbers can now be configured (<a href="https://www.cremecrm.com/forum/showthread.php?tid=272" target="_blank" rel="noopener" class="mycode_url">détails</a>)<br />
- the configuration of buttons can now be made per role (as with blocks, forms etc…).<br />
- the views of list & the filters can now be cloned (in order to avoid building them from scratch).<br />
- the calendar has been updated, & a new block allows to display your own calendar on the home page (see blocks configuration as usual).<br />
- the deletion has been improved, to prevent more often the deletion because of dependencies (instead of cascade deleting things), or to get a better display for these blocking dependencies.<br />
- it's now possible to create unsuccessful phone-calls from the detail-view of Opportunities.<br />
<br />
Hope you'll enjoy this release!]]></description>
			<content:encoded><![CDATA[On September 2<span style="font-size: xx-small;" class="mycode_size">nd</span> 2025 the version 2.7 of CrèmeCRM has been released, 13 months after Creme 2.6 (August 2024).<br />
<br />
On technical side, Django has been upgraded to version 5.2, & so minimal versions are now:<br />
 - Python 3.10<br />
 - MySQL 8.0.11<br />
 - MariaDB 10.5<br />
 - PostGreSQL 14<br />
<br />
On user side, major changes are:<br />
- custom types of entity can now be created (<a href="https://www.cremecrm.com/forum/showthread.php?tid=270" target="_blank" rel="noopener" class="mycode_url">détails</a>).<br />
- a workflow engine (for automatic actions) has been added (<a href="https://www.cremecrm.com/forum/showthread.php?tid=271" target="_blank" rel="noopener" class="mycode_url">détails</a>)<br />
- the generation of Invoices/Quotes/... numbers can now be configured (<a href="https://www.cremecrm.com/forum/showthread.php?tid=272" target="_blank" rel="noopener" class="mycode_url">détails</a>)<br />
- the configuration of buttons can now be made per role (as with blocks, forms etc…).<br />
- the views of list & the filters can now be cloned (in order to avoid building them from scratch).<br />
- the calendar has been updated, & a new block allows to display your own calendar on the home page (see blocks configuration as usual).<br />
- the deletion has been improved, to prevent more often the deletion because of dependencies (instead of cascade deleting things), or to get a better display for these blocking dependencies.<br />
- it's now possible to create unsuccessful phone-calls from the detail-view of Opportunities.<br />
<br />
Hope you'll enjoy this release!]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Crème 2.7]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=268</link>
			<pubDate>Thu, 02 Oct 2025 09:44:28 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=5">genglert</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=268</guid>
			<description><![CDATA[Le 2 Septembre 2025 est sortie la version 2.7 de CrèmeCRM, environ 13 mois après Creme 2.6 (5 Août 2024).<br />
<br />
Côté technique, on passe à Django 5.2, et à cette occasion les versions minimum sont désormais :<br />
 - Python 3.10<br />
 - MySQL 8.0.11<br />
 - MariaDB 10.5<br />
 - PostGreSQL 14<br />
<br />
Du côté utilisateur, les changements les plus notables sont :<br />
- on peut créer des types de fiche personnalisés (<a href="https://www.cremecrm.com/forum/showthread.php?tid=264" target="_blank" rel="noopener" class="mycode_url">détails</a>).<br />
- un système de processus automatisés a été ajouté (<a href="https://www.cremecrm.com/forum/showthread.php?tid=265" target="_blank" rel="noopener" class="mycode_url">détails</a>)<br />
- la génération des numéros de facture/Devis/... peut désormais être configurée (<a href="https://www.cremecrm.com/forum/showthread.php?tid=266" target="_blank" rel="noopener" class="mycode_url">détails</a>)<br />
- la configuration des boutons peut désormais se faire par rôle (comme c'était déjà le cas avec les blocs, formulaires etc…).<br />
- les vues de liste & les filtres peuvent être clonés (afin de gagner du temps, plutôt que de partir de zéro).<br />
- le calendrier a été mis-à-jour, et un nouveau bloc permet d'afficher son calendrier sur la page d'accueil (retrouvez le dans la configuration des blocs comme d'habitude).<br />
- la suppression a été améliorée, que ça soit pour empêcher plus souvent la suppression à cause de dépendances (plutôt que supprimer des choses en cascade), ou pour mieux afficher lesdites dépendances bloquantes.<br />
- il est maintenant possible de créer des appels téléphoniques non aboutis depuis la vue détaillée des Opportunités.<br />
<br />
N'hésitez pas à tester cette nouvelle version, sur votre serveur ou sur notre <a href="http://demos.cremecrm.com/" target="_blank" rel="noopener" class="mycode_url">démo en ligne</a>, et à venir poser vos questions ici.]]></description>
			<content:encoded><![CDATA[Le 2 Septembre 2025 est sortie la version 2.7 de CrèmeCRM, environ 13 mois après Creme 2.6 (5 Août 2024).<br />
<br />
Côté technique, on passe à Django 5.2, et à cette occasion les versions minimum sont désormais :<br />
 - Python 3.10<br />
 - MySQL 8.0.11<br />
 - MariaDB 10.5<br />
 - PostGreSQL 14<br />
<br />
Du côté utilisateur, les changements les plus notables sont :<br />
- on peut créer des types de fiche personnalisés (<a href="https://www.cremecrm.com/forum/showthread.php?tid=264" target="_blank" rel="noopener" class="mycode_url">détails</a>).<br />
- un système de processus automatisés a été ajouté (<a href="https://www.cremecrm.com/forum/showthread.php?tid=265" target="_blank" rel="noopener" class="mycode_url">détails</a>)<br />
- la génération des numéros de facture/Devis/... peut désormais être configurée (<a href="https://www.cremecrm.com/forum/showthread.php?tid=266" target="_blank" rel="noopener" class="mycode_url">détails</a>)<br />
- la configuration des boutons peut désormais se faire par rôle (comme c'était déjà le cas avec les blocs, formulaires etc…).<br />
- les vues de liste & les filtres peuvent être clonés (afin de gagner du temps, plutôt que de partir de zéro).<br />
- le calendrier a été mis-à-jour, et un nouveau bloc permet d'afficher son calendrier sur la page d'accueil (retrouvez le dans la configuration des blocs comme d'habitude).<br />
- la suppression a été améliorée, que ça soit pour empêcher plus souvent la suppression à cause de dépendances (plutôt que supprimer des choses en cascade), ou pour mieux afficher lesdites dépendances bloquantes.<br />
- il est maintenant possible de créer des appels téléphoniques non aboutis depuis la vue détaillée des Opportunités.<br />
<br />
N'hésitez pas à tester cette nouvelle version, sur votre serveur ou sur notre <a href="http://demos.cremecrm.com/" target="_blank" rel="noopener" class="mycode_url">démo en ligne</a>, et à venir poser vos questions ici.]]></content:encoded>
		</item>
	</channel>
</rss>