De la conversion une liste d’événement issue de dotproject

Dans le cadre des activités admin sys de l’April, je suis parfois amené à changer les logiciels, et donc à convertir les données d’un logiciel vers un autre. Ici, il s’agissait de passer de dotproject à OwnCloud. Dotproject ne fournit pas d’interface pour exporter les événements, je suis donc allé les chercher dans la base de données pour les sortir en csv.

select event_title, event_start_date, event_end_date, event_description from events  into outfile event.csv  fields terminated by ','   enclosed by '"'  escaped by '\\'   lines terminated by '\n' ;

À ce stade là, l’entrée ne correspond pas encore tout à fait pour deux raisons : certains ” sont mal échappés et ne permettent pas une lecture correcte des champs CSV. Nous pouvons donc remédier à ça avec sed -i.bak 's/\\"/«/g' events.csv qu’on oublira pas de convertir en utf-8 avec iconv -f latin1 -t utf-8.

Pour finir, voici une moulinette python qui permet de transformer ce CSV en iCal :

import csv
from icalendar import Calendar, Event, LocalTimezone
from datetime import datetime, timedelta
from random import randint
import sys
#from __future__ import print_function
reader_builder = list(csv.DictReader(open('events.csv', 'Ub'), skipinitialspace = True))
headers = reader_builder[0].keys()
# Start calendar file
cal = Calendar()
cal.add('prodid', 'dotproject.april.org')
cal.add('version', '2.0')
reader = reader_builder
rownum = 0
try:
    for row in reader:
        event = Event()
        event.add('summary', row['event_title'])
        event.add('dtstart', datetime.strptime(row['event_start_date'],'%Y-%m-%d %H:%M:%S'))
#.strftime('%Y%m%dT%H%M%SZ'))
        event.add('dtend', datetime.strptime(row['event_end_date'],'%Y-%m-%d %H:%M:%S'))
        event.add('description',row['event_description'])
        event['uid'] = str(randint(1,10**30)) + datetime.now().strftime('%Y%m%dT%H%M%S') + '___dotproject.april.org'
        cal.add_component(event)
        rownum += 1
    except Exception, e:
        if rownum > 0:
            print('I had a problem with an event. I think I might have gotten through about {0} events and had trouble with an event with subject: {1} . Sorry!'.format(rownum, row['event_title']))
        else:
            print("N'arrivera pas")
#sys.exit(2)
f = open('./dotp_events.ics','wb')
f.write(cal.to_ical())
f.close()

Attention, pas mla de choses sont traitées de façon rudimentaires. En particulier, il faut finir avec un sed -i.bak s/;VALUE=DATE-TIME// dotp_events.ics.

Et voilà !

Tagcloud
Ubuntu automontage kernel authentification orgcamp NetworkManager Internet identification PSL Science-Fiction JDLL postfix Opinions Gentoo Éducation Iptables OSM rubber sympa GNU-Linux Educ Libre PlanetUbuntuFr PlanetUbuntu nfs UbuntuFr Mathématiques auto hébergement Python compilation dovecot Mozilla Mandriva Emacs Perso eCryptfs April Drupal beamer automatisation shell DNS Voile Mutt orgmode Société LDAP Réflexions SNCF configuration Épinay redmine sqlite php CAPES Spam OpenVPN CPL dotclear ISN vélo mail installation OpenSSL GCC X.org sudo ArchLinux fail vserver IPv6 Debian Coups de gueule LaTeX Admin Sys Free Parinux RaspberryPi Vie numérique Essai sieve gpg vim fun Randonnée SPF OpenStack Informatique Coup de gueule Lectures Paris Web imap RATP Technique CLI code KDE roundcube Munin