def test_exportCSV(self): '''Export des données au format CSV.''' server = 'testserver' graphtemplate = 'UpTime' indicator = 'All' # On se place à un emplacement du fichier # où l'on sait qu'il y a des données. start = 1232000000 end = 1232010000 csv_data = """ "Timestamp";"Date";"sysUpTime" "1232000001";"January 15, 2009 6:13:21 AM +0000";"9658471.000000" "1232001801";"January 15, 2009 6:43:21 AM +0000";"9660271.000000" "1232003601";"January 15, 2009 7:13:21 AM +0000";"9662071.000000" "1232005401";"January 15, 2009 7:43:21 AM +0000";"9663871.000000" "1232007201";"January 15, 2009 8:13:21 AM +0000";"9665671.000000" """[1:] output = rrd.exportCSV(server, graphtemplate, indicator, start, end, 0) # On compare l'export au résultat attendu. normalized_output = output.replace("\r\n", "\n") self.assertEqual(csv_data, normalized_output)
def export(self, host, graphtemplate, ds=None, start=None, end=None, timezone=None, nocache=None): # pylint: disable-msg=W0613 ''' export CSV # valeurs finales -> dictionnaire # - renseigné a partir dictionnaires obtenus pour chaque indicateur # - sous la forme : # * cle = indice # * valeur = [TimeStamp, donnee dictionnaire1 pour TimeStamp, ..., # donnee dictionnaireN pour TimeStamp @param host: serveur @type host: C{str} @param graphtemplate: graphe @type graphtemplate: C{str} @param ds: indicateur graphe @type ds: C{str} @param start: debut plage export @type start: C{str} @param end: fin plage export @type end: C{str} @param timezone: décalage en minutes entre l'heure UTC et l'heure dans le fuseau horaire de l'utilisateur (p.ex. 60 = UTC+01). @type timezone: C{str} @param nocache: Valeur aléatoire (généralement un horodatage UNIX) destinée à empêcher la mise en cache du fichier exporté par le navigateur. @type nocache: C{str} ''' if not start: start = time.time() - 86400 # Par défaut: 24 heures avant start = int(start) now = int(time.time()) try: timezone = int(timezone) except (ValueError, TypeError): # time.timezone utilise la notation POSIX dans laquelle # la direction du temps est inversée # (ie. UTC+01:00 = -3600 secondes). # Note: time.daylight indique juste que la timezone actuelle # supporte le changement d'heure DST, pas qu'il est actif, # il faut recourir à localtime() pour avoir cette information. if time.daylight and time.localtime().tm_isdst: timezone = -time.altzone / 60 else: timezone = -time.timezone / 60 if start >= now: raise HTTPNotFound('No data yet') if Host.by_name(host) is None: raise HTTPNotFound("No such host") if end is None: # one hour plus one second, start should be 1 sec in the past end = start + 3600 + 1 else: end = int(end) if end > now: LOGGER.debug("exporting until %d instead of %d" % (now, end)) end = now if ds: filename = rrd.getExportFileName(host, ds, start, end, timezone=timezone) else: filename = rrd.getExportFileName(host, graphtemplate, start, end, timezone=timezone) # Sans les 2 en-têtes suivants qui désactivent la mise en cache, # Internet Explorer refuse de télécharger le fichier CSV (cf. #961). response.headers['Pragma'] = 'public' # Nécessaire pour IE. response.headers['Cache-Control'] = 'max-age=0' # Nécessaire pour IE. response.headers['Content-Type'] = 'text/csv' response.headers['Content-Disposition'] = \ 'attachment;filename="%s"' % filename return rrd.exportCSV(host, graphtemplate, ds, start, end, timezone)