Crème CRM
Arborescence des relations - Version imprimable

+- Crème CRM (https://www.cremecrm.com/forum)
+-- Forum : Développeurs (https://www.cremecrm.com/forum/forumdisplay.php?fid=10)
+--- Forum : Contributions (https://www.cremecrm.com/forum/forumdisplay.php?fid=12)
+--- Sujet : Arborescence des relations (/showthread.php?tid=101)



Arborescence des relations - kali - 09-02-2017

Bonjour,

Nous avons besoin de visualiser l'arborescence des relations d'une personne ou entreprise.
Nous avons déjà fait la requête SQL (elle est en fin de message). Il nous reste à créer le code Python et le bouton au bon endroit.

Dans un premier temps, nous allons afficher de manière très simple sous forme de texte :
Code :
Contact 1    Entreprise 4        Contact 17
                                        Contact 2
                                        Entreprise 20

                Contact 4            Contact 5
                                        Entreprise 20
  
                Contact 24
                          
                Entrepise 20
Contact 1 connaît Entreprise 4 + Contact 4 + Contact 24 + Entreprise 20. C'est le premier niveau d'arborescence.
Et par exemple Contact 4 connaît Contact 5 + Entreprise 20. C'est le second niveau.

Une fois que ceci fonctionnera, nous améliorerons la présentation. Probablement sous une forme bien plus graphique.
Et les entités seront cliquables pour enrouler/dérouler leurs sous-relations.


Il y a un "mais" Smile
Nous ne savons pas à quel endroit il faut regarder pour ajouter le bouton que nous souhaitons.
Dans la fenêtre "Contact", nous voulons ajouter un bouton sur la même ligne que "Supprimer toutes les relations" et "Nouvelles relations".
Même chose dans la fenêtre "Société".
L'idée est d'ouvrir un nouvel onglet pour afficher l'arborescence, ou d'afficher ça sous forme d'overlay.
--> quelqu'un saurait nous indiquer où aller pour ajouter ce bouton ?

La requête SQL :
Code :
SELECT min_id, R1.`header_filter_search_field`, max_id, R2.`header_filter_search_field`
FROM (    SELECT
            CASE
                WHEN `creme_core_relation`.`object_entity_id`<`creme_core_relation`.`subject_entity_id` THEN `creme_core_relation`.`object_entity_id`
                ELSE `creme_core_relation`.`subject_entity_id`
            END AS min_id,
            CASE
                WHEN `creme_core_relation`.`object_entity_id`<`creme_core_relation`.`subject_entity_id` THEN `creme_core_relation`.`subject_entity_id`
                ELSE `creme_core_relation`.`object_entity_id`
            END AS max_id
        FROM `creme_core_cremeentity` AS CCC1
        INNER JOIN `creme_core_relation`
        ON `creme_core_relation`.`subject_entity_id`=CCC1.`id`
        INNER JOIN `creme_core_cremeentity` AS CCC2
        ON `creme_core_relation`.`object_entity_id`=CCC2.`id`
        WHERE     CCC1.`is_deleted`=0 AND CCC2.`is_deleted`=0
                AND    `creme_core_relation`.`is_deleted`=0
                AND (CCC1.`entity_type_id`=63 OR CCC1.`entity_type_id`=67)
                AND (CCC2.`entity_type_id`=63 OR CCC2.`entity_type_id`=67)
                AND (`creme_core_relation`.`object_entity_id`=XXXX OR `creme_core_relation`.`subject_entity_id`=XXXX)
                GROUP BY min_id, max_id
     ) AS relations
INNER JOIN `creme_core_cremeentity` AS R1
ON relations.min_id=R1.`id`
INNER JOIN `creme_core_cremeentity` AS R2
ON relations.max_id=R2.`id`
WHERE  R1.`header_filter_search_field` != R2.`header_filter_search_field`
Les 2 emplacements marqués "XXXX" reçoivent l'identifiant du contact ou de l'entreprise.
Pour l'instant nous avons codé en dur les identifiants 63 et 67 qui correspondent aux types "contact" et "entreprise". Nous irons par la suite les prendre dans les bonnes tables, mais là il se fait tard.


Re: Arborescence des relations - genglert - 09-02-2017

Bonjour.

Le template du bloc des Relations est ici: creme/creme_core/templates/creme_core/templatetags/block_relations.html
Regardez dans le
au début pour les boutons.

Soit vous modifiez directement ce fichier, soit vous créez une app qui sera avant dans le settings.INSTALLED_APPS, et vous surchargez ce template avec un template du même nom dans cette app (ex: creme/my_app/templates/creme_core/templatetags/block_relations.html ).
Dans tous les cas, si vous souhaitez à l'avenir upgrader la version sous-jacente de Creme, il vous faudra potentiellement faire attention au code que vous aurez ajouté ; que ce soit parce que l'API a été modifiée -- ce qui est indiqué dans le CHANGELOG -- ou parce qu'en écrasant la version 'vanilla' du template (avec une ancienne version copiée/collée/modifiée) vous écrasez d'éventuelles améliorations.
La 2ème solution a l'avantage de mieux garder séparé votre code du code de base.

Dernière remarque: django (et donc Creme) utilise un ORM, qui est une couche d'abstraction par dessus SQL (avec ses avantages et ses inconvénients ; la plupart du temps dans notre cas ça fonctionne plutôt bien, avec quelque chose de sécurisé, performant et simple). Tout ça pour dire que s'il est tout à fait possible de forger/lancer ses propres requête "à la main", ce n'est pas forcément la manière "normale" de faire (cf https://docs.djangoproject.com/fr/1.8/#the-model-layer).

Bon courage pour la suite.