Bonjour ou bonsoir tout le monde,
D'avance, je m'excuse pour le titre de mon sujet. Il m'est difficile de décrire clairement et simplement la question que je vous pose aujourd'hui. Ceci étant dit …
Dans le cadre du développement technique de Zeste de Savoir, j'espère pouvoir développer prochainement le ping d'un utilisateur (voire d'un groupe). La syntaxe serait la suivante : @**Pseudo**
(si vous n'aimez pas cette syntaxe, je vous redirige vers le sujet de la ZEP qui s'occupe de spécifier la chose) et pourrait figurer à plusieurs reprises dans un message d'un sujet, une conversation privée ou même d'un contenu. Jusque là, pas trop de questions.
Maintenant, parlons un peu implémentation. J'ai un peu réfléchi à la question et j'ai une solution. Reste à savoir si elle est dans l'esprit du développement Django, voire même python. Quant j'ai pensé ma solution, j'avais deux objectifs en tête :
- Être générique sur l'opération faite : Aujourd'hui, on parse une chaîne de caractères pour récupérer tous les pings. Demain, il faut un mécanisme pour rajouter facilement d'autres opérations en touchant le moins possible l'implémentation de l'application de l'opération.
- Eviter la répétition de code. Cela ne me semble pas nécessaire de développer ce point d'avantage. Vous pouvez aisément comprendre où se situe la répétition de code si nous applications le parse sur des contenus différents à plusieurs endroits.
Sachant ceci, voici ce que j'ai imaginé :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # Vue très simplifiée pour mettre en évidence la mixin et l'invocation autour du texte du message. class PostNew(CreatePostView, PingOperationMixin): object = None def form_valid(self, form): # self.operation vient de la mixin PingOperationMixin. text = self.operation(form.data.get('text') topic = send_post(self.request, self.object, self.request.user, text), send_by_mail=True) return redirect(topic.last_message.get_absolute_url()) def get_object(self, queryset=None): try: topic_pk = int(self.request.GET.get('sujet')) except (KeyError, ValueError, TypeError): raise Http404 return get_object_or_404(Topic, pk=topic_pk) |
1 2 3 | class PingOperationMixin(OperationMixin): def operation(self, text): # do stuff. |
1 2 3 | class OperationMixin(objects): def operation(self, text): raise NotImplementedError |
Selon moi, cela permet :
- D'avoir toute la logique du ping dans une classe dédiée.
- D'avoir un faible impact sur le code où j'applique l'opération du ping.
- Chainer les
OperationMixin
dans l'entête de la classe cible. (Si j'ai bien compris python,self.operation()
sera appelé pour chaque mixin déclaré).
Qu'est ce que vous en pensez ? Trouvez-vous que c'est dans l'esprit Django/Python ? Je ne fais pas d'erreur avec mon point 3 sur le chainage des OperationMixin
?
Merci d'avance de vos réponses !