commit dc00558861c121d5112d4bcf0be941a37a05f5c2
Author: Francois POIROTTE <francois.poirotte@c-s.fr>
Date:   Fri Apr 27 10:51:42 2012 +0200

    Liens vers les cartes dans VigiBoard (#959).
    
    Ajoute des liens vers les cartes sur lesquelles l'hôte concerné par un
    événement apparaît dans le dialogue de détail d'un l'événement corrélé.
    
    L'URL de base de VigiMap doit être renseignée dans le fichier de
    configuration de VigiBoard pour que ceci fonctionne. La configuration de
    l'URL se fait grâce à l'option de configuration "interfaces.vigimap" (le
    nom est le même que celui attendu par VigiAdmin).
    
    Le nombre de liens pouvant apparaître est configurable grâce à l'option
    "max_maps" avec 2 valeurs particulières :
    * -1 inhibe toute limite (ie. affiche toutes les cartes)
    * 0 désactive la fonctionnalité (ie. n'affiche aucune carte, ni même la
      partie réservée à l'affichage des liens dans la boîte de dialogue)
    Si le nombre de cartes disponibles est supérieur à la limite définie et
    que le mécanisme d'affiche des liens est activé, un message avertit en
    plus l'utilisateur.
    
    Ajoute des tests sur cette nouvelle fonctionnalité.
    De plus, le code !JavaScript du module "details" a été externalisé afin
    de faciliter la lecture du fichier .html du module.
    
    Enfin, le comportement d'ouverture des liens (ex: dans l'onglet courant
    ou dans un nouvel onglet) est configurable grâce à l'option
    "links_target" (il s'agit du même nom d'option que dans VigiAdmin).
    
    Change-Id: I0d1b73fc4e9e7caf36e10a87bc3e0ae3d8972d88
    Refs: #959.
    Reviewed-on: https://vigilo-dev.si.c-s.fr/review/690
    Tested-by: Build system <qa@vigilo-dev.si.c-s.fr>
    Reviewed-by: Aurelien BOMPARD <aurelien.bompard@c-s.fr>

diff --git a/vigiboard/controllers/plugins/details.py b/vigiboard/controllers/plugins/details.py
index fe4a027..8ca2671 100644
--- a/vigiboard/controllers/plugins/details.py
+++ b/vigiboard/controllers/plugins/details.py
@@ -25,12 +25,16 @@ applications externes.
 """
 
 import urllib
-from tg import config, url
+from tg import config, url, request
 from sqlalchemy.sql.expression import null as expr_null, union_all
 
+from repoze.what.predicates import has_permission, in_group
+from vigilo.turbogears.helpers import get_current_user
+
 from vigilo.models.session import DBSession
-from vigilo.models.tables import Event, \
-    CorrEvent, Host, LowLevelService, StateName
+from vigilo.models.tables import Event, CorrEvent, Host, LowLevelService, \
+    StateName, Map, MapNode, MapNodeHost, MapGroup
+from vigilo.models.tables.secondary_tables import MAP_GROUP_TABLE
 
 from vigiboard.controllers.plugins import VigiboardRequestPlugin
 
@@ -52,11 +56,13 @@ class PluginDetails(VigiboardRequestPlugin):
         # Obtention de données sur l'événement et sur son historique
         host_query = DBSession.query(
             Host.idhost.label("idsupitem"),
+            Host.idhost.label("idhost"),
             Host.name.label("host"),
             expr_null().label("service"),
         )
         lls_query = DBSession.query(
             LowLevelService.idservice.label("idsupitem"),
+            Host.idhost.label("idhost"),
             Host.name.label("host"),
             LowLevelService.servicename.label("service"),
         ).join(
@@ -66,6 +72,7 @@ class PluginDetails(VigiboardRequestPlugin):
         event = DBSession.query(
             CorrEvent.idcorrevent,
             CorrEvent.idcause,
+            supitems.c.idhost,
             supitems.c.host,
             supitems.c.service,
             Event.message,
@@ -78,11 +85,43 @@ class PluginDetails(VigiboardRequestPlugin):
         ).filter(CorrEvent.idcorrevent == idcorrevent
         ).first()
 
+        # On détermine les cartes auxquelles cet utilisateur a accès.
+        user_maps = {}
+        max_maps = int(config['max_maps'])
+        is_manager = in_group('managers').is_met(request.environ)
+        if max_maps != 0 and (is_manager or
+            has_permission('vigimap-access').is_met(request.environ)):
+            items = DBSession.query(
+                    Map.idmap,
+                    Map.title,
+                ).distinct(
+                ).join(
+                    (MAP_GROUP_TABLE, MAP_GROUP_TABLE.c.idmap == Map.idmap),
+                    (MapGroup, MapGroup.idgroup == MAP_GROUP_TABLE.c.idgroup),
+                    (MapNodeHost, MapNodeHost.idmap == Map.idmap),
+                ).order_by(Map.title.asc()
+                ).filter(MapNodeHost.idhost == event.idhost)
+
+            if not is_manager:
+                mapgroups = get_current_user().mapgroups(only_direct=True)
+                # pylint: disable-msg=E1103
+                items = items.filter(MapGroup.idgroup.in_(mapgroups))
+
+            # La valeur -1 supprime la limite.
+            if max_maps > 0:
+                # On limite au nombre maximum de cartes demandés + 1.
+                # Un message sera affiché s'il y a effectivement plus
+                # de cartes que la limite configurée.
+                items = items.limit(max_maps + 1)
+
+            user_maps = dict([(m.idmap, m.title) for m in items.all()])
+
         context = {
             'idcorrevent': idcorrevent,
             'host': event.host,
             'service': event.service,
             'message': event.message,
+            'maps': user_maps,
         }
 
         eventdetails = {}
@@ -122,5 +161,6 @@ class PluginDetails(VigiboardRequestPlugin):
                 host = event.host,
                 service = event.service,
                 eventdetails = eventdetails,
+                maps = user_maps,
                 idcause = event.idcause,
             )
