2012-03-31 8 views
1

Verwenden Sie die wunderbare Django-Tastpie.tastypie - Überprüfen Sie Berechtigungen zum Erstellen von Objekt auf POST

Meine App hat ein Konzept eines Dokuments (d. H. Word Doc). Es gibt einen Besitzer eines Dokuments und viele Editoren. Die Redakteure können Kommentare hinzufügen.

Ich möchte überprüfen, ob ein Editor Berechtigungen für ein Dokument hat, bevor sie einen Kommentar senden können. Allerdings kann ich nicht herausfinden, wie man diese Prüfung mit tastpie durchführt.

Hier ist mein Code ein wenig vereinfacht:

# models.py 

class Document(models.Model): 
    doc_text = models.TextInput() 
    owner = models.ForeignKey(User) 
    editor_group = models.ForeignKey(EditorGroup) 

class EditorGroup(models.Model): 
    name = models.CharField() 
    user = models.ManyToManyField(User) 

class Comment(models.Model): 
    comment = models.CharField() 
    user = models.ForeignKey() 
    document = models.ForeignKey() 

-

# api.py 

class CommentResource(ModelResource): 
    user = fields.ForeignKey(UserResource, 'user') 

    class Meta: 
     queryset = Comment.objects.all() 
     resource_name = 'comments' 
     authorization= DjangoAuthorization() 

     def obj_create(self, bundle, request, **kwargs): 

      # What code can I put here to check if the Editor is in the 
      # EditorGroup 

      return super(AnswerResource, self).obj_create(bundle, request, user=request.user) 

Wenn ein Redakteur ein Dokument überprüft und legt einen Kommentar ich sie, bevor ich Teil des EditorGroup sind überprüfen möchten Erlaube ihnen, den Kommentar zu erstellen.

Ich habe mit dem obj_create nachgesehen, bin aber nicht sicher, wie ich auf das Document-Objekt zugreifen soll, um zu sehen, ob der Editor (der jetzt request.user ist) Teil der EditorGroup ist.

Auch nicht sicher, ob obj_create der richtige Ort ist, um diese Prüfung durchzuführen oder nicht.

Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Hier eine der Optionen ist:

if request.user.groups.filter(id=self.document.editor_group.id).exists(): 
    ...post_comment 
else: 
    ...don't post comment 
+0

Danke. Ich habe es versucht, aber es funktioniert nicht, ich denke, weil das Kommentar-Objekt noch nicht erstellt wurde. Wenn ich versuche, "self.document.editor_group.id" zu verwenden, erhalte ich eine "error_message": "int() muss eine Zeichenfolge oder eine Zahl sein, nicht 'ForeignKey'" – tabdon

+0

yeh Ich habe versucht, herauszufinden, woher du das machst. Überprüfen Sie Ihre bundle.data [] auf eine Kopie Ihres Kommentarobjekts. So etwas wie 'document_id = bundle.data ['document']' ... von dort solltest du wissen was zu tun ist. – abolotnov

+0

Awesome - Ich kann die Kopie des Kommentarobjekts sehen. Jetzt muss ich auf die zugehörige Dokument-Instanz zugreifen, aber alles, was ich habe, ist die URI dazu. Weißt du, wie ich den URI in eine Objektinstanz umwandeln kann? Ich habe versucht, es mit der Funktion get_via_uri zu tun, aber nicht in der Lage, es zu schaffen. – tabdon

1

Wenn Sie etwas auf einem Dokument-Objekt überprüfen müssen, dann unten Lösung scheint ok. Sie können build_related_resource Methode der RelatedField Klasse verwenden, um die Ressource von URI zu erhalten und sie in ein gültiges Django-Objekt umzuwandeln. Wenn Sie jedoch im Allgemeinen nach Gruppen, Berechtigungen und Autorisierung suchen müssen, sollten Sie sich Implementing Your Own Authentication/Authorization in django-tastypie docs ansehen.

class CommentResource(ModelResource): 

    user = fields.ForeignKey(UserResource, 'user') 
    document = fields.ForeignKey(DocumentResource, 'user') 

    def obj_create(self, bundle, request=None, **kwargs): 
     document_uri = json.loads(request.POST.keys()[0]['document']) 
     document = self.document.build_related_resource(document_uri).obj 
     if request.user.has_permission_to(document) or request.user.is_editor: 
      [...]