Project

General

Profile

Revision 80fa03cd

ID80fa03cdb1de82555353ddad27d9cc3926b93978
Parent 5cb28e04
Child dcf1a18b

Added by Francois POIROTTE over 9 years ago

[#1258] Ordre de tri initial dans VigiBoard.

Permet la personnalisation par l'administrateur de l'ordre de tri appliqué
par défaut dans VigiBoard.
L'administrateur a accès à l'ensemble des champs fournis par les
greffons des colonnes et peut choisir pour chaque champ de trier par
ordre ascendant ou descendant.

Change-Id: Idf45dd2d4ac801e140a4cbbd1dec4ee0b9751098
Refs: #1258.
Reviewed-on: https://vigilo-dev.si.c-s.fr/review/1499
Tested-by: Build system <>
Reviewed-by: Thomas BURGUIERE <>

View differences:

deployment/settings.ini.in
121 121
fontsize.medium = 10px
122 122
fontsize.large = 25px
123 123

  
124
; Ordre de tri pour la priorité des événements.
125
; - Utiliser "asc" si la priorité est inversement proportionnelle à sa
126
;   valeur (ie: plus le nombre est bas, plus la priorité est élevée).
127
; - Utiliser "desc" si la priorité est proportionnelle à sa valeur
128
;   (ie: plus le nombre est élevé, plus la priorité est élevée).
129
; NE PAS METTRE DE GUILLEMETS/APOSTROPHES AUTOUR DE LA VALEUR.
130
vigiboard_priority_order = asc
131

  
132
; Indique si le tri des événements se fait d'abord sur l'état Nagios
133
; puis l'horodatage de l'événement, ou bien l'inverse.
134
; Dans tous les cas, d'autres critères de tri interviennent avant
135
; (état d'acquittement et priorité ITIL).
136
state_first = True
124
; Ordre de tri par défaut des événements dans le bac à événements.
125
; Il s'agit d'une liste ordonnée de champs, séparés par des blancs.
126
;
127
; Chaque champ peut être suffixé par ":asc" ou ":desc" pour forcer
128
; le sens du tri (ascendant ou descendant, respectivement).
129
; Si ce suffixe est omis, le tri se fait par ordre ascendant par défaut.
130
;
131
; Les champs disponibles sont ceux fournis par les greffons des colonnes.
132
; NB : le greffon de la colonne associée doit être chargé
133
;      pour que la valeur soit prise en compte.
134
;
135
; La valeur par défaut correspond au tri appliqué par défaut dans les
136
; versions de Vigilo antérieures à la version 3.6.
137
default_sort = ack:asc problem:asc priority:asc details:desc date:desc
137 138

  
138 139
; Adresse des autres interfaces de Vigilo.
139 140
; Il peut s'agir de chemins absolus sur le même serveur (ex: /../vigimap/)
development.ini
55 55
; URL vers laquelle le logo de Vigilo redirige.
56 56
logo_link = /
57 57

  
58
; Ordre de tri pour la priorité des événements.
59
; - Utiliser "asc" si la priorité est inversement proportionnelle à sa
60
;   valeur (ie: plus le nombre est bas, plus la priorité est élevée).
61
; - Utiliser "desc" si la priorité est proportionnelle à sa valeur
62
;   (ie: plus le nombre est élevé, plus la priorité est élevée).
63
; NE PAS METTRE DE GUILLEMETS/APOSTROPHES AUTOUR DE LA VALEUR.
64
vigiboard_priority_order = asc
65

  
66
; Indique si le tri des événements se fait d'abord sur l'état Nagios
67
; puis l'horodatage de l'événement, ou bien l'inverse.
68
; Dans tous les cas, d'autres critères de tri interviennent avant
69
; (état d'acquittement et priorité ITIL).
70
state_first = True
58
; Ordre de tri par défaut des événements dans le bac à événements.
59
; Il s'agit d'une liste ordonnée de champs, séparés par des blancs.
60
;
61
; Chaque champ peut être suffixé par ":asc" ou ":desc" pour forcer
62
; le sens du tri (ascendant ou descendant, respectivement).
63
; Si ce suffixe est omis, le tri se fait par ordre ascendant par défaut.
64
;
65
; Les champs disponibles sont ceux fournis par les greffons des colonnes.
66
; NB : le greffon de la colonne associée doit être chargé
67
;      pour que la valeur soit prise en compte.
68
;
69
; La valeur par défaut correspond au tri appliqué par défaut dans les
70
; versions de Vigilo antérieures à la version 3.6.
71
default_sort = ack:asc problem:asc priority:asc details:desc date:desc
71 72

  
72 73
; Caractère de séparation des champs dans
73 74
; l'export CSV.
vigiboard/controllers/plugins/details.py
214 214
                pass
215 215

  
216 216
    def get_sort_criterion(self, query, column):
217
        if column == 'details':
218
            return StateName.order
219
        return None
217
        columns = {
218
            'details': StateName.order,
219
            'problem': StateName.statename.in_([u'OK', u'UP']),
220
        }
221
        return columns.get(column)
220 222

  
vigiboard/controllers/vigiboardrequest.py
20 20

  
21 21
"""Gestion de la requête, des plugins et de l'affichage du Vigiboard"""
22 22

  
23
import logging
23 24
from time import mktime
24 25

  
25 26
from tg import config, tmpl_context, request, url
26 27
from pylons.i18n import ugettext as _
27
from paste.deploy.converters import asbool
28
from paste.deploy.converters import aslist
28 29

  
29 30
from sqlalchemy import not_, and_, asc, desc
30 31
from sqlalchemy.sql.expression import null as expr_null, union_all
......
36 37
from vigiboard.widgets.edit_event import EditEventForm
37 38
from vigiboard.controllers.plugins import VigiboardRequestPlugin, INNER, ITEMS
38 39

  
40
LOGGER = logging.getLogger(__name__)
41

  
39 42
class VigiboardRequest():
40 43
    """
41 44
    Classe gérant la génération de la requête finale,
......
163 166
        # - VIGILO_EXIG_VIGILO_BAC_0050
164 167
        # - VIGILO_EXIG_VIGILO_BAC_0060
165 168
        self.orderby = []
169
        plugins = config.get('columns_plugins', [])
166 170
        if sort:
167
            for _plugin, instance in config.get('columns_plugins', []):
171
            for _plugin, instance in plugins:
168 172
                criterion = instance.get_sort_criterion(self, sort)
169 173
                if criterion is not None:
170 174
                    if order == 'asc':
......
172 176
                    else:
173 177
                        self.orderby.append(desc(criterion))
174 178

  
175
        # Permet de définir le sens de tri pour la priorité.
176
        if config['vigiboard_priority_order'] == 'asc':
177
            priority_order = asc(CorrEvent.priority)
178
        else:
179
            priority_order = desc(CorrEvent.priority)
180

  
181
        self.orderby.extend([
182
            asc(CorrEvent.ack),                             # État acquittement
183
            asc(StateName.statename.in_([u'OK', u'UP'])),   # Vert / Pas vert
184
            priority_order,                                 # Priorité ITIL
185
        ])
186

  
187
        if asbool(config.get('state_first', True)):
188
            self.orderby.extend([
189
                desc(StateName.order),                      # Etat courant
190
                desc(Event.timestamp),                      # Timestamp
191
            ])
192
        else:
193
            self.orderby.extend([
194
                desc(Event.timestamp),                      # Timestamp
195
                desc(StateName.order),                      # Etat courant
196
            ])
179
        default_sort = aslist(config.get('default_sort', ''))
180
        for sort_column in default_sort:
181
            criterion = None
182
            sort_field, _dummy, sort_order = sort_column.partition(':')
183
            for _plugin, instance in plugins:
184
                criterion = instance.get_sort_criterion(self, sort_field)
185
                if criterion is not None:
186
                    if sort_order == 'desc':
187
                        self.orderby.append(desc(criterion))
188
                    elif sort_order in ('asc', None):
189
                        self.orderby.append(asc(criterion))
190
                    else:
191
                        self.orderby.append(asc(criterion))
192
                        LOGGER.warn('Invalid sort order: "%s", sorting in '
193
                                    'ascending order instead', sort_order)
194
                    break
195
            if criterion is None:
196
                LOGGER.info('No such plugin: "%s"', sort_field)
197 197

  
198 198
        if search is not None:
199 199
            # 2nde passe pour les filtres : self.items est désormais défini.
200
            for _plugin, instance in config.get('columns_plugins', []):
200
            for _plugin, instance in plugins:
201 201
                instance.handle_search_fields(self, search, ITEMS, subqueries)
202 202

  
203 203
        if mask_closed_events:

Also available in: Unified diff