vigiboard / vigiboard / controllers / plugins / date.py @ c94dc931
History | View | Annotate | Download (4.7 KB)
1 | 15b98053 | Francois POIROTTE | # -*- coding: utf-8 -*-
|
---|---|---|---|
2 | 4febadf0 | Francois POIROTTE | # vim:set expandtab tabstop=4 shiftwidth=4:
|
3 | c94dc931 | Francois POIROTTE | # Copyright (C) 2007-2020 CS-SI
|
4 | 9b8d9497 | Francois POIROTTE | # License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
|
5 | a77de887 | Francois POIROTTE | |
6 | 15b98053 | Francois POIROTTE | """
|
7 | 4febadf0 | Francois POIROTTE | Un plugin pour VigiBoard qui ajoute une colonne avec la date à laquelle
|
8 | est survenu un événement et la durée depuis laquelle l'événement est actif.
|
||
9 | 15b98053 | Francois POIROTTE | """
|
10 | a2fa6a5b | Francois POIROTTE | from datetime import datetime, timedelta |
11 | 27140946 | Francois POIROTTE | import tw.forms as twf |
12 | 02c4a1e7 | Francois POIROTTE | from tg.i18n import ugettext as _, lazy_ugettext as l_ |
13 | 27140946 | Francois POIROTTE | |
14 | from vigilo.models import tables |
||
15 | 15b98053 | Francois POIROTTE | |
16 | 86662bc9 | Francois POIROTTE | from vigiboard.controllers.plugins import VigiboardRequestPlugin, ITEMS |
17 | 9332c7c0 | Yves OUATTARA | from vigiboard.lib import dateformat, error_handler |
18 | 15b98053 | Francois POIROTTE | |
19 | 24182db6 | Francois POIROTTE | |
20 | class ExampleDateFormat(object): |
||
21 | """
|
||
22 | Une classe permettant d'obtenir un exemple de date
|
||
23 | correspondant au format de la locale de l'utilisateur.
|
||
24 | """
|
||
25 | def __str__(self): |
||
26 | """
|
||
27 | Retourne l'heure courante au format attendu,
|
||
28 | encodée en UTF-8.
|
||
29 |
|
||
30 | @return: Heure courante au format attendu (en UTF-8).
|
||
31 | @rtype: C{str}
|
||
32 | """
|
||
33 | return unicode(self).encode('utf-8') |
||
34 | |||
35 | def __unicode__(self): |
||
36 | """
|
||
37 | Retourne l'heure courante au format attendu.
|
||
38 |
|
||
39 | @return: Heure courante au format attendu.
|
||
40 | @rtype: C{unicode}
|
||
41 | """
|
||
42 | format = dateformat.get_date_format() |
||
43 | 1c5486c7 | Francois POIROTTE | date = datetime.strftime(datetime.utcnow(), format).decode('utf-8')
|
44 | 24182db6 | Francois POIROTTE | return _('Eg. %(date)s') % {'date': date} |
45 | |||
46 | |||
47 | 15b98053 | Francois POIROTTE | class PluginDate(VigiboardRequestPlugin): |
48 | 4febadf0 | Francois POIROTTE | """Plugin pour l'ajout d'une colonne Date."""
|
49 | 27140946 | Francois POIROTTE | def get_search_fields(self): |
50 | return [
|
||
51 | 4e75dfb9 | Francois POIROTTE | twf.Label('date', text=l_('Last occurrence')), |
52 | 27140946 | Francois POIROTTE | twf.CalendarDateTimePicker( |
53 | 'from_date',
|
||
54 | 4e75dfb9 | Francois POIROTTE | label_text=l_('Between'),
|
55 | 27140946 | Francois POIROTTE | button_text=l_("Choose"),
|
56 | not_empty=False,
|
||
57 | 00ece25a | Francois POIROTTE | validator=dateformat.DateFormatConverter(if_missing=None),
|
58 | date_format=dateformat.get_date_format, |
||
59 | calendar_lang=dateformat.get_calendar_lang, |
||
60 | 24182db6 | Francois POIROTTE | attrs={ |
61 | # Affiche un exemple de date au survol
|
||
62 | # et en tant qu'indication (placeholder).
|
||
63 | 'title': ExampleDateFormat(),
|
||
64 | 'placeholder': ExampleDateFormat()
|
||
65 | }, |
||
66 | 27140946 | Francois POIROTTE | ), |
67 | twf.CalendarDateTimePicker( |
||
68 | 'to_date',
|
||
69 | 4e75dfb9 | Francois POIROTTE | label_text=l_('And'),
|
70 | 27140946 | Francois POIROTTE | button_text=l_("Choose"),
|
71 | not_empty=False,
|
||
72 | 00ece25a | Francois POIROTTE | validator=dateformat.DateFormatConverter(if_missing=None),
|
73 | date_format=dateformat.get_date_format, |
||
74 | calendar_lang=dateformat.get_calendar_lang, |
||
75 | 24182db6 | Francois POIROTTE | attrs={ |
76 | # Affiche un exemple de date au survol
|
||
77 | # et en tant qu'indication (placeholder).
|
||
78 | 'title': ExampleDateFormat(),
|
||
79 | 'placeholder': ExampleDateFormat()
|
||
80 | }, |
||
81 | 27140946 | Francois POIROTTE | ), |
82 | ] |
||
83 | |||
84 | 86662bc9 | Francois POIROTTE | def handle_search_fields(self, query, search, state, subqueries): |
85 | if state != ITEMS:
|
||
86 | return
|
||
87 | |||
88 | 27140946 | Francois POIROTTE | if search.get('from_date'): |
89 | query.add_filter(tables.CorrEvent.timestamp_active >= |
||
90 | search['from_date'])
|
||
91 | 9332c7c0 | Yves OUATTARA | |
92 | # Ajout de contrôles sur la date de début
|
||
93 | 1c5486c7 | Francois POIROTTE | if search['from_date'] >= datetime.utcnow(): |
94 | 9332c7c0 | Yves OUATTARA | error_handler.handle_error_message( |
95 | _('Start date cannot be greater than current date'))
|
||
96 | |||
97 | if search.get('to_date') and \ |
||
98 | search['from_date'] > search['to_date']: |
||
99 | error_handler.handle_error_message( |
||
100 | _('Start date cannot be greater than end date'))
|
||
101 | |||
102 | 27140946 | Francois POIROTTE | if search.get('to_date'): |
103 | query.add_filter(tables.CorrEvent.timestamp_active <= |
||
104 | search['to_date'])
|
||
105 | a2fa6a5b | Francois POIROTTE | |
106 | 9332c7c0 | Yves OUATTARA | # Ajout de contrôles sur la date de fin
|
107 | 1c5486c7 | Francois POIROTTE | if search['to_date'] >= datetime.utcnow(): |
108 | 9332c7c0 | Yves OUATTARA | error_handler.handle_error_message( |
109 | _('End date cannot be greater than current date'))
|
||
110 | |||
111 | a2fa6a5b | Francois POIROTTE | def get_data(self, event): |
112 | state = tables.StateName.value_to_statename( |
||
113 | event[0].cause.current_state)
|
||
114 | # La résolution maximale de Nagios est la seconde.
|
||
115 | # On supprime les microsecondes qui ne nous apportent
|
||
116 | # aucune information et fausse l'affichage dans l'export CSV
|
||
117 | # en créant un nouvel objet timedelta dérivé du premier.
|
||
118 | 1c5486c7 | Francois POIROTTE | duration = datetime.utcnow() - event[0].timestamp_active
|
119 | a2fa6a5b | Francois POIROTTE | duration = timedelta(days=duration.days, seconds=duration.seconds) |
120 | return {
|
||
121 | 'state': state,
|
||
122 | 'date': event[0].cause.timestamp, |
||
123 | 'duration': duration,
|
||
124 | } |
||
125 | 5a845c93 | Vincent QUEMENER | |
126 | def get_sort_criterion(self, query, column): |
||
127 | if column == 'date': |
||
128 | return tables.Event.timestamp
|
||
129 | return None |