Makina Blog

Le blog Makina-corpus

Signez vos documents sur tablette tactile avec django-jsignature


Limiter les échanges et les impressions de courrier en signant "à la main" des documents directement sur tablette tactile avec jSignature et django-jsignature.

Aujourd'hui, tous les documents (ou presque) générés par l'activité d'une entreprise sont créés informatiquement. Dans certains cas, l'impression d'un document est nécessaire uniquement pour apposer une signature (de l'envoyeur, du destinataire ou autre).

Dans le cadre d'un projet de GMAO (Gestion de la Maintenance Assistée par Ordinateur) "full web" chez Makina Corpus, nous avons mis en place, pour les techniciens itinérants, la saisie/génération d'un rapport d'intervention :

  • Dès la fin de son intervention, le technicien saisit son compte-rendu sur tablette tactile.
  • Un rapport PDF est généré et affiché sur la tablette.
  • Le client contrôle et signe le rapport, toujours, sur la tablette.
  • Le rapport signé est envoyé aux deux parties.

Cette procédure, réalisée sur place et immédiatement après l'intervention, permet un gain de temps important en évitant les doubles saisies, les impressions et les échanges mails et courriers.

Ce qui nous intéresse ici est la partie "signature" que nous avons réalisé avec la librairie jSignature, encapsulée dans une petite bibliothèque django.

django-jsignature

Une rapide note sur ce que dit la loi

En premier lieu, il faut différencier la "signature manuscrite-électronique", qui consiste à capturer électroniquement une signature manuscrite, de la "signature électronique" (ou "signature numérique") qui consiste à associer une clé cryptée à la donnée.

A l'heure actuelle, les règles juridiques concernant la signature "manuscrite-électronique" sont assez floues. Pour qu'une signature soit considérée comme fiable, il faudrait pouvoir :

  • capturer le tracé, le temps d'exécution et la pression du stylet, permettant à un graphologue d'authentifier la signature (possible seulement sur les outils de capture spécialisés);
  • garantir la sécurisation / non modification de l'information.

Les signatures que nous capturons sur PC / tablette / smartphone n'ont pas de réelle valeur juridique, ce qui n'empêche pas qu'elles peuvent être utiles dans certains cas.

jSignature et django-jsignature

jSignature est un plugin jQuery qui transforme un simple <div> en cadre prêt à recevoir une signature dessinée à la souris ou mieux, au doigt ou stylet sur écran tactile. Quelques options de configuration sont disponibles et l'export de la signature est possible dans différents formats (image base/64, image base/30, JSON…).

Nous avons publié django-jsignature, une petite app django permettant :

  • d'avoir facilement un champ "signature" dans un formulaire django (avec un field et un widget) ;
  • de faire le rendu de l'image en Python (avec Pillow) ;
  • de stocker la signature (en JSON) et la date de signature dans un modèle (champs fournis par un mixin).

Signez ici SVP !

Pour utiliser l'app, il suffit :

  • de l'installer …
    $ pip install -e git+https://github.com/fle/django-jsignature.git#egg=django-jsignature
  • de l'ajouter au INSTALLED_APPS dans vos settings django …
    # settings.py
    INSTALLED_APPS = (
    ...
    'jsignature',
    )
  • d'utiliser le field (et son widget) fourni dans un formulaire …
    # forms.py
    from django import forms
    from jsignature.forms import JSignatureField

    class SignatureForm(forms.Form):
        signature = JSignatureField()
  • de faire le rendu de l'image après validation du formulaire …
    # views.py
    from jsignature.utils import draw_signature
    from myapp.forms import SignatureForm

    def my_view(request):
        form = SignatureForm(request.POST or None)
        if form.is_valid():
            signature = form.cleaned_data.get('signature')
            if signature:
                # sous forme d'image
                signature_picture = draw_signature(signature)
                # sous forme de fichier
                signature_file_path = draw_signature(signature, as_file=True)
  • et de faire ce que vous voulez de l'image (l'afficher, l'apposer dans un PDF…).

Si vous souhaitez stocker les signatures, vous pouvez faire hériter votre model de JSignatureFieldsMixin, qui fourni deux champs signature et signature_date :

    # models.py
    from django.db import models
    from jsignature.mixins import JSignatureFieldsMixin

    class SignatureModel(JSignatureFieldsMixin):
        name = models.CharField()

Personnalisation

Les options de configuration de jSignature sont disponibles niveau Python. Vous pouvez surcharger ces options de deux manières :

  • Globalement, dans vos settings :
    # settings.py
    JSIGNATURE_WIDTH = 500
    JSIGNATURE_HEIGHT = 200
  • Spécifiquement, dans un formulaire :
    # forms.py
    from jsignature.forms import JSignatureField
    from jsignature.widgets import JSignatureWidget

    JSignatureField(widget=JSignatureWidget(jsignature_attrs={'color': '#CCC'}))

Conclusion

Même si la signature électronique n'est pas une preuve totalement valable aux yeux de la loi, pouvoir apposer une signature sur une tablette tactile peut être vraiment utile et éviter des impressions et des échanges inutiles :).

Formations associées

Formations Django

Formation Django initiation

Nantes Du 12 au 14 mars 2024

Voir la formation

Formations Django

Formation Django avancé

À distance (FOAD) Du 9 au 13 décembre 2024

Voir la formation

Formations Django

Formation Django intégration

À distance (FOAD) 11 mai

Voir la formation

Actualités en lien

Image
Django PostgreSQL
07/11/2023

Utiliser des fonctions PostgreSQL dans des contraintes Django

Cet article vous présente comment utiliser les fonctions et les check constraints PostgreSQL en tant que contrainte sur vos modèles Django.

Voir l'article
Image
Encart Django
06/11/2023

Comment migrer vers une version récente de Django ?

Que ce soit pour avoir les dernières fonctionnalités ou les correctifs de sécurité, rester sur une version récente de Django est important pour la pérennité de son projet.

Voir l'article
Image
Agrégateur Geotrek
08/06/2023

Le projet Agrégateur : fusionner des bases de données Geotrek

Le partage et la diffusion des données font partie des problématiques historiques au cœur du projet Geotrek.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus