ZEP-12 : refonte du principe des tutoriels et articles

Avec pour base atomique ... l'extrait

Le problème exposé dans ce sujet a été résolu.

je l'ai fait, en effet. J'ai réussi à avoir des conflits avec ça alors crois-moi, je vais tenter de le faire le plus souvent possible ^^

artragis

Bon, ben t'as lu dans mes pensées, parce que j'y pensais.

Plus sérieusement, c'est normal qu'il y aie eu des conflits : j'ai au moins modifié 3 fichiers principaux (url.py, settings.py et des machins dans utils.py, si je me souviens bien), puis je me suis planté une fois et j'ai refactorisé trop fort avec pycharm et j'ai bousillé un machin dans /zds/tutorial/ qui a a mon avis du t'ennuyer, même si je l'ai corrigé par après, donc là … C'est ma faute ^^

Need Help !

La ZEP 12 permettra au module de tuto de passer en Class Based View ledit module. Cela économise énormément de code, mais… ça change un peu le code qui a été produit quand même.

notamment, la gestion des décorateurs n'est pas la même. J'aimerai avoir votre avis sur ce qu'on doit faire pour jouer avec les décorateurs de type require_permission. J'ai trouvé cet article mais autant je ne comprends pas la "solution crade", autant je n'ai pas envie d'ajouter une dépendance au projet sans votre accord (pour les mixins). Qu'en dites-vous?

Et avec un mixin tout simple comme dans l'article ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class PermissionRequiredMixin(object):
    permissions = []

    def dispatch(self):
        # vérifier les permissions pour l'utilisateur

class ArticleView(PermissionsRequiredMixin, View):
    permissions = [
        'zds.view_article',
        'zds.create_article'
    ]

    ...

Tu peut toujours l'écrire : dans le mixin, tu met exactement le décorateur qui est utilisé en ce moment sur la méthode dispatch et ça devrait fonctionner

on peut pas : require_permission demande des arguments spéciaux.

artragis

Et dans ce cas, un décorateur avec paramètres ? J'avais fait un truc avec un décorateur qui va chercher les valeurs de ses arguments dans l'instance de l'objet en cours de rendu ici. Et comme ça tu as directement accès à la requête et à l'objet tutoriel.

+0 -0

Franchement chapeau les gars pour tout le boulot que vous faites !

Je me permet de citer artragis sur IRC :

1
2
[21:45] <artragis> on n'a pas encore fini notre boulot de réduction et on est passé de 2 modules dont les vues ont 3K lignes à un seule module où les vues où les vues ont 2.5K lignes
[21:46] <artragis> et encore, on a commenté comme des malades

Je sais pas si les urls ont été discutées sur ce sujet, mais j'ai vu le fichier urls_contents.py (visible ici). Il y a des urls comme editer-conteneur et editer-extrait ; il plutôt courant de faire editer/conteneur et editer/extrait. Enfin, je pense que si ça n'a pas été discuté ça le sera plus tard ? :)

+0 -0
1
from zds.member.decorator import PermissionRequiredMixin

Je te suggère de créer un fichier mixins.py dans le module utils pour être plus clair dans l'organisation des fichiers. Ensuite pour éviter de se répéter au niveau des views j'aurais défini les mixins de cette façon :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class PermissionRequiredMixin(object):
    permissions = []

    def check_permissions(self):
        if not self.request.user.has_perms(self.permissions):
            raise PermissionDenied

    def dispatch(self, *args, **kwargs):
        self.check_permissions()
        return super(PermissionRequiredMixin, self).dispatch(*args, **kwargs)

class LoginRequiredMixin(object):

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(*args, **kwargs)

Ce qui permettrait d'éliminer un peu de code pour les views :

1
2
3
4
5
6
7
class ValidationListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
    permissions = ["tutorial.change_tutorial"]
    context_object_name = "validations"
    template_name = "tutorialv2/validation/index.html"

    def get_queryset(self):
        ...
+0 -0

Je sais pas si les urls ont été discutées sur ce sujet, mais j'ai vu le fichier urls_contents.py (visible ici). Il y a des urls comme editer-conteneur et editer-extrait ; il plutôt courant de faire editer/conteneur et editer/extrait. Enfin, je pense que si ça n'a pas été discuté ça le sera plus tard ? :)

Situphen

En effet, ça n'as pas été réellement discuté, j'ai fait ça au feeling. À mon sens, je trouve ton idée séduisante, d'autant que ça ne change rien au résultat (puisque ce qui est toujours appelé, c'est le nom, et pas l'URL).

Du reste, j'aime bien l'idée de poulp, if any :) (j'envisage de faire un truc du genre pour les FormView pour lesquels la fonction get_object() est stricto facto toujours la même).

Pour quelqu'un qui a l'habitude du Java, C# et des bases en C++, cette ligne, c'est juste incompréhensible : return super(LoginRequiredMixin, self).dispatch(*args, **kwargs). Je lis ça comme "appelle moi la méthode parente de LoginRequirendMixin quis 'appelle dispatch." Or LoginRequiredMixin n'a pas de dispatch. ça fait mal.

Je lis ça comme "appelle moi la méthode parente de LoginRequirendMixin quis 'appelle dispatch." Or LoginRequiredMixin n'a pas de dispatch. ça fait mal.

Non en fait c'est fait pour appeler les methodes des classes parentes (appelé "super" dans le monde python). En gros il faut lire cette ligne "appel moi la methode dispatch des classes parentes de self en le considérant comme un LoginRequiredMixin". Donc ce n'est pas la méthode de LoginRequiredMixin qui va être appelé, mais celle de la première classe parente qui va être disponible.

A cause du ducktyping, on a pas vraiment le choix si on veut éviter de mettre spécifiquement le nom de la classe parente.

Pour autant je concède que c'est cryptique. En python 3 cette technique a été largement simplifié et se résume souvent à super().dispatch(*args, **kwargs)

Voilà, les mixins sont implémentés, ce qui est vraiment un line saviour ^^.

Bon, à périmètre constant (i.e sans compter les tests ni les templates), alors que nous avons encore un gros reliquat de l'ancien système les chiffres ne trompent pas :

Module Nombre de lignes
article 3071
tutorial 7716
tutorialv2 5325
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte