Project

General

Profile

Revision 19e88cb8

ID19e88cb82f226b797aef06bb2c882b4f31d410af
Parent 51ede5e8
Child acfeb9e4

Added by Thomas ANDREJAK almost 15 years ago

vigiboard séparé du vigicore

git-svn-id: https://vigilo-dev.si.c-s.fr/svn@349 b22e2e97-25c9-44ff-b637-2e5ceca36478

View differences:

vigiboard/__init__.py
1
# -*- coding: utf-8 -*-
2
"""The vigiboard package"""
3
import vigicore.lib
4
import vigicore.model
5

  
6
lib = vigicore.lib
7
model = vigicore.model
vigiboard/config/vigiboard.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
"""Configuration de Vigiboard."""
4

  
5
vigiboard_config = {
6
    
7
    # Affichage, lien disponibles dans la fenêtre de détail d'un évènement
8
    'vigiboard_links.nagios' : 'http://example1.com/%(idevent)d',
9
    'vigiboard_links.metrology' : 'http://example2.com/%(idevent)d',
10
    'vigiboard_links.security' : 'http://example3.com/%(idevent)d',
11
    'vigiboard_links.servicetype' : 'http://example4.com/%(idevent)d',
12
    
13
    # Nombre d'évènments par pages
14
    'vigiboard_item_per_page' : '15',
15

  
16
    'vigiboard_plugins' : [
17
        [ 'shn' , 'PluginSHN' ]
18
        ]
19

  
20
}
21

  
vigiboard/controllers/__init__.py
1
"""
2
Module contenant le controller ainsi que la classe
3
permettant l'affichage du Vigiboard
4
"""
5

  
6
from vigiboard.controllers.vigiboardrequest import \
7
		VigiboardRequest
8
from vigiboard.controllers.root import \
9
		RootController
vigiboard/controllers/root.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""Vigiboard Controller"""
4

  
5
import tg
6

  
7
from tg import config, expose, flash, require, request, redirect, \
8
                validate, tmpl_context
9

  
10
from tw.forms import validators 
11

  
12
from pylons.i18n import ugettext as _
13

  
14
from sqlalchemy import sql, asc
15

  
16
from vigicore.lib.base import TGController
17
from vigicore.model import DBSession
18

  
19
from vigicore.model import ServiceHautNiveau, HostGroups, \
20
        Events, EventHistory
21

  
22
from repoze.what.predicates import Any, not_anonymous
23

  
24
from vigiboard.widgets.edit_event import edit_event_status_options
25

  
26
from vigicore.controllers.userutils import get_user_groups
27
from vigiboard.controllers.vigiboardrequest import \
28
        VigiboardRequest
29

  
30
from vigicore.controllers.vigicore_controller import Vigicore_RootController
31

  
32
__all__ = ['RootController']
33

  
34
class RootController(Vigicore_RootController):
35
    
36
    """
37
    Le controller général de vigiboard
38
    """
39

  
40
    @expose()
41
    def process_form_errors (self, *argv, **kwargv):
42

  
43
        """
44
        Gestion des erreurs de validation : On affiche les erreurs
45
        puis on redirige vers la dernière page accédée.
46
        """
47
        flash(tmpl_context.form_errors, 'error')
48
        if request.environ.get('HTTP_REFERER') :
49
            redirect(request.environ.get('HTTP_REFERER'
50
                ).split(request.environ.get('HTTP_HOST'))[1])
51
        else :
52
            redirect('/')
53

  
54
    @validate(validators={'page':validators.Int(not_empty=False)},
55
            error_handler=process_form_errors)
56
    @expose('vigiboard.templates.vigiboard')
57
    @require(Any(not_anonymous(), msg="You need to be authenticated"))
58
    def index(self, page = 1, host = None, service = None, output = None,
59
            trouble_ticket=None):
60
            
61
        """
62
        Page d'accueil de Vigiboard. Elle affiche, suivant la page demandée (page 1 par
63
        defaut), la liste des évènements, rangé par ordre de prise en compte puis de sévérité.
64
        Pour accéder à cette page, l'utilisateur doit être authentifié.
65

  
66
        @param page: numéro de la page souhaité, commence à 1
67
        @param host: Si l'utilisateur souhaite sélectionner seulement certains
68
                     évènments suivant leur hôte, il peut placer une expression
69
                     ici en suivant la structure du LIKE en SQL
70
        @param service: Idem que host mais sur les services
71
        @param output: Idem que host mais sur le text explicatif
72
        @param trouble_ticket: Idem que host mais sur les tickets attribués
73
        """
74
        if page < 1 :
75
            page = 1
76

  
77
        events = VigiboardRequest()
78

  
79
        # Application des filtres si nécessaire
80
        if host :
81
            events.add_filter(Events.hostname.like('%%%s%%' % host))
82
        if service :
83
            events.add_filter(Events.servicename.like('%%%s%%' % service))
84
        if output :
85
            events.add_filter(Events.output.like('%%%s%%' % output))
86
        if trouble_ticket :
87
            events.add_filter(Events.trouble_ticket.like(
88
                '%%%s%%' % trouble_ticket))
89

  
90
        # Calcul des éléments à afficher et du nombre de pages possibles
91
        total_row = events.num_rows()
92
       
93
        item_per_page = int(tg.config['vigiboard_item_per_page'])
94

  
95
        if total_row <= item_per_page * (page-1) :
96
            page = 1
97
        id_first_row = item_per_page * (page-1)
98
        id_last_row = min(id_first_row + item_per_page, total_row)
99

  
100
        events.format_events(id_first_row, id_last_row)
101
        events.generate_tmpl_context() 
102

  
103
        return dict(
104
               events = events.events,
105
               id_first_row = id_first_row + 1,
106
               id_last_row = id_last_row,
107
               total_row = total_row,
108
               pages = range(1, (total_row / item_per_page) + 2),
109
               page = page,
110
               event_edit_status_options = edit_event_status_options,
111
               history = [],
112
               hist_error = False
113
            )
114
       
115
    @validate(validators={'idevent':validators.Int(not_empty=True)},
116
            error_handler=process_form_errors)
117
    @expose('json')
118
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
119
    def history_dialog (self, idevent) :
120
        
121
        """
122
        JSon renvoyant les éléments pour l'affichage de la fenêtre de dialogue
123
        contenant des liens internes et externes.
124
        Pour accéder à cette page, l'utilisateur doit être authentifié.
125

  
126
        @param id: identifiant de l'évènement
127
        """
128
        
129
        # Obtention de données sur l'évènement et sur son historique
130
        events = DBSession.query(Events.severity, Events.idevent,
131
                        Events.hostname, Events.servicename
132
                 ).join(( HostGroups , Events.hostname == HostGroups.hostname )
133
                 ).filter(HostGroups.groupname.in_(get_user_groups())
134
                 ).filter(Events.idevent == idevent)[0]
135

  
136
        initial_state = DBSession.query(EventHistory
137
                 ).filter(EventHistory.idevent == idevent
138
                 ).order_by(asc(EventHistory.timestamp)
139
                 ).order_by(asc(EventHistory.type_action))
140

  
141
        if initial_state.count() > 0 :
142
            initial_state = initial_state[0].value
143
        else :
144
            initial_state = 0
145
        
146
        severity = { 0: _('None'), 1: _('OK'), 2: _('Suppressed'),
147
                3: _('Initial'), 4: _('Maintenance'), 5: _('Minor'),
148
                6: _('Major'), 7: _('Critical') }
149
        
150
        return dict(
151
                initial_state = severity[int(initial_state)],
152
                current_state = severity[events.severity],
153
                idevent = events.idevent,
154
                host = events.hostname,
155
                service = events.servicename,
156
                nagios_link = tg.config['vigiboard_links.nagios'] % \
157
                        {'idevent': events.idevent},
158
                metrology_link = tg.config['vigiboard_links.metrology'] % \
159
                        {'idevent': events.idevent},
160
                security_link = tg.config['vigiboard_links.security'] % \
161
                        {'idevent': events.idevent},
162
                servicetype_link = tg.config['vigiboard_links.servicetype'] % \
163
                        {'idevent': events.idevent}
164
            )
165

  
166
    @validate(validators={'idevent':validators.Int(not_empty=True)},
167
            error_handler=process_form_errors)
168
    @expose('vigiboard.templates.vigiboard')
169
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
170
    def event(self, idevent):
171
        """
172
        Affichage de l'historique d'un évènement.
173
        Pour accéder à cette page, l'utilisateur doit être authentifié.
174

  
175
        @param idevent: identifiant de l'évènement souhaité
176
        """
177

  
178
        events = VigiboardRequest()
179
        events.add_filter(Events.idevent == idevent)
180
        
181
        # Vérification que l'évènement existe
182
        if events.num_rows() != 1 :
183
            flash(_('Error in DB'), 'error')
184
            redirect('/')
185
       
186
        events.format_events(0, 1)
187
        events.format_history()
188
        events.generate_tmpl_context() 
189

  
190
        return dict(
191
               events = events.events,
192
               id_first_row = 1,
193
               id_last_row = 1,
194
               total_row = 1,
195
               pages = [1],
196
               page = 1,
197
               event_edit_status_options = edit_event_status_options,
198
               history = events.hist,
199
               hist_error = True
200
            )
201

  
202
    @validate(validators={'host':validators.NotEmpty(),
203
        'service':validators.NotEmpty()}, error_handler=process_form_errors)
204
    @expose('vigiboard.templates.vigiboard')
205
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
206
    def host_service(self, host, service):
207
        
208
        """
209
        Affichage de l'historique de l'ensemble des évènements correspondant au
210
        host et service demandé.
211
        Pour accéder à cette page, l'utilisateur doit être authentifié.
212

  
213
        @param host: Nom de l'hôte souhaité.
214
        @param service: Nom du service souhaité
215
        """
216

  
217
        events = VigiboardRequest()
218
        events.add_filter(Events.hostname == host,
219
                Events.servicename == service)
220
        
221
        # Vérification qu'il y a au moins 1 évènement qui correspond
222
        if events.num_rows() == 0 :
223
            redirect('/')
224
       
225
        events.format_events(0, events.num_rows())
226
        events.format_history()
227
        events.generate_tmpl_context() 
228

  
229
        return dict(
230
               events = events.events,
231
               id_first_row = 1,
232
               id_last_row = 1,
233
               total_row = 1,
234
               pages = [1],
235
               page = 1,
236
               event_edit_status_options = edit_event_status_options,
237
               history = events.hist,
238
               hist_error = True
239
            )
240

  
241
    @validate(validators={
242
        "id":validators.Regex(r'^[0-9]+(,[0-9]*)*,?$'),
243
        "trouble_ticket":validators.Regex(r'^[0-9]*$'),
244
        "status":validators.OneOf(['NoChange', 'None', 'Acknowledged',
245
                'AAClosed'])
246
        }, error_handler=process_form_errors)
247
    @require(Any(not_anonymous(), msg=_("You need to be authenticated")))
248
    def update(self,**krgv):
249
        
250
        """
251
        Mise à jour d'un évènement suivant les arguments passés.
252
        Cela peut être un changement de ticket ou un changement de statu.
253
        
254
        @param krgv['id']: Le ou les identifiants des évènements à traiter
255
        @param krgv['tt']: Nouveau numéro du ticket associé.
256
        @param krgv['status']: Nouveau status de/des évènements.
257
        """
258
        
259
        # Si l'utilisateur édite plusieurs évènements à la fois,
260
        # il nous faut chacun des identifiants
261

  
262
        ids = krgv['id'].split(',')
263
       
264
        if len(ids) > 1 :
265
            ids = ids[:-1]
266
        
267
        events = VigiboardRequest()
268
        events.add_filter(Events.idevent.in_(ids))
269
        
270
        # Vérification que au moins un des identifiants existe et est éditable
271
        if events.num_rows() <= 0 :
272
            flash(_('No access to this event'), 'error')
273
            redirect('/')
274
        
275
        # Modification des évènements et création d'un historique
276
        # pour chacun d'eux
277
        
278
        username = request.environ.get('repoze.who.identity'
279
                ).get('repoze.who.userid')
280

  
281
        for req in events.req :
282
            if isinstance(req,Events):
283
                event = req
284
            else:
285
                event = req[0]
286
            if krgv['trouble_ticket'] != '' :
287
                event.trouble_ticket = krgv['trouble_ticket']
288
                history = EventHistory(type_action = "Ticket change",
289
                    idevent = event.idevent, value = '', text = '',
290
                    username = username)
291
                DBSession.add(history)   
292
            if krgv['status'] != 'NoChange' :
293
                event.status = krgv['status']
294
                history = EventHistory(
295
                        type_action = "Acknowlegement change state",
296
                        idevent = event.idevent, value = '', text = '',
297
                        username = username)
298
                DBSession.add(history)
299
       
300
        flash(_('Updated successfully'))
301
	# Redirection vers la dernière page accédée
302
        redirect(request.environ.get('HTTP_REFERER').split(
303
            request.environ.get('HTTP_HOST')+tg.config['base_url_filter.base_url'])[1])
304

  
vigiboard/controllers/vigiboard_plugin/__init__.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3

  
4
class VigiboardRequestPlugin(object):
5

  
6
    """
7
    Classe dont les plugins utilisé dans VigiboardRequest doivent étendre.
8
    """
9

  
10
    def __init__ (self, table = None, join = None, outerjoin = None,
11
            filters = None, groupby = None, orderby = None, name = '',
12
            style = None):
13

  
14
        self.table = table
15
        self.join = join
16
        self.outerjoin = outerjoin
17
        self.filter = filters
18
        self.orderby = orderby
19
        self.name = name
20
        self.groupby = groupby
21
        self.style = style
22

  
23
    def __show__ (self, event):
24

  
25
        """
26
        Permet d'éviter toutes erreurs d'affichage.
27
        C'est la fonction appelé par le formateur d'évènements.
28
        """
29

  
30
        show = self.show(event)
31

  
32
        if show != None :
33
            try:
34
                return str(show)
35
            except:
36
                return _('Error')
37

  
38
    def show(self, event):
39

  
40
        """
41
        Fonction qui affichera par défaut une chaîne de
42
        caractères vide dans la colonne attribué au plugin.
43

  
44
        En général, les plugins devront redéfinir cette fonction
45
        pour afficher ce qu'ils souhaitent.
46
        """
47

  
48
        return ''
49

  
vigiboard/controllers/vigiboard_plugin/shn.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3

  
4
from vigiboard.controllers.vigiboard_plugin import \
5
        VigiboardRequestPlugin
6
from vigicore.model import ServiceHautNiveau, Events
7
from sqlalchemy import sql, asc
8
from pylons.i18n import ugettext as _
9

  
10
class PluginSHN (VigiboardRequestPlugin):
11

  
12
    """
13
    Plugin permettant de rajouter le nombre de SHNs impactés à
14
    l'affichage
15
    """
16

  
17
    def __init__(self):
18
        super(PluginSHN,self).__init__(
19
            table = [ServiceHautNiveau.servicename_dep,
20
                sql.func.count(Events.idevent)],
21
            outerjoin = [(ServiceHautNiveau,
22
                ServiceHautNiveau.servicename_dep == Events.servicename)],
23
            groupby = [(Events),(ServiceHautNiveau.servicename_dep)],
24
            name = _(u'SHNs impacté'),
25
            style = {'style':'text-align:center'}
26
        )
27
    
28
    def show(self, req):
29
        """Fonction d'affichage"""
30
        if req[1] :
31
            return req[2]
32
        else :
33
            return None
vigiboard/controllers/vigiboard_plugin/tests.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3

  
4
from vigiboard.controllers.vigiboard_plugin import \
5
	        VigiboardRequestPlugin
6
from vigicore.model import EventHistory, Events
7

  
8
class MonPlugin(VigiboardRequestPlugin):
9
    """Plugin de test"""
10
    
11
    def __init__(self):
12
        super(PluginSHN,self).__init__(
13
            table = [EventHistory.idevent],
14
            join = [(EventHistory, EventHistory.idevent == Events.idevent)]
15
        )
16

  
17
    def show(self, req):
18
	"""Fonction d'affichage"""
19
	return req[1]
20

  
vigiboard/controllers/vigiboardrequest.py
1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4: 
3
"""Gestion de la requête, des plugins et de l'affichage du Vigiboard"""
4

  
5
from vigicore.model import Events, Host, Service, \
6
        HostGroups, ServiceGroups, EventHistory
7
from tg import tmpl_context, url, config
8
from vigicore.model import DBSession
9
from sqlalchemy import not_ , and_ , asc , desc
10
from tw.jquery import JQueryUIDialog
11
from vigiboard.widgets.edit_event import EditEventForm , SearchForm
12
from vigicore.controllers.userutils import get_user_groups
13
from vigiboard.controllers.vigiboard_plugin import VigiboardRequestPlugin
14
from pylons.i18n import ugettext as _
15

  
16
class VigiboardRequest():
17
    
18
    """
19
    Classe gérant la génération de la requête finale,
20
    le préformatage des évènements et celui des historiques
21
    """
22

  
23
    def __init__(self):
24

  
25
        """
26
        Initialisation de toutes les variables nécessaires: Liste des groupes de
27
        l'utilisateur, les classes à appliquer suivant la sévérité, les
28
        différentes étapes de la génération de la requête et la liste des
29
        plugins appliqués.
30
        """
31

  
32
        self.user_groups = get_user_groups()
33
        self.bouton_severity = { 0: 'Minor', 1: 'Minor', 2: 'Minor',
34
                3: 'Minor', 4: 'Minor', 5: 'Minor', 6: 'Major', 7: 'Critical' }
35
        self.class_severity = { 0: 'None', 1: 'None', 2: 'None', 3: 'None',
36
                4: 'None', 5: 'Minor', 6: 'Major', 7: 'Critical' }
37
        self.severity = { 0: _('None'), 1: _('OK'), 2: _('Suppressed'),
38
                3: _('Initial'), 4: _('Maintenance'), 5: _('Minor'),
39
                6: _('Major'), 7: _('Critical') }
40

  
41
        self.class_ack = {'Acknowledged': 'Ack', 'None': '', 'AAClosed': 'Ack'}
42

  
43
        self.generaterq = False
44
        self.table = [Events]
45
        self.join = [( Host, Events.hostname == Host.name ),
46
                ( Service, Events.servicename == Service.name ),
47
                ( HostGroups , Host.name == HostGroups.hostname ),
48
                ( ServiceGroups , Service.name == ServiceGroups.servicename )
49
                ]
50
        self.outerjoin = []
51
        self.filter = [HostGroups.groupname.in_(self.user_groups),
52
                 ServiceGroups.groupname.in_(self.user_groups),
53
                 not_(and_(Events.active == False,
54
                     Events.status == 'AAClosed')),
55
                 Events.timestamp_active != None#,
56
                 #not_(Events.timestamp_active.like('0000-00-00 00:00:00'))
57
                 ]
58
        self.orderby = [desc(Events.status),
59
                                desc(Events.active),
60
                                desc(Events.severity),
61
                                asc(Events.hostname),
62
                                desc(Events.timestamp)]
63
        self.groupby = []
64
        self.plugin = []
65
        self.events = []
66
        self.idevents = []
67
        self.hist = []
68
        self.req = DBSession
69

  
70
    def add_plugin(self, *argv):
71
        
72
        """
73
        Ajout d'un plugin, on lui prélève ses ajouts dans la requête
74
        """
75
        for i in argv :
76
            if isinstance(i, VigiboardRequestPlugin):
77
                if i.table :
78
                    self.add_table(*i.table)
79
                if i.join :
80
                    self.add_join(*i.join)
81
                if i.outerjoin :
82
                    self.add_outer_join(*i.outerjoin)
83
                if i.filter :
84
                    self.add_filter(*i.filter)
85
                if i.groupby :    
86
                    self.add_group_by(*i.groupby)
87
                if i.orderby :
88
                    self.add_order_by(*i.orderby)
89
                self.plugin.append(i)
90

  
91
    def generate_request(self):
92
        
93
        """
94
        Génération de la requête avec l'ensemble des données stockées
95
        et la place dans la variable rq de la classe
96
        """
97
        for plug in config['vigiboard_plugins']:
98
            try:
99
                mypac = __import__(
100
                    'vigiboard.controllers.vigiboard_plugin.' +\
101
                            plug[0],globals(), locals(), [plug[1]],-1)
102
                self.add_plugin(getattr(mypac,plug[1])())
103
            except:
104
                raise
105
        
106
        # query et join ont besoin de referrence
107
        self.req = self.req.query(*self.table)
108
        self.req = self.req.join(*self.join)
109

  
110
        # le reste, non
111
        for i in self.outerjoin:
112
            self.req = self.req.outerjoin(i)
113
        for i in self.filter:
114
            self.req = self.req.filter(i)
115
        for i in self.groupby:
116
            self.req = self.req.group_by(i)
117
        for i in self.orderby:
118
            self.req = self.req.order_by(i)
119

  
120
    def num_rows(self):
121

  
122
        """
123
        Retourne le nombre de lignes de la requête.
124
        Si celle-ci n'est pas encore générée, on le fait.
125

  
126
        @return: Nombre de ligne
127
        """
128

  
129
        if not self.generaterq :
130
            self.generate_request()
131
            self.generaterq = True
132
        return self.req.count()
133

  
134
    def add_table(self, *argv):
135
        
136
        """
137
        Ajoute une ou plusieurs tables/élément d'une table à
138
        la requête.
139

  
140
        @param argv: Liste des tables à ajouter
141
        """
142
        
143
        #On vérifi qu'il n'y a pas de doublons dans la liste des
144
        #tables finale
145
        
146
        for i in argv :
147
            for j in self.table:
148
                if str(i) == str(j):
149
                    break
150
            self.table.append(i)
151

  
152
    def add_join(self, *argv):
153
        
154
        """
155
        Ajoute une ou plusieurs jointures à
156
        la requête.
157

  
158
        @param argv: Liste des jointures à ajouter
159
        """
160
        
161
        #On vérifi qu'il n'y a pas de doublons dans la liste des
162
        #jointures finale
163
        
164
        for i in argv:
165
            for j in self.join:
166
                if str(i) == str(j):
167
                    break
168
            self.join.append(i)
169

  
170
    def add_outer_join(self, *argv):
171
        
172
        """
173
        Ajoute une ou plusieurs jointures externes à
174
        la requête.
175

  
176
        @param argv: Liste des jointures externes à ajouter
177
        """
178
        
179
        #On vérifi qu'il n'y a pas de doublons dans la liste des
180
        #jointures externes finale
181
        
182
        for i in argv:
183
            for j in self.outerjoin:
184
                if str(i) == str(j):
185
                    break
186
            self.outerjoin.append(i)    
187

  
188
    def add_filter(self, *argv):
189

  
190
        """
191
        Ajoute un ou plusieurs filtres à la requête.
192

  
193
        @param argv: Liste des filtres à ajouter
194
        """
195
        
196
        #On vérifi qu'il n'y a pas de doublons dans la liste des
197
        #filtres finale
198
        
199
        for i in argv:
200
            for j in self.filter:
201
                if str(i) == str(j):
202
                    break
203
            self.filter.append(i)
204

  
205
    def add_group_by(self, *argv):
206

  
207
        """
208
        Ajoute un ou plusieurs groupements à la requête.
209

  
210
        @param argv: Liste des groupements à ajouter
211
        """
212
        
213
        #On vérifi qu'il n'y a pas de doublons dans la liste des
214
        #groupements finale
215
        
216
        for i in argv:
217
            for j in self.groupby:
218
                if str(i) == str(j):
219
                    break
220
            self.groupby.append(i)
221

  
222
    def add_order_by(self, *argv):
223

  
224
        """
225
        Ajoute un ou plusieurs orders à la requête.
226

  
227
        @param argv: Liste des ordres à ajouter
228
        """
229
        
230
        #On vérifi qu'il n'y a pas de doublons dans la liste des
231
        #ordres finale
232
        
233
        for i in argv:
234
            for j in self.orderby:
235
                if str(i) == str(j):
236
                    break
237
            self.orderby.append(i)
238

  
239
    def format_events_img_statu (self, event):
240
        
241
        """
242
        Suivant l'état de l'évènement, retourne la classe à appliquer
243
        à l'image indiquant si l'évènement est pris en compte ou non.
244

  
245
        @param event: l'évènement à analyser
246

  
247
        @return: Dictionnaire représentant la classe à appliquer
248
        """
249

  
250
        if event.active and event.status == 'AAClosed':
251
            return { 'src': url('/images/crossed.png') }
252
        elif event.status == 'Acknowledged' :
253
            return { 'src': url('/images/checked.png') }
254
        else:
255
            return None
256

  
257
    def format_events(self, first_row, last_row):
258
        
259
        """
260
        Formate la réponse de la requête et y applique les plugins
261
        pour un affichage simple du résultat par Genshi.
262
        On génère une liste de liste, chaqu'une étant la description de
263
        l'affichage pour un évènement donné.
264

  
265
        @param first_row: Indice de début de la liste des évènements
266
        @param last_row: Indice de fin de la liste des évènements
267
        """
268
        
269
        # Si la requête n'est pas générée, on le fait
270
        if not self.generaterq :
271
            self.generate_request()
272
            self.generaterq = True
273

  
274
        # Liste des éléments pour la tête du tableau
275

  
276
        lst_title = ['', _('Date<br />[Duration]'), '#', _('Host'),
277
                _('Service Type<br />Service Name'), _('Output')]
278
        lst_title.extend([plug.name for plug in self.plugin])
279
        lst_title.extend(['[T T]', ''])
280
        
281
        events = [lst_title]
282
        i = 0
283
        class_tr = ['odd', 'even']
284
        ids = []
285
        for req in self.req[first_row : last_row]:
286

  
287
            # Si il y a plus d'un élément dans la liste des tables,
288
            # rq devient une liste plutôt que d'être directement la
289
            # table souhaité
290
            
291
            if isinstance(req, Events) :
292
                event = req
293
            else :
294
                event = req[0]
295
            ids.append(event.idevent)
296

  
297
            # La liste pour l'évènement actuel comporte dans l'ordre :
298
            #   L'évènment en lui même
299
            #   La classe à appliquer sur la ligne (permet d'alterner les
300
            #       couleurs suivant les lignes)
301
            #   La classe pour la case comportant la flèche de détails
302
            #   La classe pour la date, l'occurrence et l'édition
303
            #   L'image a affiche pour la flèche de détails
304
            #   Une liste (une case par plugin) de ce que le plugin souhaite
305
            #       afficher en fonction de l'évènement
306

  
307
            if event.active :
308
                events.append([
309
                    event,
310
                    {'class': class_tr[i%2]},
311
                    {'class' : self.bouton_severity[event.severity] + \
312
                            self.class_ack[event.status]},
313
                    {'class' : self.bouton_severity[event.severity] + \
314
                            self.class_ack[event.status] },
315
                    {'src' : '/images/%s2.png' % \
316
                            self.bouton_severity[event.severity].upper()},
317
                    self.format_events_img_statu(event),
318
                    [[j.__show__(req), j.style] for j in self.plugin]
319
                    ])
320
            else :
321
                events.append([
322
                    event,
323
                    {'class': class_tr[i%2]},
324
                    {'class' : self.bouton_severity[event.severity] + \
325
                            self.class_ack[event.status] },
326
                    {'class' : 'Cleared' + self.class_ack[event.status] },
327
                    {'src' : '/images/%s2.png' % \
328
                            self.bouton_severity[event.severity].upper()},
329
                    self.format_events_img_statu(event),
330
                    [[j.__show__(req), j.style] for j in self.plugin]
331
                    ])
332
            i = i + 1
333

  
334
        # On sauvegarde la liste précédemment créée puis rempli
335
        # le TmplContext
336

  
337
        self.events = events
338
        self.idevents = ids
339

  
340
    def format_history (self):
341
        
342
        """
343
        Formate les historiques correspondant aux évènements sélectionnés
344
        pour un affichage simple du résultat par Genshi.
345
        On génère une liste de liste, chaqu'une étant la description de l'affichage pour un
346
        historique donné.
347
        """
348

  
349
        history = DBSession.query(EventHistory
350
                ).filter(EventHistory.idevent.in_(self.idevents)
351
                ).order_by(desc(EventHistory.timestamp)
352
                ).order_by(desc(EventHistory.idhistory))
353

  
354
        if history.count() == 0:
355
            self.hist = []
356
            return
357
        hists = []
358
        i = 0
359
        class_tr = ['odd', 'even']
360
        hostname = self.events[1][0].hostname
361
        servicename = self.events[1][0].servicename
362

  
363
        for hist in history :
364

  
365
            # La liste pour l'historique actuel comporte dans l'ordre :
366
            #   Son identifiant
367
            #   Son nom d'hôte
368
            #   Son nom de service
369
            #   Le moment où il a été généré
370
            #   Qui l'a généré
371
            #   Le type d'action qui a été appliqué
372
            #   La sévérité de l'action si besoin est
373
            #   Le détail de l'action
374
            #   La classe à appliquer à la ligne (permet d'alterner
375
            #       les couleurs)
376
            #   La classe de la sévérité s'il y a
377

  
378
            if hist.value :
379
                hists.append([
380
                    hist.idhistory,
381
                    hostname,
382
                    servicename,
383
                    hist.timestamp,
384
                    hist.username,
385
                    hist.type_action,
386
                    self.severity[min(int(hist.value),7)],
387
                    hist.text,
388
                    {'class' : class_tr[i%2]},
389
                    {'class':self.class_severity[min(int(hist.value),7)]}
390
                ])
391
            else:
392
                hists.append([
393
                    hist.idhistory,
394
                    hostname,
395
                    servicename,
396
                    hist.timestamp,
397
                    hist.username,
398
                    hist.type_action,
399
                    self.severity[0],
400
                    hist.text,
401
                    {'class' : class_tr[i%2]},
402
                    {'class':self.class_severity[0]}
403
                ])    
404
            i = i + 1
405
        
406
        self.hist = hists
407

  
408
    def generate_tmpl_context(self):
409
        
410
        """
411
        Génère et peuple la variable tmpl_context avec les Dialogs et
412
        formulaires nécessaire au fonctionnement de Vigiboard
413
        """
414

  
415
        # Dialogue d'édition
416
        tmpl_context.edit_event_form = EditEventForm('edit_event_form',
417
                action=url('/update'))
418
        tmpl_context.edit_eventdialog = JQueryUIDialog(id='Edit_EventsDialog',
419
                autoOpen=False,title=_('Edit Event'))
420
    
421
        # Dialogue de recherche
422
        tmpl_context.search_form = SearchForm('search_form',
423
                action=url('/'))
424
        tmpl_context.searchdialog = JQueryUIDialog(id='SearchDialog',
425
                autoOpen=False,title=_('Search Event'))
426
        
427
        # Dialogue de détail d'un évènement
428
        tmpl_context.historydialog = JQueryUIDialog(id='HistoryDialog',
429
                autoOpen=False,title=_('History'))
vigiboard/i18n/en
1
en_US
vigiboard/i18n/en_US/LC_MESSAGES/vigiboard.po
1
# English (United States) translations for vigiboard.
2
# Copyright (C) 2009 ORGANIZATION
3
# This file is distributed under the same license as the vigiboard project.
4
# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
5
#
6
msgid ""
7
msgstr ""
8
"Project-Id-Version: vigiboard 0.1\n"
9
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10
"POT-Creation-Date: 2009-07-06 11:19+0200\n"
11
"PO-Revision-Date: 2009-07-22 16:36+0200\n"
12
"Last-Translator: Thomas ANDREJAK <thomas.andrejak@c-s.fr>\n"
13
"Language-Team: en_US <LL@li.org>\n"
14
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
15
"MIME-Version: 1.0\n"
16
"Content-Type: text/plain; charset=utf-8\n"
17
"Content-Transfer-Encoding: 8bit\n"
18
"Generated-By: Babel 0.9.4\n"
19

  
20
#: vigiboard/controllers/root.py:123 vigiboard/controllers/root.py:174
21
#: vigiboard/controllers/root.py:210 vigiboard/controllers/root.py:252
22
msgid "You need to be authenticated"
23
msgstr ""
24

  
25
#: vigiboard/controllers/root.py:151
26
#: vigiboard/controllers/vigiboardrequest.py:37
27
msgid "None"
28
msgstr ""
29

  
30
#: vigiboard/controllers/root.py:151
31
#: vigiboard/controllers/vigiboardrequest.py:37
32
msgid "OK"
33
msgstr ""
34

  
35
#: vigiboard/controllers/root.py:151
36
#: vigiboard/controllers/vigiboardrequest.py:37
37
msgid "Suppressed"
38
msgstr ""
39

  
40
#: vigiboard/controllers/root.py:152
41
#: vigiboard/controllers/vigiboardrequest.py:38
42
msgid "Initial"
43
msgstr ""
44

  
45
#: vigiboard/controllers/root.py:152
46
#: vigiboard/controllers/vigiboardrequest.py:38
47
msgid "Maintenance"
48
msgstr ""
49

  
50
#: vigiboard/controllers/root.py:152
51
#: vigiboard/controllers/vigiboardrequest.py:38
52
msgid "Minor"
53
msgstr ""
54

  
55
#: vigiboard/controllers/root.py:153
56
#: vigiboard/controllers/vigiboardrequest.py:39
57
msgid "Major"
58
msgstr ""
59

  
60
#: vigiboard/controllers/root.py:153
61
#: vigiboard/controllers/vigiboardrequest.py:39
62
msgid "Critical"
63
msgstr ""
64

  
65
#: vigiboard/controllers/root.py:188
66
msgid "Error in DB"
67
msgstr ""
68

  
69
#: vigiboard/controllers/root.py:277
70
msgid "No access to this event"
71
msgstr ""
72

  
73
#: vigiboard/controllers/root.py:305
74
msgid "Updated successfully"
75
msgstr ""
76

  
77
#: vigiboard/controllers/vigiboardrequest.py:276
78
msgid "Date<br />[Duration]"
79
msgstr ""
80

  
81
#: vigiboard/controllers/vigiboardrequest.py:276
82
#: vigiboard/templates/vigiboard_history_table.html:16
83
#: vigiboard/widgets/edit_event.py:41
84
msgid "Host"
85
msgstr ""
86

  
87
#: vigiboard/controllers/vigiboardrequest.py:277
88
msgid "Service Type<br />Service Name"
89
msgstr ""
90

  
91
#: vigiboard/controllers/vigiboardrequest.py:277
92
#: vigiboard/widgets/edit_event.py:43
93
msgid "Output"
94
msgstr ""
95

  
96
#: vigiboard/controllers/vigiboardrequest.py:419
97
msgid "Edit Event"
98
msgstr ""
99

  
100
#: vigiboard/controllers/vigiboardrequest.py:425
101
msgid "Search Event"
102
msgstr ""
103

  
104
#: vigiboard/controllers/vigiboardrequest.py:429
105
msgid "History"
106
msgstr ""
107

  
108
#: vigiboard/controllers/vigiboard_plugin/__init__.py:36
109
msgid "Error"
110
msgstr ""
111

  
112
#: vigiboard/controllers/vigiboard_plugin/shn.py:24
113
msgid "SHNs impacté"
114
msgstr "SHNs broken"
115

  
116
#: vigiboard/templates/vigiboard.html:12
117
msgid "Vigiboard"
118
msgstr ""
119

  
120
#: vigiboard/templates/vigiboard_event_table.html:22
121
msgid "Showing rows"
122
msgstr ""
123

  
124
#: vigiboard/templates/vigiboard_event_table.html:22
125
msgid "to"
126
msgstr ""
127

  
128
#: vigiboard/templates/vigiboard_event_table.html:22
129
msgid "of"
130
msgstr ""
131

  
132
#: vigiboard/templates/vigiboard_event_table.html:22
133
msgid "Pages"
134
msgstr ""
135

  
136
#: vigiboard/templates/vigiboard_event_table.html:123
137
msgid "Initial State:"
138
msgstr ""
139

  
140
#: vigiboard/templates/vigiboard_event_table.html:124
141
msgid "Current State:"
142
msgstr ""
143

  
144
#: vigiboard/templates/vigiboard_event_table.html:127
145
msgid "Detailed history for this event"
146
msgstr ""
147

  
148
#: vigiboard/templates/vigiboard_event_table.html:128
149
msgid "Detailed history for this host/service"
150
msgstr ""
151

  
152
#: vigiboard/templates/vigiboard_event_table.html:129
153
msgid "Nagios host details"
154
msgstr ""
155

  
156
#: vigiboard/templates/vigiboard_event_table.html:130
157
msgid "Metrology details"
158
msgstr ""
159

  
160
#: vigiboard/templates/vigiboard_event_table.html:131
161
msgid "Security details"
162
msgstr ""
163

  
164
#: vigiboard/templates/vigiboard_event_table.html:132
165
msgid "Service Type"
166
msgstr ""
167

  
168
#: vigiboard/templates/vigiboard_event_table.html:146
169
msgid "Aucun évènement disponible."
170
msgstr "No events"
171

  
172
#: vigiboard/templates/vigiboard_history_table.html:8
173
msgid "There is no history."
174
msgstr ""
175

  
176
#: vigiboard/templates/vigiboard_history_table.html:15
177
msgid "ID"
178
msgstr ""
179

  
180
#: vigiboard/templates/vigiboard_history_table.html:17
181
#: vigiboard/widgets/edit_event.py:42
182
msgid "Service"
183
msgstr ""
184

  
185
#: vigiboard/templates/vigiboard_history_table.html:18
186
msgid "Time"
187
msgstr ""
188

  
189
#: vigiboard/templates/vigiboard_history_table.html:19
190
msgid "User"
191
msgstr ""
192

  
193
#: vigiboard/templates/vigiboard_history_table.html:20
194
msgid "Type"
195
msgstr ""
196

  
197
#: vigiboard/templates/vigiboard_history_table.html:21
198
msgid "Value"
199
msgstr ""
200

  
201
#: vigiboard/templates/vigiboard_history_table.html:22
202
msgid "Text"
203
msgstr ""
204

  
205
#: vigiboard/widgets/edit_event.py:9
206
msgid "No change"
207
msgstr ""
208

  
209
#: vigiboard/widgets/edit_event.py:10
210
msgid "Change to None"
211
msgstr ""
212

  
213
#: vigiboard/widgets/edit_event.py:11
214
msgid "Change to Acknowledged"
215
msgstr ""
216

  
217
#: vigiboard/widgets/edit_event.py:12
218
msgid "Change to Closed"
219
msgstr ""
220

  
221
#: vigiboard/widgets/edit_event.py:26
222
msgid "Touble Ticket"
223
msgstr ""
224

  
225
#: vigiboard/widgets/edit_event.py:30
226
msgid "Apply"
227
msgstr ""
228

  
229
#: vigiboard/widgets/edit_event.py:44
230
msgid "Trouble Ticket"
231
msgstr ""
232

  
233
#: vigiboard/widgets/edit_event.py:47
234
msgid "Search"
235
msgstr ""
236

  
vigiboard/i18n/fr
1
fr_FR
vigiboard/i18n/fr_FR/LC_MESSAGES/vigiboard.po
1
# French (France) translations for vigiboard.
2
# Copyright (C) 2009 ORGANIZATION
3
# This file is distributed under the same license as the vigiboard project.
4
# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
5
#
6
msgid ""
7
msgstr ""
8
"Project-Id-Version: vigiboard 0.1\n"
9
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10
"POT-Creation-Date: 2009-07-06 11:19+0200\n"
11
"PO-Revision-Date: 2009-07-22 16:36+0200\n"
12
"Last-Translator: Thomas ANDREJAK <thomas.andrejak@c-s.fr>\n"
13
"Language-Team: fr_FR <LL@li.org>\n"
14
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
15
"MIME-Version: 1.0\n"
16
"Content-Type: text/plain; charset=utf-8\n"
17
"Content-Transfer-Encoding: 8bit\n"
18
"Generated-By: Babel 0.9.4\n"
19

  
20
#: vigiboard/controllers/root.py:123 vigiboard/controllers/root.py:174
21
#: vigiboard/controllers/root.py:210 vigiboard/controllers/root.py:252
22
msgid "You need to be authenticated"
23
msgstr "Vous devez être authentifié"
24

  
25
#: vigiboard/controllers/root.py:151
26
#: vigiboard/controllers/vigiboardrequest.py:37
27
msgid "None"
28
msgstr "Aucun"
29

  
30
#: vigiboard/controllers/root.py:151
31
#: vigiboard/controllers/vigiboardrequest.py:37
32
msgid "OK"
33
msgstr ""
34

  
35
#: vigiboard/controllers/root.py:151
36
#: vigiboard/controllers/vigiboardrequest.py:37
37
msgid "Suppressed"
38
msgstr "Supprimé"
39

  
40
#: vigiboard/controllers/root.py:152
41
#: vigiboard/controllers/vigiboardrequest.py:38
42
msgid "Initial"
43
msgstr ""
44

  
45
#: vigiboard/controllers/root.py:152
46
#: vigiboard/controllers/vigiboardrequest.py:38
47
msgid "Maintenance"
48
msgstr ""
49

  
50
#: vigiboard/controllers/root.py:152
51
#: vigiboard/controllers/vigiboardrequest.py:38
52
msgid "Minor"
53
msgstr "Mineur"
54

  
55
#: vigiboard/controllers/root.py:153
56
#: vigiboard/controllers/vigiboardrequest.py:39
57
msgid "Major"
58
msgstr "Majeur"
59

  
60
#: vigiboard/controllers/root.py:153
61
#: vigiboard/controllers/vigiboardrequest.py:39
62
msgid "Critical"
63
msgstr "Critique"
64

  
65
#: vigiboard/controllers/root.py:188
66
msgid "Error in DB"
67
msgstr "Erreur dans la base de données"
68

  
69
#: vigiboard/controllers/root.py:277
70
msgid "No access to this event"
71
msgstr "Accès à cet évènement refusé"
72

  
73
#: vigiboard/controllers/root.py:305
74
msgid "Updated successfully"
75
msgstr "Mise à jour réussie"
76

  
77
#: vigiboard/controllers/vigiboardrequest.py:276
78
msgid "Date<br />[Duration]"
79
msgstr "Date<br />[Durée]"
80

  
81
#: vigiboard/controllers/vigiboardrequest.py:276
82
#: vigiboard/templates/vigiboard_history_table.html:16
83
#: vigiboard/widgets/edit_event.py:41
84
msgid "Host"
85
msgstr "Hôte"
86

  
87
#: vigiboard/controllers/vigiboardrequest.py:277
88
msgid "Service Type<br />Service Name"
89
msgstr "Type de service<br />Nom du service"
90

  
91
#: vigiboard/controllers/vigiboardrequest.py:277
92
#: vigiboard/widgets/edit_event.py:43
93
msgid "Output"
94
msgstr "Sortie d'erreur"
95

  
96
#: vigiboard/controllers/vigiboardrequest.py:419
97
msgid "Edit Event"
98
msgstr "Edition d'évènements"
99

  
100
#: vigiboard/controllers/vigiboardrequest.py:425
101
msgid "Search Event"
102
msgstr "Recherche d'évènements"
103

  
104
#: vigiboard/controllers/vigiboardrequest.py:429
105
msgid "History"
106
msgstr "Historique"
107

  
108
#: vigiboard/controllers/vigiboard_plugin/__init__.py:36
109
msgid "Error"
110
msgstr "Erreur"
111

  
112
#: vigiboard/controllers/vigiboard_plugin/shn.py:24
113
msgid "SHNs impacté"
114
msgstr ""
115

  
116
#: vigiboard/templates/vigiboard.html:12
117
msgid "Vigiboard"
118
msgstr ""
119

  
120
#: vigiboard/templates/vigiboard_event_table.html:22
121
msgid "Showing rows"
122
msgstr "Lignes"
123

  
124
#: vigiboard/templates/vigiboard_event_table.html:22
125
msgid "to"
126
msgstr "à"
127

  
128
#: vigiboard/templates/vigiboard_event_table.html:22
129
msgid "of"
130
msgstr "sur"
131

  
132
#: vigiboard/templates/vigiboard_event_table.html:22
133
msgid "Pages"
134
msgstr "Pages"
135

  
136
#: vigiboard/templates/vigiboard_event_table.html:123
137
msgid "Initial State:"
138
msgstr "Statu initial:"
139

  
140
#: vigiboard/templates/vigiboard_event_table.html:124
141
msgid "Current State:"
142
msgstr "Statu actuel:"
143

  
144
#: vigiboard/templates/vigiboard_event_table.html:127
145
msgid "Detailed history for this event"
146
msgstr "Historique détaillé pour cet évènement"
147

  
148
#: vigiboard/templates/vigiboard_event_table.html:128
149
msgid "Detailed history for this host/service"
150
msgstr "Historique détaillé pour ce hôte / service"
151

  
152
#: vigiboard/templates/vigiboard_event_table.html:129
153
msgid "Nagios host details"
154
msgstr "Détails de l'hôte par Nagios"
155

  
156
#: vigiboard/templates/vigiboard_event_table.html:130
157
msgid "Metrology details"
158
msgstr "Détails de métrologie"
159

  
160
#: vigiboard/templates/vigiboard_event_table.html:131
161
msgid "Security details"
162
msgstr "Détails de sécurité"
163

  
164
#: vigiboard/templates/vigiboard_event_table.html:132
165
msgid "Service Type"
166
msgstr "Type de service"
167

  
168
#: vigiboard/templates/vigiboard_event_table.html:146
169
msgid "Aucun évènement disponible."
170
msgstr ""
171

  
172
#: vigiboard/templates/vigiboard_history_table.html:8
173
msgid "There is no history."
174
msgstr "Il n'y a pas d'historique"
175

  
176
#: vigiboard/templates/vigiboard_history_table.html:15
177
msgid "ID"
178
msgstr ""
179

  
180
#: vigiboard/templates/vigiboard_history_table.html:17
181
#: vigiboard/widgets/edit_event.py:42
182
msgid "Service"
183
msgstr ""
184

  
185
#: vigiboard/templates/vigiboard_history_table.html:18
186
msgid "Time"
187
msgstr "Temps"
188

  
189
#: vigiboard/templates/vigiboard_history_table.html:19
190
msgid "User"
191
msgstr "Utilisateur"
192

  
193
#: vigiboard/templates/vigiboard_history_table.html:20
194
msgid "Type"
195
msgstr ""
196

  
197
#: vigiboard/templates/vigiboard_history_table.html:21
198
msgid "Value"
199
msgstr "Valeur"
200

  
201
#: vigiboard/templates/vigiboard_history_table.html:22
202
msgid "Text"
203
msgstr ""
204

  
205
#: vigiboard/widgets/edit_event.py:9
206
msgid "No change"
207
msgstr "Sans changement"
208

  
209
#: vigiboard/widgets/edit_event.py:10
210
msgid "Change to None"
211
msgstr "Changer en Non pris en compte"
212

  
213
#: vigiboard/widgets/edit_event.py:11
214
msgid "Change to Acknowledged"
215
msgstr "Changer en Pris en compte"
216

  
217
#: vigiboard/widgets/edit_event.py:12
218
msgid "Change to Closed"
219
msgstr "Changer en Fermé"
220

  
221
#: vigiboard/widgets/edit_event.py:26
222
msgid "Touble Ticket"
223
msgstr "Ticket d'incidence"
224

  
225
#: vigiboard/widgets/edit_event.py:30
226
msgid "Apply"
227
msgstr "Appliquer"
228

  
229
#: vigiboard/widgets/edit_event.py:44
230
msgid "Trouble Ticket"
231
msgstr "Ticket d'incidence"
232

  
233
#: vigiboard/widgets/edit_event.py:47
234
msgid "Search"
235
msgstr "Rechercher"
236

  
vigiboard/i18n/vigiboard.pot
1
# Translations template for vigiboard.
2
# Copyright (C) 2009 ORGANIZATION
3
# This file is distributed under the same license as the vigiboard project.
4
# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
5
#
6
#, fuzzy
7
msgid ""
8
msgstr ""
9
"Project-Id-Version: vigiboard 0.1\n"
10
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
11
"POT-Creation-Date: 2009-07-22 16:36+0200\n"
12
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
"Language-Team: LANGUAGE <LL@li.org>\n"
15
"MIME-Version: 1.0\n"
16
"Content-Type: text/plain; charset=utf-8\n"
17
"Content-Transfer-Encoding: 8bit\n"
18
"Generated-By: Babel 0.9.4\n"
19

  
20
#: vigiboard/controllers/root.py:123 vigiboard/controllers/root.py:174
21
#: vigiboard/controllers/root.py:210 vigiboard/controllers/root.py:252
22
msgid "You need to be authenticated"
23
msgstr ""
24

  
25
#: vigiboard/controllers/root.py:151 vigiboard/controllers/vigiboardrequest.py:37
26
msgid "None"
27
msgstr ""
28

  
29
#: vigiboard/controllers/root.py:151 vigiboard/controllers/vigiboardrequest.py:37
30
msgid "OK"
31
msgstr ""
32

  
33
#: vigiboard/controllers/root.py:151 vigiboard/controllers/vigiboardrequest.py:37
34
msgid "Suppressed"
35
msgstr ""
36

  
37
#: vigiboard/controllers/root.py:152 vigiboard/controllers/vigiboardrequest.py:38
38
msgid "Initial"
39
msgstr ""
40

  
41
#: vigiboard/controllers/root.py:152 vigiboard/controllers/vigiboardrequest.py:38
42
msgid "Maintenance"
43
msgstr ""
44

  
45
#: vigiboard/controllers/root.py:152 vigiboard/controllers/vigiboardrequest.py:38
46
msgid "Minor"
47
msgstr ""
48

  
49
#: vigiboard/controllers/root.py:153 vigiboard/controllers/vigiboardrequest.py:39
50
msgid "Major"
51
msgstr ""
52

  
53
#: vigiboard/controllers/root.py:153 vigiboard/controllers/vigiboardrequest.py:39
54
msgid "Critical"
55
msgstr ""
56

  
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff