2009-06-10 8 views
0

Certainement pas une nouvelle question que je pense, mais ici il va:Limiter l'accès de pages vues à des utilisateurs spécifiques/clients

Dans mon système de commande basé Django chaque utilisateur (qui ne sont pas du personnel) est lié à un objet CustomerProfile qui fait correspondre cet utilisateur à l'objet Client correct. Ces utilisateurs peuvent se connecter et consulter les factures en suspens. Pour voir les factures d'un client que vous accédez à quelque chose comme ceci:

/factures/client/97/

(facture client # 97)

Ce qui est bien, mais je dois intégrer une authentification pour un utilisateur qui fait partie du profil d'un client ne peut pas visualiser les factures d'un autre client en saisissant manuellement/factures/client/92/par exemple (la facture 92 appartient à un autre client).

J'ai cela, mais il est vraiment pas bon code (et ne fonctionne pas):

def customer_invoice_detail(request, object_id): 
    user = threadlocals.get_current_user() 
    try: 
     userprofile = UserProfile.objects.get(user=user) 
     user_customer = userprofile.customer.id 
    except UserProfile.DoesNotExist: 
     user_customer = None 
    if (request.user.is_authenticated() and user_customer is not null) or request.user.is_staff(): 
     invoice = CustomerInvoice.objects.get(pk=object_id) 
     product_list = CustomerInvoiceOrder.objects.filter(invoice=object_id) 
     context = { 
     'object': invoice, 
     'product_list': product_list, 
     } 
     return render_to_response("invoices/customer_invoice_detail.html", context, context_instance=RequestContext(request)) 
    else: 
     return HttpResponse("You are not authorised to view this invoice") 

doit être meilleur/plus facile de faire face à ce - toutes les idées?

Vive

Répondre

2

Ajouter un champ à votre modèle de facture appelé utilisateur:

user = models.ForeignKey(User, related_name="invoices") 

puis récupérer les enregistrements pour un utilisateur spécifique comme celui-ci:

invoice = CustomerInvoice.objects.get(pk=object_id, user=request.user) 

factures Récupération pour un utilisateur donné est alors trivial à l'inverse relation:

request.user.invoices.all() 

aussi, regardez le décorateur @login_required.

2

Je vous recommande faire une logique d'affaires pour votre modèle de client. De cette façon, vous pouvez avoir une méthode get_invoices() qui retourne une liste de factures pour ce client seulement. Cette méthode appelle à son tour une méthode is_authenticated() qui garantit que l'état actuel permet la récupération des données client protégées ou déclenche une exception. Ainsi, quel que soit l'endroit où votre code tente d'obtenir des factures pour un client, une exception sera toujours levée si l'état actuel n'a pas accès aux factures, et vous n'aurez pas à vous inquiéter d'un comportement incohérent. Tant que vous utilisez ces méthodes.

Questions connexes