mardi 25 novembre 2014

Monkey patching avec Django

Si vous avez deja utilisé Django vous avez surement utilisé le module User pour gérer vos utilisateurs! Et dans la plupart des cas vous avez ajouté une autre classe (ex: UserProfile) pour ajouter des champs supplementaires à vos utilisateurs, ou vous avez tout simplement ajouter une classe heritant de AbstractUser. 
Ce sont de bonne façons de proceder mais on se retrouve soit avec des tables supplémentaires (1ére option) soit à faire des ninjutsu supplémentaires pour avoir le même comportement qu'avec la classe User (2éme option).
On peut s'éviter tout ceci en faisant du monkey patching!

Monkey patching!

Traduit littéralement ça donne modification singe.. Je sais pas ce que ça veut dire hein!
Dans le monde du logiciel le monkey patching est une technique qui permet d'ajouter des fonctionnalités dans du code existant sans modifier le code source d'origine.

Sans plus tarder appliquons la à notre application django déjà existante.
On suppose que notre application fonctionne avec la classe User avec les champs par défaut et maintenant on veut gérer les photo de profils de nos utilisateurs

Dans le fichier models.py ajoutons les lignes suivantes

from django.contrib.auth.models import User
User.add_to_class('photo', models.ImageField(upload_to='avatars'), blank=True, null=True) 
Une fois qu'on lance les commandes:
python manage.py makemigrations
python manage.py migrate 
python manage.py syncdb
  
Notre base de données se voit modifié avec le champ photo qui est ajouté à la table User

On n'est pas limité qu'à ça on peut modifier les champs par defaut par exemple le champs email de User n'est pas unique on peut ajouter cette option ainsi:


User._meta.get_field('email')._unique = True
Puis on effectue les migrations et sync notre base de données

Une fois ces modifications effectuées on voudra avoir ces champs dans notre admin panel pour cela ajoutons ces lignes dans admin.py

from django.contrib.auth.admin import UserAdmin
UserAdmin.list_display += ('photo', )
UserAdmin.fieldsets[0][1]['fields'] +=  ('photo', )

Et voilà nous avons patchez notre application!
Cette technique presente des avantages mais aussi des inconvenients pas négligeables tels que la diminution de la lisibilité et de la  modularité du code, complexité du code... donc il ne faut pas l'utiliser juste parce que l'on peut le faire!

Dêpot github

Aucun commentaire:

Enregistrer un commentaire

Contact

Nom

E-mail *

Message *