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
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à? –