19. Calendrier en ligne de commande

Ce que je voulais c’est la possibilité de mettre/retirer ou voir des événements sur mes calendriers. La recherche d’applications ne fut pas très longue, car une solution s’est imposée d’elle-même : calendar-cli. En effet, est mentionné sur la page de calendar-cli une alternative (gcalendar-cli) dont le g ne me satisfaisait pas (g ne signifiant pas Gnome, mais Goo…). De plus, la philosophie du projet calendar-cli :

The philosophy behind calendar-cli is slightly different, calendar-cli is supposed to be a simple cli-based caldav+ical client. No synchronization, no local storage.

étant simplement parfaite et le fait que celui-ci soit programmé en python m’a définitivement convaincu.

J’ai donc décidé de l’installer.

Le premier problème rencontré a été du à l’utilisation de python3. En effet, selon :

https://static.cinay.xyz/2016/05/calendar-cli-ligne-de-commande.html

il est nécessaire d’installer icalendar, caldav et tzlocal. Or, il existe phython3-icalendar, python3-caldav et python3-tzlocal dans les dépôts. J’ai donc installé tout cela et au premier lancement de calendar-cli me suis vu retourner une erreur liée à l’absence d’une méthode de tzlocal. En inspectant le fichier source, la première chose qui m’a frappé était l’appel à python2 en première ligne. J’ai donc installé python-icalendar, python-caldav et python-tzlocal et cette erreur à disparu.

On verra plus tard que la migration à python3 est en cours.

L’installation ne se fait pas via les dépôts puisqu’il n’y existe pas. Mais sur le second site mentionné ci-dessus, les instructions sont claires :

cd ~/scripts git clone https://github.com/tobixen/calendar-cli

Création d’un lien nommé calendarcmd

sudo ln -s /home/yannick/scripts/calendar-cli/calendar-cli.py /usr/local/bin/calendarcmd

Le fichier de configuration ~/.config/calendar.conf au format json

nano ~/.config/calendar.conf
{ "default": 
  { "caldav_url": "http://foo.bar.example.com/caldav/", 
    "caldav_user": "luser",
    "caldav_pass": "insecure"
  }
}

Les droits sur le fichier de configuration

chmod 0600 ~/.config/calendar.conf

Claires, parfaitement fonctionnelles, mais on en trouve une critique sur le site du projet (premier lien ci-dessus), puisqu’il est conseillé d’utiliser calendar_url pour spécifier l’adresse du calendrier spécifique d’un utilisateur et n’utiliser caldav_url que pour l’adresse du site fournissant les calendriers. Pour Framasoft, par exemple, cela donne :

{ "default":
{ "caldav_url": "https://framagenda.org/remote.php/dav/calendars/",
"calendar_url": "machin@truc.chose/personnel/",
"caldav_user": "nom_utilisateur",
"caldav_pass": "mdp"
},
"professionnel":
{ "caldav_url": "https://framagenda.org/remote.php/dav/calendars/",
"calendar_url": "machin@truc.chose/professionnel/",
"caldav_user": "nom_utilisateur",
"caldav_pass": "mdp"
}
}

Vient ensuite la phase de tests. La commande à lancer est, on l’aura compris : calendarcmd. Mais, quelle est la structure des ses arguments ? Deux exemples sont donnés. Le premier pour ajouter un événement :

calendarcmd calendar add '2016-05-18 11:45:00+2h' 'Test calendrier en ligne de commande'

Tout s’est bien passé. L’événement ajouté, s’est retrouvé comme par miracle sur mon calendrier.

Le second pour voir les événements depuis une date donnée :

calendarcmd calendar agenda --from-time=2016-05-17 --agenda-days=14

Une erreur s’est alors produite :

Traceback (most recent call last):
File "/usr/local/bin/calendarcmd", line 945, in <module>
main()
File "/usr/local/bin/calendarcmd", line 942, in main
ret = args.func(caldav_conn, args)
File "/usr/local/bin/calendarcmd", line 480, in calendar_agenda
events_ = find_calendar(caldav_conn, args).date_search(dtstart, dtend, expand=True)
TypeError: date_search() got an unexpected keyword argument 'expand'

Ici, un digression est nécessaire. La simplicité de cette erreur permettant de ne pas trop s’allonger ici, je me permet de la mettre en valeur pour montrer que l’accès au code source est indéniablement un plus dans ce genre de cas.

La lecture du retour d’erreur est claire : ligne 480 dans le code de la commande calendarcmd se trouve une erreur liée à un argument inattendu : expand. Évidemment, il faut savoir lire et prendre le temps de le faire. De plus, il faut se rappeler que la commande calendarcmd est un lien vers calendar-cli.py (voir ci-dessus). C’est donc dans ce fichier qu’il faut chercher.

À la ligne 480 se trouve :

events_ = find_calendar(caldav_conn, args).date_search(dtstart, dtend, expand=True)

et le problème vient du dernier argument de la méthode date_search de l’objet find_calendar. Évidemment, il est facile de simplement le supprimer, vu que « got an unexpected keyword argument ‘expand’ » dit clairement que python ne comprends pas celui-ci. Le problème est qu’il est parfois risqué de lancer une méthode en lui retirant un argument qui pourrait alors être par défaut différent de celui qui était donné. Enfin, par prudence, avant de le supprimer j’ai tenté de trouver la signature de la méthode (c’est-à-dire la spécification de l’ensemble des arguments qu’il utilise). Mais encore fallait-il savoir où chercher en d’autres termes, à quel module appartenait la méthode date_search où l’objet find_calendar.

À force de recherches, je suis tombé sur la documentation de caldav :

https://pythonhosted.org/caldav/caldav/objects.html#caldav.objects.Calendar.date_search

et y ai trouvé la méthode :date_search(start, end=None, compfilter=’VEVENT’) avec la description des paramètres :

  • start = datetime.today().
  • end = same as above.
  • compfilter = defaults to events only. Set to None to fetch all calendar components.

Le dernier paramètre n’étant pas expand et la valeur par défaut de compfilter étant pour récupérer tous les éléments du calendrier, supprimer le dernier argument devait être possible. Je l’ai donc fait et tout a très bien fonctionné.


Ainsi, les deux commandes de base :

calendarcmd calendar add '2016-05-18 11:45:00+2h' 'Test calendrier en ligne de commande'
calendarcmd calendar agenda --from-time=2016-05-17 --agenda-days=14

s’utilisent maintenant sans difficultés. Attention, la première va fournir en retour d’un ajout réussi, un uid d’événement (un nombre unique) qui est nécessaire pour éventuellement le supprimer (voir ci-dessous).

Pour la gestion de multiples calendriers, il suffit d’ajouter –config-section=professionnel :

calendarcmd calendar --config-section=professionnel agenda --from-time=2016-05-17 --agenda-days=14

pour obtenir les événements du calendrier professionnel. Pour en retirer :

calendarcmd calendar delete --event-uid=l_uid_de_l_evenement

Malheureusement, le retrait d’évènements par date n’est pas encore implémenté.

Pour trouver des événements et les supprimer, il faut leur uid. La commande suivante permet de les obtenir :

calendarcmd calendar --config-section=professionnel agenda --event-template "{dtstart} {summary} {uid}"

Elle retourne les événements du calendrier spécifié avec leur date de départ, le texte de commentaire et l’uid.

Laisser un commentaire