2009-10-20 7 views
3

J'ai un projet Django multilingue. Chaque langue est un sous-domaine différent. Nous avons donc décidé d'utiliser l'application "sites" et de créer un site différent pour chaque langue.Autorisations pour un site uniquement

Sur ce projet, j'ai aussi une application "pages", qui est assez similaire à un CMS. L'utilisateur peut créer des pages avec du contenu et elles seront affichées dans le site de langue approprié.

Maintenant, je cherche à être en mesure de gérer les autorisations avancées. Ce que je dois faire est de permettre, dans l'application d'administration, à un utilisateur de créer et de mettre à jour des pages pour un (ou plusieurs) langage/site spécifique.

Quoi de mieux pour faire quelque chose comme ça?

Edit: Voici la solution que j'ai adapté, donné par Chris

créer un décorateur qui vérifie de manière si l'utilisateur est appropriée dans le groupe qui a accès à la lang. Voir la réponse acceptée de Chris pour un exemple de ceci.

Dans une vue « normale », je fais ce qui suit:

def view(self): 
    # Whatever you wanna do 
    return render_to_response('page.html', {}, RequestContext(request)) 
view = group_required(view) 

Si l'utilisateur est dans le groupe, il retournera la méthode. Sinon, l'erreur "Accès refusé" s'affichera.

Et dans mon admin, je fais ce qui suit:

class PageAdmin(admin.ModelAdmin): 
    list_display = ('title', 'published')  
    fieldsets = [ 
     (None, {'fields': ['title', 'slug', 'whatever_field_you_have']}), 
    ] 

    def has_add_permission(self, request): 
     return in_group_required(request) 
admin.site.register(Page, PageAdmin) 

Lorsque la in_group_required est une méthode similaire à group_required Mentionné ci-dessus. Mais reviendra seulement vrai ou faux selon si nous avons accès ou non.

Et parce que nous les utilisons beaucoup dans les exemples précédents, vous trouverez ci-dessus ce que j'ai dans mes méthodes in_group et group_required.

def group_required(func): 
    def _decorator(request, *args, **kwargs): 
     if not in_group(request): 
      return HttpResponse("Access denied") 
     return func(*args, **kwargs) 
    return _decorator 

def in_group(request): 
    language = Language.objects.get(site__domain__exact=request.get_host()) 
    for group in language.group.all(): 
     if request.user in group.user_set.all(): 
      return True 
    return False 

Répondre

3

Vous pouvez créer un groupe (http://docs.djangoproject.com/en/dev/topics/auth/) par site/langue et ajoutez les utilisateurs aux groupes en conséquence.

Ensuite, vous pouvez vérifier si request.user.groups appartient au groupe. (Vous pouvez le faire avec un décorateur:

def group_required(func): 
    def _decorator(request, *args, **kwargs): 
     hostname = request.META.get('HTTP_HOST') 
     lang = hostname.split(".")[0] 
     if not lang in request.user.groups: 
      return HttpResponse("Access denied") 
     return func(*args, **kwargs) 
    return _decorator 

(Correct/modifier le code pour répondre à vos besoins ...)

+0

Idée intéressante. Serait facile à mettre en œuvre dans une vue "normale". Mais j'ai besoin de filtrer les autorisations dans l'application d'administration. Comment puis-je l'implémenter là? –

1

Vous pouvez remplacer has_add_permission (et des méthodes connexes) dans votre classe ModelAdmin . (Avec un code similaire comme illustré ci-dessus)

+0

Yay!Je ne savais pas à propos de has_add_permission :) Merci. Je modifie mon premier message avec le code. –

0

Si vous souhaitez filtrer les objets de page sur l'index admin de votre page application, vous pouvez remplacer la méthode queryset() dans ModelAdmin. Ce QuerySet renvoie uniquement les objets Page , qui appartiennent à un Si te (et donc Groupe) dont l'utilisateur request.user est membre.

Pages.objects.filter(site__name__in=request.user.groups) 
+0

Chris - pourriez-vous éditer vos trois réponses en une seule réponse? C'est un peu difficile à suivre comme ça. –

+0

Ce n'est pas vraiment une solution ou une solution finale. Mais je vais résumer: Le point clé est d'avoir un groupe par site et ajouter des utilisateurs en conséquence. La première réponse montre un décorateur pour "vues normales". La deuxième réponse modifie la méthode has_add_permission de la classe ModelAdmin qui conduit à l'effet que l'utilisateur (request.user) peut seulement ajouter une page sur le "site actuel", lorsqu'il est dans le bon groupe. La troisième réponse concerne la modification du QuerySet pour la page d'index de l'interface d'administration de l'application. Seules les pages appartenant à un site/groupe dans lequel figure request.user sont affichées. – Chris

+0

@Chris la dernière partie de ma question est en fait la réponse. Comme l'a dit Dominic Rodger, il est assez difficile de suivre vos réponses comme elles sont ici. J'ai trouvé exactement ce dont j'avais besoin avec has_add_permissions et le décorateur. Merci. –

Questions connexes