<?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 - Général]]></title>
		<link>https://www.cremecrm.com/forum/</link>
		<description><![CDATA[Crème CRM - https://www.cremecrm.com/forum]]></description>
		<pubDate>Fri, 17 Apr 2026 08:25:41 +0000</pubDate>
		<generator>MyBB</generator>
		<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[Ajout de nouveau thème pour une publication PDF]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=211</link>
			<pubDate>Fri, 10 Sep 2021 15:41:49 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=321">matthieu</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=211</guid>
			<description><![CDATA[Bonjour je sollicite votre aide pour créer de nouveaux thèmes au niveau des publications PDF.<br />
A ce jour je ne dispose que de cappuccino comme thème. et je souhaiterai rajouter 1 autre thème.<br />
<br />
Je sais que la css est a ce niveau dans l'arborescence : creme_crm/creme/billing/templates/billing/export/xhtml2pdf/FR/fr_FR/cappuccino<br />
du coup j'ai mis 1 dossier supplémentaire à ce niveau, en veillant bien a respecter les chemins pour les html.<br />
<br />
J'ai ensuite déposé les miniatures png à ce niveau creme_crm/creme/media/static/billing/<br />
<br />
j'ai ensuite modifié le fichier home/creme/creme_crm/creme/billing/exporters/xhtml2pdf.py et rajouté au niveau du FLAVOURS_INFO  un nouveau l10n.fr comportant les refs de mon nouveau thème.<br />
<br />
En actualisant le panneau <a href="https://academie-du-tourisme.net/creme_config/" target="_blank" rel="noopener" class="mycode_url"><span style="color: #22439f;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><br />
Configuration > </span></span></a><span style="color: #000000;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Application: Facturation</span></span><br />
<span style="color: #000000;" class="mycode_color">je m'aperçois que je n'ai rien. ai je manqué quelquechose ?</span><br />
<br />
<span style="color: #000000;" class="mycode_color">Mercci de vos réponses</span><br />
<span style="color: #000000;" class="mycode_color">Matthieu</span>]]></description>
			<content:encoded><![CDATA[Bonjour je sollicite votre aide pour créer de nouveaux thèmes au niveau des publications PDF.<br />
A ce jour je ne dispose que de cappuccino comme thème. et je souhaiterai rajouter 1 autre thème.<br />
<br />
Je sais que la css est a ce niveau dans l'arborescence : creme_crm/creme/billing/templates/billing/export/xhtml2pdf/FR/fr_FR/cappuccino<br />
du coup j'ai mis 1 dossier supplémentaire à ce niveau, en veillant bien a respecter les chemins pour les html.<br />
<br />
J'ai ensuite déposé les miniatures png à ce niveau creme_crm/creme/media/static/billing/<br />
<br />
j'ai ensuite modifié le fichier home/creme/creme_crm/creme/billing/exporters/xhtml2pdf.py et rajouté au niveau du FLAVOURS_INFO  un nouveau l10n.fr comportant les refs de mon nouveau thème.<br />
<br />
En actualisant le panneau <a href="https://academie-du-tourisme.net/creme_config/" target="_blank" rel="noopener" class="mycode_url"><span style="color: #22439f;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><br />
Configuration > </span></span></a><span style="color: #000000;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Application: Facturation</span></span><br />
<span style="color: #000000;" class="mycode_color">je m'aperçois que je n'ai rien. ai je manqué quelquechose ?</span><br />
<br />
<span style="color: #000000;" class="mycode_color">Mercci de vos réponses</span><br />
<span style="color: #000000;" class="mycode_color">Matthieu</span>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Étendre les thèmes]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=206</link>
			<pubDate>Thu, 01 Jul 2021 17:42:13 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=303">lalba</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=206</guid>
			<description><![CDATA[Bonjour,<br />
<br />
Il me semble avoir compris que pour ajouter de nouveaux css aux thèmes lorsqu'on crée une nouvelle application, il faut ajouter le chemin des nouveaux css dans CREME_OPT_CSS.<br />
<br />
Pour cela, il me semble qu'il y a deux solutions :<ul class="mycode_list"><li>Modifier dans settings.py : Cette solution contrevient au système associé à project_settings.py qui voudrait qu'on ne modifie pas le fichier settings.py<br />
</li>
<li>Dupliquer CREME_OPT_CSS dans project_setting.py : Cette façon de faire a l’inconvénient de ne pas prendre en compte d'éventuels modification lors de nouvelles versions de CremeCRM.<br />
</li>
</ul>
Serait il possible d'ajouter en fin de settings.py un système qui permette de concaténer CREME_OPT_CSS avec une variable qui proviendrait de projet_settings.py ?<br />
<br />
Par exemple, définir une variable CREME_OPT_CSS_EXTENDS initialisée à [] dans settings.py puis ajouter en fin de settings.py CREME_OPT_CSS = CREME_OPT_CSS + CREME_OPT_CSS_EXTENDS<br />
<br />
<br />
Cordialement]]></description>
			<content:encoded><![CDATA[Bonjour,<br />
<br />
Il me semble avoir compris que pour ajouter de nouveaux css aux thèmes lorsqu'on crée une nouvelle application, il faut ajouter le chemin des nouveaux css dans CREME_OPT_CSS.<br />
<br />
Pour cela, il me semble qu'il y a deux solutions :<ul class="mycode_list"><li>Modifier dans settings.py : Cette solution contrevient au système associé à project_settings.py qui voudrait qu'on ne modifie pas le fichier settings.py<br />
</li>
<li>Dupliquer CREME_OPT_CSS dans project_setting.py : Cette façon de faire a l’inconvénient de ne pas prendre en compte d'éventuels modification lors de nouvelles versions de CremeCRM.<br />
</li>
</ul>
Serait il possible d'ajouter en fin de settings.py un système qui permette de concaténer CREME_OPT_CSS avec une variable qui proviendrait de projet_settings.py ?<br />
<br />
Par exemple, définir une variable CREME_OPT_CSS_EXTENDS initialisée à [] dans settings.py puis ajouter en fin de settings.py CREME_OPT_CSS = CREME_OPT_CSS + CREME_OPT_CSS_EXTENDS<br />
<br />
<br />
Cordialement]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[Creme 1.6] Passer son code de Creme 1.5 à Creme 1.6]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=91</link>
			<pubDate>Thu, 14 Jan 2016 18:21:27 +0100</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=91</guid>
			<description><![CDATA[Creme1.6 est une version dont la majorité des changements interviennent sous le capot. Ces changements sont avant tout du au passage à Django1.8 (Creme1.5 utilisant Django 1.4) comme nous allons le voir. Aussi si vous avez développé vos propres modules Creme, il y a toutes les chances que vous deviez mettre à jour votre code. Ce post est là pour vous y aider ; n'hésiter pas poser des questions, car ne post ne pourra jamais être totalement complet.<br />
<br />
Tout d'abord sachez que le tutoriel d'écriture de module, présent dans le répertoire /doc/fr, a été mis à jour. Bon nombre d'informations de ce post proviendront de ce didacticiel.<br />
<br />
N'hésitez pas à aller lire les changelogs des différentes versions de Django, notamment lorsqu'une méthode de Django a disparu ou bien déclenche des <span style="font-style: italic;" class="mycode_i">warnings</span> 'deprecated'.<br />
       <!-- m --><a class="postlink" href="https://docs.djangoproject.com/en/1.8/releases/1.5/">https://docs.djangoproject.com/en/1.8/releases/1.5/</a><!-- m --><br />
       <!-- m --><a class="postlink" href="https://docs.djangoproject.com/en/1.8/releases/1.6/">https://docs.djangoproject.com/en/1.8/releases/1.6/</a><!-- m --><br />
       <!-- m --><a class="postlink" href="https://docs.djangoproject.com/en/1.8/releases/1.7/">https://docs.djangoproject.com/en/1.8/releases/1.7/</a><!-- m --><br />
       <!-- m --><a class="postlink" href="https://docs.djangoproject.com/en/1.8/releases/1.8/">https://docs.djangoproject.com/en/1.8/releases/1.8/</a><!-- m --><br />
<br />
Vous devriez aussi aller lire le fichier CHANGELOG.txt à la racine des sources de Creme. Les différents changements y sont listés, en séparant ceux qui cassent la compatibilité avec la version précédente, et ceux qui ne la casse pas (mais peuvent provoquer des <span style="font-style: italic;" class="mycode_i">warnings</span>  lorsque leur suppression est prévue dans une version ultérieure).<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Changements principaux au niveau de Django</span></span><ul class="mycode_list"><li>Un système de migration intégré, qui supprime le besoin d'utiliser l'app externe South ; les anciennes migrations South sont incompatibles, de nouvelles migrations doivent donc être écrites/générées. Ce point est développé plus bas.<br />
</li>
</ul>
<ul class="mycode_list"><li>Les apps doivent avoir une classe de configuration. Ce point est développé plus bas.<br />
</li>
<li>L'ancienne façon décrire les fichiers urls.py est obsolète. Ce point est développé plus bas.<br />
</li>
<li>L'objet _meta de vos modèles a changé ; par exemple la méthode get_field_by_name() est obsolète, get_field() doit lui être préféré.<br />
</li>
<li>Différents moteurs de templates peuvent être utilisés ; bien que Creme utilise toujours le même moteur (pour le moment en tout cas), cela a entraîné des changements d'API dans Django. La principale différence est que le contexte devrait être un dictionnaire classique, et non plus un RequestContext. Si vous avez défini vos propres vues, vous devriez vous en soucier.<br />
</li>
<li>La classe Meta de vos formulaires de modèles doivent avoir un attribut 'fields' (ou bien 'exclude').<br />
</li>
<li>Changement du fonctionnement des transactions ; en général utiliser transaction.atomic() à la place de transaction.commit_on_success()/transaction.commit_manually()/transaction.savepoint*() suffira amplement.<br />
</li>
<li>La façon dont les tests unitaires sont organisés a changé; si vous utilisez un répertoire 'tests/', il n'y a plus besoin de tous les importer à la racine, en revanche vos noms de fichiers doivent commencer par 'test_'.<br />
</li>
<li>La bibliothèque 'django.utils.simplejson' a été supprimée ; utilisez 'json'.<br />
</li>
<li>La bibliothèque 'django.forms.util' a été renommée 'django.forms.utils'.<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Classe de configuration</span></span><br />
Votre fichier 'creme_core_register.py' n'est plus pris en compte ; nous utilisons à présent le système de configuration d'app (apparu dans Django 1.8). Créez un fichier 'apps.py' à la racine de votre app, et créez une classe dérivant de 'creme.creme_core.apps.CremeAppConfig'. Le tutoriel vous explique comment faire la plupart des choses que vous faisiez avant avec 'creme_core_register.py' (enregistrer l'app, les entités, le menu ...).<br />
N'oubliez pas de définir dans le __init__.py de votre app la variable 'default_app_config', de manièere à indiquer votre classe comme configuration (ex: "creme.my_app.apps.MyAppConfig").<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Les URLs</span></span><br />
Dans votre fichier 'urls.py', les listes d'URLs devraient maintenant être de simples listes (et non plus des objets 'django.conf.urls.patterns'), et les vues devraient être référencées directement (et non plus être sous forme de strings).<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Les migrations</span></span><br />
Vous pouvez supprimer votre ancien répertoire 'migrations/'. Créez de nouvelles migrations grâce à la commande "python manage.py makemigrations my_app". Sur votre base de production, l'idée est de faire comme si cette migration avait été exécutée (puisque les tables existent déjà) avec "python manage.py migrate my_app --fake-initial" ; c'est d'ailleurs ce que vous faites pour passer une base 1.5 à 1.6 de manière générale.<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">get_create_absolute_url()</span></span><br />
Vos modèles d'entités devraient implémenter la méthode 'get_create_absolute_url()', qui renvoie l'URL de création de ce type d'entités.<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Le nouveau modèle utilisateur</span></span><br />
Le modèle utilisateur dans creme n'est plus 'auth.models.User' mais 'creme.creme_core.models.auth.CremeUser' ; ceci dit n'importez pas cette classe directement. Utilisez la variable 'settings.AUTH_USER_MODEL' (dans la définition de vos ForeignKey par exemple) ou bien la fonction django.contrib.auth.get_user_model() afin d'obtenir le modèle utilisé concrètement (ce qui vous permettrait de modifier dans l'absolu le modèle utilisateur qui doit être utilisé).<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Le swapping de modèles</span></span><br />
La façon de modifier les modèles existants (comme Contact) a été complètement revue, afin d'être compatible avec les nouvelles version de Django et de fournir un outil plus puissant par bien des aspects. <br />
<br />
<br />
En revanche la mauvaise nouvelle c'est que cela demande un peu plus de travail lorsque vous voulez juste faire une modification mineure pour rajouter un champ (mais à long terme vous devriez y gagner, par exemple pour migrer vers une version plus récente sans conflit). C'est parce que la fonction 'contribute_to_model()' a disparu.<br />
<br />
La première conséquence est que si votre code importe la classe 'Contact' par exemple, vous devriez plutôt utiliser la fonction 'creme.persons.get_contact_model()' (ou bien la variable 'settings.PERSONS_CONTACT_MODEL' lorsque vous définissez une ForeignKey par exemple).<br />
<br />
La seconde conséquence c'est que maintenant, si vous voulez modifier Contact, vous devez écrire votre propre classe de contact (mais il existe une classe 'persons.models.AbstractContact' qui vous permet de n'avoir presque rien à faire au final, à part ajouter les champs qui vous intéresse), puis dans 'settings.py' configurer la variable 'PERSONS_CONTACT_MODEL' afin de pointer vers votre propre classe.<br />
<br />
Tout ceci est décrit plus précisément dans le tutoriel, au chapitre "Modification d'un modèle existant". Il y a notamment une partie "Comment swapper un modèle à posteriori ?", qui vous aidera à migrer votre code et votre base de données lorsque vous avez utilisé 'contribute_to_model()' auparavant.]]></description>
			<content:encoded><![CDATA[Creme1.6 est une version dont la majorité des changements interviennent sous le capot. Ces changements sont avant tout du au passage à Django1.8 (Creme1.5 utilisant Django 1.4) comme nous allons le voir. Aussi si vous avez développé vos propres modules Creme, il y a toutes les chances que vous deviez mettre à jour votre code. Ce post est là pour vous y aider ; n'hésiter pas poser des questions, car ne post ne pourra jamais être totalement complet.<br />
<br />
Tout d'abord sachez que le tutoriel d'écriture de module, présent dans le répertoire /doc/fr, a été mis à jour. Bon nombre d'informations de ce post proviendront de ce didacticiel.<br />
<br />
N'hésitez pas à aller lire les changelogs des différentes versions de Django, notamment lorsqu'une méthode de Django a disparu ou bien déclenche des <span style="font-style: italic;" class="mycode_i">warnings</span> 'deprecated'.<br />
       <!-- m --><a class="postlink" href="https://docs.djangoproject.com/en/1.8/releases/1.5/">https://docs.djangoproject.com/en/1.8/releases/1.5/</a><!-- m --><br />
       <!-- m --><a class="postlink" href="https://docs.djangoproject.com/en/1.8/releases/1.6/">https://docs.djangoproject.com/en/1.8/releases/1.6/</a><!-- m --><br />
       <!-- m --><a class="postlink" href="https://docs.djangoproject.com/en/1.8/releases/1.7/">https://docs.djangoproject.com/en/1.8/releases/1.7/</a><!-- m --><br />
       <!-- m --><a class="postlink" href="https://docs.djangoproject.com/en/1.8/releases/1.8/">https://docs.djangoproject.com/en/1.8/releases/1.8/</a><!-- m --><br />
<br />
Vous devriez aussi aller lire le fichier CHANGELOG.txt à la racine des sources de Creme. Les différents changements y sont listés, en séparant ceux qui cassent la compatibilité avec la version précédente, et ceux qui ne la casse pas (mais peuvent provoquer des <span style="font-style: italic;" class="mycode_i">warnings</span>  lorsque leur suppression est prévue dans une version ultérieure).<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Changements principaux au niveau de Django</span></span><ul class="mycode_list"><li>Un système de migration intégré, qui supprime le besoin d'utiliser l'app externe South ; les anciennes migrations South sont incompatibles, de nouvelles migrations doivent donc être écrites/générées. Ce point est développé plus bas.<br />
</li>
</ul>
<ul class="mycode_list"><li>Les apps doivent avoir une classe de configuration. Ce point est développé plus bas.<br />
</li>
<li>L'ancienne façon décrire les fichiers urls.py est obsolète. Ce point est développé plus bas.<br />
</li>
<li>L'objet _meta de vos modèles a changé ; par exemple la méthode get_field_by_name() est obsolète, get_field() doit lui être préféré.<br />
</li>
<li>Différents moteurs de templates peuvent être utilisés ; bien que Creme utilise toujours le même moteur (pour le moment en tout cas), cela a entraîné des changements d'API dans Django. La principale différence est que le contexte devrait être un dictionnaire classique, et non plus un RequestContext. Si vous avez défini vos propres vues, vous devriez vous en soucier.<br />
</li>
<li>La classe Meta de vos formulaires de modèles doivent avoir un attribut 'fields' (ou bien 'exclude').<br />
</li>
<li>Changement du fonctionnement des transactions ; en général utiliser transaction.atomic() à la place de transaction.commit_on_success()/transaction.commit_manually()/transaction.savepoint*() suffira amplement.<br />
</li>
<li>La façon dont les tests unitaires sont organisés a changé; si vous utilisez un répertoire 'tests/', il n'y a plus besoin de tous les importer à la racine, en revanche vos noms de fichiers doivent commencer par 'test_'.<br />
</li>
<li>La bibliothèque 'django.utils.simplejson' a été supprimée ; utilisez 'json'.<br />
</li>
<li>La bibliothèque 'django.forms.util' a été renommée 'django.forms.utils'.<br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Classe de configuration</span></span><br />
Votre fichier 'creme_core_register.py' n'est plus pris en compte ; nous utilisons à présent le système de configuration d'app (apparu dans Django 1.8). Créez un fichier 'apps.py' à la racine de votre app, et créez une classe dérivant de 'creme.creme_core.apps.CremeAppConfig'. Le tutoriel vous explique comment faire la plupart des choses que vous faisiez avant avec 'creme_core_register.py' (enregistrer l'app, les entités, le menu ...).<br />
N'oubliez pas de définir dans le __init__.py de votre app la variable 'default_app_config', de manièere à indiquer votre classe comme configuration (ex: "creme.my_app.apps.MyAppConfig").<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Les URLs</span></span><br />
Dans votre fichier 'urls.py', les listes d'URLs devraient maintenant être de simples listes (et non plus des objets 'django.conf.urls.patterns'), et les vues devraient être référencées directement (et non plus être sous forme de strings).<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Les migrations</span></span><br />
Vous pouvez supprimer votre ancien répertoire 'migrations/'. Créez de nouvelles migrations grâce à la commande "python manage.py makemigrations my_app". Sur votre base de production, l'idée est de faire comme si cette migration avait été exécutée (puisque les tables existent déjà) avec "python manage.py migrate my_app --fake-initial" ; c'est d'ailleurs ce que vous faites pour passer une base 1.5 à 1.6 de manière générale.<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">get_create_absolute_url()</span></span><br />
Vos modèles d'entités devraient implémenter la méthode 'get_create_absolute_url()', qui renvoie l'URL de création de ce type d'entités.<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Le nouveau modèle utilisateur</span></span><br />
Le modèle utilisateur dans creme n'est plus 'auth.models.User' mais 'creme.creme_core.models.auth.CremeUser' ; ceci dit n'importez pas cette classe directement. Utilisez la variable 'settings.AUTH_USER_MODEL' (dans la définition de vos ForeignKey par exemple) ou bien la fonction django.contrib.auth.get_user_model() afin d'obtenir le modèle utilisé concrètement (ce qui vous permettrait de modifier dans l'absolu le modèle utilisateur qui doit être utilisé).<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Le swapping de modèles</span></span><br />
La façon de modifier les modèles existants (comme Contact) a été complètement revue, afin d'être compatible avec les nouvelles version de Django et de fournir un outil plus puissant par bien des aspects. <br />
<br />
<br />
En revanche la mauvaise nouvelle c'est que cela demande un peu plus de travail lorsque vous voulez juste faire une modification mineure pour rajouter un champ (mais à long terme vous devriez y gagner, par exemple pour migrer vers une version plus récente sans conflit). C'est parce que la fonction 'contribute_to_model()' a disparu.<br />
<br />
La première conséquence est que si votre code importe la classe 'Contact' par exemple, vous devriez plutôt utiliser la fonction 'creme.persons.get_contact_model()' (ou bien la variable 'settings.PERSONS_CONTACT_MODEL' lorsque vous définissez une ForeignKey par exemple).<br />
<br />
La seconde conséquence c'est que maintenant, si vous voulez modifier Contact, vous devez écrire votre propre classe de contact (mais il existe une classe 'persons.models.AbstractContact' qui vous permet de n'avoir presque rien à faire au final, à part ajouter les champs qui vous intéresse), puis dans 'settings.py' configurer la variable 'PERSONS_CONTACT_MODEL' afin de pointer vers votre propre classe.<br />
<br />
Tout ceci est décrit plus précisément dans le tutoriel, au chapitre "Modification d'un modèle existant". Il y a notamment une partie "Comment swapper un modèle à posteriori ?", qui vous aidera à migrer votre code et votre base de données lorsque vous avez utilisé 'contribute_to_model()' auparavant.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[Creme 1.5] Gros changement pour SettinKey/SettingValue]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=65</link>
			<pubDate>Tue, 02 Sep 2014 12:34:35 +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=65</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Attention ! les explications suivantes concernent uniquement les développeurs d'application ; les changements sont transparents pour les simples utilisateurs.</span><br />
<br />
Les SettinKey/SettingValue permettent la mise en place de variables qui définissent le comportement de l'application, et qui sont accessibles depuis l'interface utilisateur (au contraire du fichier settings.py - ou plutôt local_settings.py - uniquement accessible pour l'administrateur). elles permettent par exemple de régler l'heure d'envoi des e-mails de rappel pour les ToDos (pour cela allez dans la configuration générale -> portail des assistants).<br />
<br />
La version 1.5 s'accompagne d'un gros changement d'implémentation des SettinKey/SettingValue, motivé par les raisons suivantes:<ul class="mycode_list"><li>La description des clés (SettinKey) était stockée en base, et donc la langue des descriptions était figée à la langue de l'installation.<br />
</li>
<li>En fait, que les clés soient stockées en base étaient tout bonnement inutile, puisque les utilisateurs ne peuvent pas en créer de nouvelles ; seules les valeurs (SettingValue) ont besoin d'être en base.<br />
</li>
<li>Les modèles SettinKey/SettingValue étaient dans creme_config ; or cette app se veut être une simple interface de configuration ; de plus creme_core utilisait lui-même des SettinKey/SettingValue dans son code, ce qui induisait une dépendance réciproque peu élégante (même si pas gênante en pratique)</li>
</ul>
<br />
Puisque régler ces différents problèmes allait provoquer des incompatibilités, il a été décidé de les régler tous d'un seul coup, plutôt que d'avoir des changements cassant la compatibilité étalés sur 2 ou 3 versions ; la décision a été facilitée par l'utilisation a priori assez rare de cette fonctionnalité.<br />
<br />
Nouvelle architecture :<ul class="mycode_list"><li>Les SettingKey ne sont plus des modèles ; ce sont de simples instances d'objets Python (c'est à dire non sauvegardées en base), enregistrées dans une <span style="font-style: italic;" class="mycode_i">registry</span>.<br />
</li>
<li>Le champ 'key' des SettingValue a été remplacé par un champ 'key_id'.<br />
</li>
<li>De plus ils sont maintenant dans creme_core (l'un dans "models", l'autre dans "core.setting_key" .</li>
</ul>
<br />
Voici un petit guide expliquant comment modifier votre code utilisant les SettinKey/SettingValue, pour passer de Creme1.4 à Creme1.5.<br />
<br />
<span style="text-decoration: underline;" class="mycode_u">Remarque</span> : notez bien que vous n'avez pas à vous soucier de la migration de la base de données ; celle-ci qui est effectuée par la commande 'migrate' comme d'habitude, et se charge de vos SettinKey/SettingValue aussi bien que celles fournies par Creme. Vous n'avez à vous soucier que de modifier votre code (ce qui est déjà pas mal !).<br />
<br />
Avant vous construisiez vos SettingKey dans le <span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i">populate.py</span></span> de votre app ; quelque chose du genre:<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>[...]<br />
from creme.creme_config.models import SettingKey, SettingValue<br />
[...]<br />
from .constants import MY_KEY_ID<br />
[...]<br />
<br />
class Populator(BasePopulator):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[...]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sk = SettingKey.create(pk=MY_KEY_ID,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description=_('Description of my key'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; app_label='my_app', type=SettingKey.INT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SettingValue.create_if_needed(key=sk, user=None, value=42)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [...]</code></div></div><br />
Créez un fichier<span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i"> setting_keys.py</span></span> à la racine de votre app, dans lequel vous déplacez la création du SettingKey, avec quelques modifications (détaillées après) :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code># -*- coding: utf-8 -*-<br />
<br />
from django.utils.translation import ugettext_lazy as _<br />
<br />
from creme.creme_core.core.setting_key import SettingKey<br />
<br />
from .constants import MY_KEY_ID<br />
<br />
<br />
my_skey = SettingKey(id=MY_KEY_ID,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description=_('Description of my key'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; app_label='my_app', type=SettingKey.INT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)</code></div></div><br />
Notez les différences:<ul class="mycode_list"><li>SettingKey n'est plus importé de <span style="font-weight: bold;" class="mycode_b">creme_config.models</span>, mais de <span style="font-weight: bold;" class="mycode_b">creme.creme_core.core.setting_key</span><br />
</li>
<li>La méthode statique<span style="font-weight: bold;" class="mycode_b"> SettingKey.create()</span> a disparue ; on instancie notre objet simplement, que l'on stocke dans une variable globale.<br />
</li>
<li>On utilise un <span style="font-weight: bold;" class="mycode_b">ugettext_lazy()</span> et non plus un <span style="font-weight: bold;" class="mycode_b">ugettext()</span> pour la description.</li>
</ul>
<br />
Vous pouvez ensuite revenir modifier votre <span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b">populate.py</span></span>:<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>[...]<br />
from creme.creme_core.models import SettingValue #SettingKey a disparu + import depuis creme_core et plus depuis creme_config<br />
[...]<br />
from .setting_keys import my_skey #import de votre instance, et non plus de l'ID<br />
[...]<br />
<br />
class Populator(BasePopulator):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[...]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SettingValue.create_if_needed(key=my_skey, user=None, value=42) #Notez le paramètre&nbsp;&nbsp;'key' qui a changé<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[...]</code></div></div><br />
Vous devez ensuite modifier votre <span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i">creme_core_register.py</span></span> pour enregistrer votre SettingKey ; rajoutez ces quelques lignes :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>from creme.creme_core.core.setting_key import setting_key_registry<br />
<br />
from .setting_keys import my_skey<br />
<br />
setting_key_registry.register(my_skey)</code></div></div><br />
Il reste à modifier le code qui utilise une SettingValue:<ul class="mycode_list"><li>Changez l'import a  depuis <span style="font-weight: bold;" class="mycode_b">creme_config.models</span> pour <span style="font-weight: bold;" class="mycode_b">creme_core.models</span>.<br />
</li>
<li>Vos requêtes doivent éventuellement être légèrement modifiées pour prendre en compte le champ 'key' (ForeignKey vers SettingKey) devenu 'key_id' (Charfield).</li>
</ul>
<br />
Par exemple :<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>[...]<br />
from creme.creme_config.models import SettingValue<br />
[...]<br />
&nbsp;&nbsp;&nbsp;&nbsp;my_val = SettingValue.objects.get(key=MY_KEY_ID).value<br />
[...]</code></div></div>deviendrait:<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>[...]<br />
from creme.creme_core.models import SettingValue<br />
[...]<br />
&nbsp;&nbsp;&nbsp;&nbsp;my_val = SettingValue.objects.get(key_id=MY_KEY_ID).value<br />
[...]</code></div></div>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Attention ! les explications suivantes concernent uniquement les développeurs d'application ; les changements sont transparents pour les simples utilisateurs.</span><br />
<br />
Les SettinKey/SettingValue permettent la mise en place de variables qui définissent le comportement de l'application, et qui sont accessibles depuis l'interface utilisateur (au contraire du fichier settings.py - ou plutôt local_settings.py - uniquement accessible pour l'administrateur). elles permettent par exemple de régler l'heure d'envoi des e-mails de rappel pour les ToDos (pour cela allez dans la configuration générale -> portail des assistants).<br />
<br />
La version 1.5 s'accompagne d'un gros changement d'implémentation des SettinKey/SettingValue, motivé par les raisons suivantes:<ul class="mycode_list"><li>La description des clés (SettinKey) était stockée en base, et donc la langue des descriptions était figée à la langue de l'installation.<br />
</li>
<li>En fait, que les clés soient stockées en base étaient tout bonnement inutile, puisque les utilisateurs ne peuvent pas en créer de nouvelles ; seules les valeurs (SettingValue) ont besoin d'être en base.<br />
</li>
<li>Les modèles SettinKey/SettingValue étaient dans creme_config ; or cette app se veut être une simple interface de configuration ; de plus creme_core utilisait lui-même des SettinKey/SettingValue dans son code, ce qui induisait une dépendance réciproque peu élégante (même si pas gênante en pratique)</li>
</ul>
<br />
Puisque régler ces différents problèmes allait provoquer des incompatibilités, il a été décidé de les régler tous d'un seul coup, plutôt que d'avoir des changements cassant la compatibilité étalés sur 2 ou 3 versions ; la décision a été facilitée par l'utilisation a priori assez rare de cette fonctionnalité.<br />
<br />
Nouvelle architecture :<ul class="mycode_list"><li>Les SettingKey ne sont plus des modèles ; ce sont de simples instances d'objets Python (c'est à dire non sauvegardées en base), enregistrées dans une <span style="font-style: italic;" class="mycode_i">registry</span>.<br />
</li>
<li>Le champ 'key' des SettingValue a été remplacé par un champ 'key_id'.<br />
</li>
<li>De plus ils sont maintenant dans creme_core (l'un dans "models", l'autre dans "core.setting_key" .</li>
</ul>
<br />
Voici un petit guide expliquant comment modifier votre code utilisant les SettinKey/SettingValue, pour passer de Creme1.4 à Creme1.5.<br />
<br />
<span style="text-decoration: underline;" class="mycode_u">Remarque</span> : notez bien que vous n'avez pas à vous soucier de la migration de la base de données ; celle-ci qui est effectuée par la commande 'migrate' comme d'habitude, et se charge de vos SettinKey/SettingValue aussi bien que celles fournies par Creme. Vous n'avez à vous soucier que de modifier votre code (ce qui est déjà pas mal !).<br />
<br />
Avant vous construisiez vos SettingKey dans le <span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i">populate.py</span></span> de votre app ; quelque chose du genre:<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>[...]<br />
from creme.creme_config.models import SettingKey, SettingValue<br />
[...]<br />
from .constants import MY_KEY_ID<br />
[...]<br />
<br />
class Populator(BasePopulator):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[...]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sk = SettingKey.create(pk=MY_KEY_ID,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description=_('Description of my key'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; app_label='my_app', type=SettingKey.INT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SettingValue.create_if_needed(key=sk, user=None, value=42)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [...]</code></div></div><br />
Créez un fichier<span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i"> setting_keys.py</span></span> à la racine de votre app, dans lequel vous déplacez la création du SettingKey, avec quelques modifications (détaillées après) :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code># -*- coding: utf-8 -*-<br />
<br />
from django.utils.translation import ugettext_lazy as _<br />
<br />
from creme.creme_core.core.setting_key import SettingKey<br />
<br />
from .constants import MY_KEY_ID<br />
<br />
<br />
my_skey = SettingKey(id=MY_KEY_ID,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description=_('Description of my key'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; app_label='my_app', type=SettingKey.INT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)</code></div></div><br />
Notez les différences:<ul class="mycode_list"><li>SettingKey n'est plus importé de <span style="font-weight: bold;" class="mycode_b">creme_config.models</span>, mais de <span style="font-weight: bold;" class="mycode_b">creme.creme_core.core.setting_key</span><br />
</li>
<li>La méthode statique<span style="font-weight: bold;" class="mycode_b"> SettingKey.create()</span> a disparue ; on instancie notre objet simplement, que l'on stocke dans une variable globale.<br />
</li>
<li>On utilise un <span style="font-weight: bold;" class="mycode_b">ugettext_lazy()</span> et non plus un <span style="font-weight: bold;" class="mycode_b">ugettext()</span> pour la description.</li>
</ul>
<br />
Vous pouvez ensuite revenir modifier votre <span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b">populate.py</span></span>:<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>[...]<br />
from creme.creme_core.models import SettingValue #SettingKey a disparu + import depuis creme_core et plus depuis creme_config<br />
[...]<br />
from .setting_keys import my_skey #import de votre instance, et non plus de l'ID<br />
[...]<br />
<br />
class Populator(BasePopulator):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[...]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SettingValue.create_if_needed(key=my_skey, user=None, value=42) #Notez le paramètre&nbsp;&nbsp;'key' qui a changé<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[...]</code></div></div><br />
Vous devez ensuite modifier votre <span style="font-weight: bold;" class="mycode_b"><span style="font-style: italic;" class="mycode_i">creme_core_register.py</span></span> pour enregistrer votre SettingKey ; rajoutez ces quelques lignes :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>from creme.creme_core.core.setting_key import setting_key_registry<br />
<br />
from .setting_keys import my_skey<br />
<br />
setting_key_registry.register(my_skey)</code></div></div><br />
Il reste à modifier le code qui utilise une SettingValue:<ul class="mycode_list"><li>Changez l'import a  depuis <span style="font-weight: bold;" class="mycode_b">creme_config.models</span> pour <span style="font-weight: bold;" class="mycode_b">creme_core.models</span>.<br />
</li>
<li>Vos requêtes doivent éventuellement être légèrement modifiées pour prendre en compte le champ 'key' (ForeignKey vers SettingKey) devenu 'key_id' (Charfield).</li>
</ul>
<br />
Par exemple :<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>[...]<br />
from creme.creme_config.models import SettingValue<br />
[...]<br />
&nbsp;&nbsp;&nbsp;&nbsp;my_val = SettingValue.objects.get(key=MY_KEY_ID).value<br />
[...]</code></div></div>deviendrait:<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>[...]<br />
from creme.creme_core.models import SettingValue<br />
[...]<br />
&nbsp;&nbsp;&nbsp;&nbsp;my_val = SettingValue.objects.get(key_id=MY_KEY_ID).value<br />
[...]</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Discussion autour de l'interface]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=63</link>
			<pubDate>Mon, 23 Jun 2014 11:07:36 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=48">Saga</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=63</guid>
			<description><![CDATA[Je reprend <a href="https://www.cremecrm.com/forum/showthread.php?tid=62" target="_blank" rel="noopener" class="mycode_url">le sujet</a> de l'interface à l'extérieur du sujet sur le forum bug. C'est plus adapté ici je pense. Donc voilà la discussion :<br />
<br />
<blockquote class="mycode_quote"><cite>genglert a écrit :</cite><blockquote class="mycode_quote"><cite>Citation :</cite>Également, je pense qu'il est important (mais ne le prenez pas mal) de professionnaliser l'interface. Je suis en stage dans une entreprise qui cherche à remplacer Sugar CRM devenu propriétaire et cette interface trop "geek" à l'air de faire douter de la qualité de ce CRM qui est mieux que ce qu'il peut laisser penser, et c'est là qu'il y a un problème.<br />
<br />
Je comprend par contre que vous soyez attaché à cette sympathique interface mais je préfère être honnête.</blockquote>
<br />
Pas de problème vous pouvez faire autant de critiques que vous le voulez ; les critiques sont importantes pour s'améliorer et nous les écoutons attentivement. Quand bien même nous penserions qu'une critique n'est pas fondée, tant que c'est fait respectueusement il n'y a pas de raison de le prendre mal. Et pour le coup votre critique est sûrement fondée.<br />
<br />
Il faut bien voir que les motivations fondatrices de Creme étaient que les CRM libres n'étaient pas suffisamment puissants ; et que les modifier pour arriver à un résultat qui nous satisferait nous semblait plus difficile encore que de partir de zéro (à l'époque nous faisions de l'intégration de VTiger, fork de SugarCRM). Et quelques années plus tard, avec nos petits moyens, nous pensons encore avoir fait le bon choix, même si cela n'a rien de facile.<br />
<br />
Notre principal défi technique est donc de proposer beaucoup de fonctionnalités très puissantes, tout en restant accessible au niveau de l'interface. C'est évidemment complexe (et intéressant) ; et en raison de notre petite taille, nous sommes évidemment contraint de faire des choix difficiles. Dans les première années nous nous sommes plutôt concentrés sur le fond (et il y avait déjà beaucoup à faire), ce qui se comprend au vue de nos motivations que j'ai expliquées,  et malheureusement un peu au dépend de la forme.<br />
<br />
Nous ne sommes donc ni complètement satisfaits de l'interface actuelle, ni spécialement "attachés à notre interface de geek". L'interface est ce qu'elle est, fruit d'un certain nombre de concessions (et pas forcément issue d'un volonté forte de faire comme ceci ou comme cela), et il suffit de regarder les évolutions des dernières versions pour voir que cela bouge pas mal, et qu'à présent que la plupart des grosses fonctionnalités sont là, nous pouvons consacrer plus de temps à l'interface. Et autant le thème Chantilly est volontairement fantaisiste et ne laisse pas indifférent (mais comme il plaît à plein de gens ce n'est pas un problème), autant le thème Icecream est bien plus classique et s'est bien améliorée au fil des versions.<br />
<br />
En revanche si votre critique est sûrement fondée, elle n'est pas très constructive, dans la mesure où "professionnaliser l'interface" ne veut pas dire grand chose de bien précis. Nous travaillons déjà sur l'interface (entre autres choses, mais c'est un autre problème) ; donc soit vous pensez que les améliorations précédentes allaient dans la bonne direction, et dans ce cas c'est plus des encouragements qu'il faut donner (voire des contributions) ; soit vous pensez que cela ne va pas dans la bonne direction, mais alors il va falloir préciser vos griefs, en pointant des points précis, en envoyant des <span style="font-style: italic;" class="mycode_i">patches</span> ou en réalisant des <span style="font-style: italic;" class="mycode_i">mockups</span> par exemple.<br />
<br />
Il serait triste évidemment que votre entreprise ignore Creme sans même avoir regardé ses vraies possibilités. Mais il nous est impossible de satisfaire tout le monde, et si elle ne contribue d'aucune façon a Creme (argent, code, ...), il est évident que son influence sur la direction du projet sera faible. Car si comme je l'ai dit nous écoutons les critiques, notre TODO list est déjà loin d'être vide, et c'est  le temps qui nous manque, pas les idées ! <img src="https://www.cremecrm.com/forum/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /></blockquote><br />
Alors je vais commencer :<br />
<br />
Parmi les choses que je reproche à Creme il y a le menu à gauche qui glisse. Même si c'est pratique et ça libère de l'espace sur la page, quand on est pas sur l'écran le plus à gauche (dans le cas d'un utilisateur qui a plusieurs écran) on arrive pas du premier coup à afficher le menu. De plus il y a de la place à la verticale pour afficher les sous-menu mais cet espace n'est pas utilisé. Actuellement, en imaginant que j'ai cliqué sur un sous-menu, pour afficher autre chose voici ce que je dois faire :<br />
<br />
Cliquer sur "Revenir au début"<br />
Cliquer sur un autre menu<br />
Cliquer sur le sous-menu voulu<br />
<br />
Imaginez que si le curseur est sur Activités on a quelque chose du genre :<br />
<br />
Accueil<br />
Ma page<br />
Activités<br />
> Portail des activités<br />
> Calendrier<br />
> ...<br />
Comptes et contacts<br />
...<br />
<br />
Et bien là on a qu'un seul clic.<br />
<br />
Sinon c'est le fait qu'il ne soit pas responsive-design. Sur un téléphone portable par exemple, c'est assez difficile d'accéder au menu. EDIT : J'étais en train de me dire que peut-être que l'adaptation pour les petits-écran n'a aucun intérêt pour un CRM... De plus, ça donne des contraintes qui peuvent nuire à l'efficacité. EDIT 2  : <a href="http://www.zdnet.fr/actualites/le-crm-mobile-s-impose-dans-les-entreprises-francaises-39700385.htm" target="_blank" rel="noopener" class="mycode_url">Apparemment</a> ça à l'air tout de même assez important. Mais de là à faire quelque chose d'entièrement responsive, j'ai pas la réponse.<br />
<br />
Sinon j'ai découvert l'utilité de l'épingle par quelqu'un à qui ça lui a rappelé je ne sais plus quel software (alors qu'il ne connaissait pas Creme). J'aurais du le savoir avant et je pense que là aussi il y a un problème, pourquoi pas faire un lien pour que le curseur de le souris change et qu'on comprenne qu'il y ait une action ? Pourquoi pas aussi ajouter un tooltip précisant l'action ?<br />
<br />
Je trouve aussi que le logo de Creme dans le menu est beaucoup trop grand comparé à celle du contenu.<br />
<br />
Quand on sélectionne une ligne sur une list_view on a une confirmation visuelle que si la souris quitte cette ligne, ce qui parfois engendre une confusion.<br />
<br />
Sinon votre code html est à 2 erreurs prêt conforme W3C et ça c'est déjà bien. <img src="https://www.cremecrm.com/forum/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" />]]></description>
			<content:encoded><![CDATA[Je reprend <a href="https://www.cremecrm.com/forum/showthread.php?tid=62" target="_blank" rel="noopener" class="mycode_url">le sujet</a> de l'interface à l'extérieur du sujet sur le forum bug. C'est plus adapté ici je pense. Donc voilà la discussion :<br />
<br />
<blockquote class="mycode_quote"><cite>genglert a écrit :</cite><blockquote class="mycode_quote"><cite>Citation :</cite>Également, je pense qu'il est important (mais ne le prenez pas mal) de professionnaliser l'interface. Je suis en stage dans une entreprise qui cherche à remplacer Sugar CRM devenu propriétaire et cette interface trop "geek" à l'air de faire douter de la qualité de ce CRM qui est mieux que ce qu'il peut laisser penser, et c'est là qu'il y a un problème.<br />
<br />
Je comprend par contre que vous soyez attaché à cette sympathique interface mais je préfère être honnête.</blockquote>
<br />
Pas de problème vous pouvez faire autant de critiques que vous le voulez ; les critiques sont importantes pour s'améliorer et nous les écoutons attentivement. Quand bien même nous penserions qu'une critique n'est pas fondée, tant que c'est fait respectueusement il n'y a pas de raison de le prendre mal. Et pour le coup votre critique est sûrement fondée.<br />
<br />
Il faut bien voir que les motivations fondatrices de Creme étaient que les CRM libres n'étaient pas suffisamment puissants ; et que les modifier pour arriver à un résultat qui nous satisferait nous semblait plus difficile encore que de partir de zéro (à l'époque nous faisions de l'intégration de VTiger, fork de SugarCRM). Et quelques années plus tard, avec nos petits moyens, nous pensons encore avoir fait le bon choix, même si cela n'a rien de facile.<br />
<br />
Notre principal défi technique est donc de proposer beaucoup de fonctionnalités très puissantes, tout en restant accessible au niveau de l'interface. C'est évidemment complexe (et intéressant) ; et en raison de notre petite taille, nous sommes évidemment contraint de faire des choix difficiles. Dans les première années nous nous sommes plutôt concentrés sur le fond (et il y avait déjà beaucoup à faire), ce qui se comprend au vue de nos motivations que j'ai expliquées,  et malheureusement un peu au dépend de la forme.<br />
<br />
Nous ne sommes donc ni complètement satisfaits de l'interface actuelle, ni spécialement "attachés à notre interface de geek". L'interface est ce qu'elle est, fruit d'un certain nombre de concessions (et pas forcément issue d'un volonté forte de faire comme ceci ou comme cela), et il suffit de regarder les évolutions des dernières versions pour voir que cela bouge pas mal, et qu'à présent que la plupart des grosses fonctionnalités sont là, nous pouvons consacrer plus de temps à l'interface. Et autant le thème Chantilly est volontairement fantaisiste et ne laisse pas indifférent (mais comme il plaît à plein de gens ce n'est pas un problème), autant le thème Icecream est bien plus classique et s'est bien améliorée au fil des versions.<br />
<br />
En revanche si votre critique est sûrement fondée, elle n'est pas très constructive, dans la mesure où "professionnaliser l'interface" ne veut pas dire grand chose de bien précis. Nous travaillons déjà sur l'interface (entre autres choses, mais c'est un autre problème) ; donc soit vous pensez que les améliorations précédentes allaient dans la bonne direction, et dans ce cas c'est plus des encouragements qu'il faut donner (voire des contributions) ; soit vous pensez que cela ne va pas dans la bonne direction, mais alors il va falloir préciser vos griefs, en pointant des points précis, en envoyant des <span style="font-style: italic;" class="mycode_i">patches</span> ou en réalisant des <span style="font-style: italic;" class="mycode_i">mockups</span> par exemple.<br />
<br />
Il serait triste évidemment que votre entreprise ignore Creme sans même avoir regardé ses vraies possibilités. Mais il nous est impossible de satisfaire tout le monde, et si elle ne contribue d'aucune façon a Creme (argent, code, ...), il est évident que son influence sur la direction du projet sera faible. Car si comme je l'ai dit nous écoutons les critiques, notre TODO list est déjà loin d'être vide, et c'est  le temps qui nous manque, pas les idées ! <img src="https://www.cremecrm.com/forum/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /></blockquote><br />
Alors je vais commencer :<br />
<br />
Parmi les choses que je reproche à Creme il y a le menu à gauche qui glisse. Même si c'est pratique et ça libère de l'espace sur la page, quand on est pas sur l'écran le plus à gauche (dans le cas d'un utilisateur qui a plusieurs écran) on arrive pas du premier coup à afficher le menu. De plus il y a de la place à la verticale pour afficher les sous-menu mais cet espace n'est pas utilisé. Actuellement, en imaginant que j'ai cliqué sur un sous-menu, pour afficher autre chose voici ce que je dois faire :<br />
<br />
Cliquer sur "Revenir au début"<br />
Cliquer sur un autre menu<br />
Cliquer sur le sous-menu voulu<br />
<br />
Imaginez que si le curseur est sur Activités on a quelque chose du genre :<br />
<br />
Accueil<br />
Ma page<br />
Activités<br />
> Portail des activités<br />
> Calendrier<br />
> ...<br />
Comptes et contacts<br />
...<br />
<br />
Et bien là on a qu'un seul clic.<br />
<br />
Sinon c'est le fait qu'il ne soit pas responsive-design. Sur un téléphone portable par exemple, c'est assez difficile d'accéder au menu. EDIT : J'étais en train de me dire que peut-être que l'adaptation pour les petits-écran n'a aucun intérêt pour un CRM... De plus, ça donne des contraintes qui peuvent nuire à l'efficacité. EDIT 2  : <a href="http://www.zdnet.fr/actualites/le-crm-mobile-s-impose-dans-les-entreprises-francaises-39700385.htm" target="_blank" rel="noopener" class="mycode_url">Apparemment</a> ça à l'air tout de même assez important. Mais de là à faire quelque chose d'entièrement responsive, j'ai pas la réponse.<br />
<br />
Sinon j'ai découvert l'utilité de l'épingle par quelqu'un à qui ça lui a rappelé je ne sais plus quel software (alors qu'il ne connaissait pas Creme). J'aurais du le savoir avant et je pense que là aussi il y a un problème, pourquoi pas faire un lien pour que le curseur de le souris change et qu'on comprenne qu'il y ait une action ? Pourquoi pas aussi ajouter un tooltip précisant l'action ?<br />
<br />
Je trouve aussi que le logo de Creme dans le menu est beaucoup trop grand comparé à celle du contenu.<br />
<br />
Quand on sélectionne une ligne sur une list_view on a une confirmation visuelle que si la souris quitte cette ligne, ce qui parfois engendre une confusion.<br />
<br />
Sinon votre code html est à 2 erreurs prêt conforme W3C et ça c'est déjà bien. <img src="https://www.cremecrm.com/forum/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Solution pour modifier un module existant ?]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=61</link>
			<pubDate>Fri, 23 May 2014 18:19:14 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://www.cremecrm.com/forum/member.php?action=profile&uid=48">Saga</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.cremecrm.com/forum/showthread.php?tid=61</guid>
			<description><![CDATA[Bonjour,<br />
<br />
Je cherche à rajouter des numéros d'opportunités indépendant de ceux de creme_entity, ce dernier semble regrouper également tout ce qui est contacts, etc... Du coup j'ai créer un champ et une colonne dans la table opportunities_opportunity. J'ai donc du toucher directement au code du module opportunities (modèle, vue). Donc je voulais savoir si Crème propose un meilleur moyen d'ajouter de telles fonctionnalités ?<br />
<br />
Pour que vous puissiez mieux voir de quoi je parle, vous pouvez voir les modifications que j'ai apporté : <a href="https://github.com/Saggah/Creme_CRM-1.4" target="_blank" rel="noopener" class="mycode_url">https://github.com/Saggah/Creme_CRM-1.4</a><br />
Peut-on voir pour intégrer officiellement une fonctionnalité de ce genre dans le module opportunities ?<br />
<br />
Par contre, j'ai un soucis pour créer les fichiers de migrations (j'en ai besoin maintenant que j'ai ajouté une colonne dans une table de base de donnée). J'ai mis à jour la version de South (maintenant c'est la 0.8.4) comme il semble conseillé sur <a href="https://www.cremecrm.com/forum/showthread.php?tid=18&amp;pid=83#pid83" target="_blank" rel="noopener" class="mycode_url">ce post</a> et j'ai le même message d'erreur :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>&#36; python2.7 manage.py schemamigration opportunities --auto<br />
/usr/lib/python2.7/pkgutil.py:186: ImportWarning: Not importing directory '/usr/local/lib/python2.7/dist-packages/virtualenvwrapper': missing __init__.py<br />
&nbsp;&nbsp;file, filename, etc = imp.find_module(subname, path)<br />
Traceback (most recent call last):<br />
&nbsp;&nbsp;File "manage.py", line 10, in &lt;module&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;execute_from_command_line(sys.argv)<br />
&nbsp;&nbsp;File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 443, in execute_from_command_line<br />
&nbsp;&nbsp;&nbsp;&nbsp;utility.execute()<br />
&nbsp;&nbsp;File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 382, in execute<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.fetch_command(subcommand).run_from_argv(self.argv)<br />
&nbsp;&nbsp;File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 196, in run_from_argv<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.execute(*args, **options.__dict__)<br />
&nbsp;&nbsp;File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute<br />
&nbsp;&nbsp;&nbsp;&nbsp;output = self.handle(*args, **options)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/management/commands/schemamigration.py", line 105, in handle<br />
&nbsp;&nbsp;&nbsp;&nbsp;(k, v) for k, v in freezer.freeze_apps([migrations.app_label()]).items()<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/creator/freezer.py", line 37, in freeze_apps<br />
&nbsp;&nbsp;&nbsp;&nbsp;model_defs[model_key(model)] = prep_for_freeze(model)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/creator/freezer.py", line 73, in prep_for_freeze<br />
&nbsp;&nbsp;&nbsp;&nbsp;fields = modelsinspector.get_model_fields(model, m2m=True)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/modelsinspector.py", line 407, in get_model_fields<br />
&nbsp;&nbsp;&nbsp;&nbsp;field_defs[field.name] = field.south_field_triple()<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/creme_crm-1.4/creme/creme_core/models/fields.py", line 80, in south_field_triple<br />
&nbsp;&nbsp;&nbsp;&nbsp;args, kwargs = introspector(self)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/modelsinspector.py", line 373, in introspector<br />
&nbsp;&nbsp;&nbsp;&nbsp;kwargs[kwd] = get_value(field, defn)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/modelsinspector.py", line 292, in get_value<br />
&nbsp;&nbsp;&nbsp;&nbsp;return value_clean(value, options)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/modelsinspector.py", line 350, in value_clean<br />
&nbsp;&nbsp;&nbsp;&nbsp;value = options['converter'](value)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/modelsinspector.py", line 50, in convert_on_delete_handler<br />
&nbsp;&nbsp;&nbsp;&nbsp;raise ValueError("South does not support on_delete with SET(function) as values.")<br />
ValueError: South does not support on_delete with SET(function) as values.</code></div></div><br />
Merci d'avance et bon week-end...]]></description>
			<content:encoded><![CDATA[Bonjour,<br />
<br />
Je cherche à rajouter des numéros d'opportunités indépendant de ceux de creme_entity, ce dernier semble regrouper également tout ce qui est contacts, etc... Du coup j'ai créer un champ et une colonne dans la table opportunities_opportunity. J'ai donc du toucher directement au code du module opportunities (modèle, vue). Donc je voulais savoir si Crème propose un meilleur moyen d'ajouter de telles fonctionnalités ?<br />
<br />
Pour que vous puissiez mieux voir de quoi je parle, vous pouvez voir les modifications que j'ai apporté : <a href="https://github.com/Saggah/Creme_CRM-1.4" target="_blank" rel="noopener" class="mycode_url">https://github.com/Saggah/Creme_CRM-1.4</a><br />
Peut-on voir pour intégrer officiellement une fonctionnalité de ce genre dans le module opportunities ?<br />
<br />
Par contre, j'ai un soucis pour créer les fichiers de migrations (j'en ai besoin maintenant que j'ai ajouté une colonne dans une table de base de donnée). J'ai mis à jour la version de South (maintenant c'est la 0.8.4) comme il semble conseillé sur <a href="https://www.cremecrm.com/forum/showthread.php?tid=18&amp;pid=83#pid83" target="_blank" rel="noopener" class="mycode_url">ce post</a> et j'ai le même message d'erreur :<br />
<br />
<div class="codeblock"><div class="title">Code :</div><div class="body" dir="ltr"><code>&#36; python2.7 manage.py schemamigration opportunities --auto<br />
/usr/lib/python2.7/pkgutil.py:186: ImportWarning: Not importing directory '/usr/local/lib/python2.7/dist-packages/virtualenvwrapper': missing __init__.py<br />
&nbsp;&nbsp;file, filename, etc = imp.find_module(subname, path)<br />
Traceback (most recent call last):<br />
&nbsp;&nbsp;File "manage.py", line 10, in &lt;module&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;execute_from_command_line(sys.argv)<br />
&nbsp;&nbsp;File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 443, in execute_from_command_line<br />
&nbsp;&nbsp;&nbsp;&nbsp;utility.execute()<br />
&nbsp;&nbsp;File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 382, in execute<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.fetch_command(subcommand).run_from_argv(self.argv)<br />
&nbsp;&nbsp;File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 196, in run_from_argv<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.execute(*args, **options.__dict__)<br />
&nbsp;&nbsp;File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute<br />
&nbsp;&nbsp;&nbsp;&nbsp;output = self.handle(*args, **options)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/management/commands/schemamigration.py", line 105, in handle<br />
&nbsp;&nbsp;&nbsp;&nbsp;(k, v) for k, v in freezer.freeze_apps([migrations.app_label()]).items()<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/creator/freezer.py", line 37, in freeze_apps<br />
&nbsp;&nbsp;&nbsp;&nbsp;model_defs[model_key(model)] = prep_for_freeze(model)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/creator/freezer.py", line 73, in prep_for_freeze<br />
&nbsp;&nbsp;&nbsp;&nbsp;fields = modelsinspector.get_model_fields(model, m2m=True)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/modelsinspector.py", line 407, in get_model_fields<br />
&nbsp;&nbsp;&nbsp;&nbsp;field_defs[field.name] = field.south_field_triple()<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/creme_crm-1.4/creme/creme_core/models/fields.py", line 80, in south_field_triple<br />
&nbsp;&nbsp;&nbsp;&nbsp;args, kwargs = introspector(self)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/modelsinspector.py", line 373, in introspector<br />
&nbsp;&nbsp;&nbsp;&nbsp;kwargs[kwd] = get_value(field, defn)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/modelsinspector.py", line 292, in get_value<br />
&nbsp;&nbsp;&nbsp;&nbsp;return value_clean(value, options)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/modelsinspector.py", line 350, in value_clean<br />
&nbsp;&nbsp;&nbsp;&nbsp;value = options['converter'](value)<br />
&nbsp;&nbsp;File "/home/makina/Documents/kseroux/South-0.8.4/south/modelsinspector.py", line 50, in convert_on_delete_handler<br />
&nbsp;&nbsp;&nbsp;&nbsp;raise ValueError("South does not support on_delete with SET(function) as values.")<br />
ValueError: South does not support on_delete with SET(function) as values.</code></div></div><br />
Merci d'avance et bon week-end...]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Passage à Django1.4]]></title>
			<link>https://www.cremecrm.com/forum/showthread.php?tid=25</link>
			<pubDate>Tue, 02 Apr 2013 10:38:11 +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=25</guid>
			<description><![CDATA[Ce matin du 2 avril, la version trunk de Creme est passé de Django1.3 à Django1.4, qui sera la version de Django de la prochaine version stable de Creme (prévue pour Juin normalement). Nous passerons à Django 1.5 pour la version stable suivante.<br />
<br />
Le layout de projet a été changé en faveur du nouveau layout conseillé par l'équipe de Django : <br />
- le fichier manage.py est maintenant à la racine, et non plus dans creme/ .<br />
- dans settings.py, ainsi que dans le code, les apps Creme se voient préfixées de 'creme.', par exemple 'creme_core' devient 'creme.creme_core' .<br />
<br />
Notez que pour le moment les time zones sont désactivées (USE_TZ = False). Il s'agit de la plus grosse avancée de Django 1.4, mais elle nécessite un travail supplémentaires au niveau du code notamment. C'est temporaire et les time zones seront activées et fonctionnelles dans les semaines qui suivent, pour la version stable de Creme en préparation.<br />
<br />
À vos virtualenv !]]></description>
			<content:encoded><![CDATA[Ce matin du 2 avril, la version trunk de Creme est passé de Django1.3 à Django1.4, qui sera la version de Django de la prochaine version stable de Creme (prévue pour Juin normalement). Nous passerons à Django 1.5 pour la version stable suivante.<br />
<br />
Le layout de projet a été changé en faveur du nouveau layout conseillé par l'équipe de Django : <br />
- le fichier manage.py est maintenant à la racine, et non plus dans creme/ .<br />
- dans settings.py, ainsi que dans le code, les apps Creme se voient préfixées de 'creme.', par exemple 'creme_core' devient 'creme.creme_core' .<br />
<br />
Notez que pour le moment les time zones sont désactivées (USE_TZ = False). Il s'agit de la plus grosse avancée de Django 1.4, mais elle nécessite un travail supplémentaires au niveau du code notamment. C'est temporaire et les time zones seront activées et fonctionnelles dans les semaines qui suivent, pour la version stable de Creme en préparation.<br />
<br />
À vos virtualenv !]]></content:encoded>
		</item>
	</channel>
</rss>