Arborescence des relations

Présentez vos contributions ici
kali
Messages : 18
Inscription : 04 févr. 2017, 01:32

Arborescence des relations

Messagepar kali » 09 févr. 2017, 03:52

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 : Tout sélectionner

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" :)
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 : Tout sélectionner

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.

Avatar de l’utilisateur
genglert
Messages : 126
Inscription : 06 juin 2011, 10:54

Re: Arborescence des relations

Messagepar genglert » 09 févr. 2017, 14:44

Bonjour.

Le template du bloc des Relations est ici: creme/creme_core/templates/creme_core/templatetags/block_relations.html
Regardez dans le <div class="buttons"> 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.


Revenir vers « Contributions »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité