2014-04-22 26 views
5

Ich habe einen Dexterity-basierten Container, der in einem Dexterity-basierten Element enthalten ist. Ich muss anonymen Benutzern erlauben, Objekte dieses Typs innerhalb des Containers hinzuzufügen.Ermöglichen Sie es anonymen Benutzern, Dexterity-Objekte hinzuzufügen

ich bereits eine rolemap.xml Datei mit folgendem:

<?xml version="1.0"?> 
<rolemap> 
    <permissions> 
    <permission name="my.package: Add My Type" acquire="True"> 
     <role name="Anonymous"/> 
    </permission> 
    </permissions> 
</rolemap> 

erklärte ich die Erlaubnis auf configure.zcml:

<permission 
    id="my.package.AddMyType" 
    title="my.package: Add My Type" 
    /> 

und schließlich habe ich eine benutzerdefinierte Add Ansicht wie diese:

class MyAddView(dexterity.AddForm): 
    grok.name('MyType') 
    grok.require('my.package.AddMyType') 

Das Formular wird bereits für uns anonym angezeigt aber wenn ich den Speichern-Knopf drücke, werde ich zum Login-Formular weitergeleitet.

auch eingeloggte Benutzer können auch das Formular sehen und dies soll nicht passieren.

was muss ich noch tun?

Antwort

5

dank David Glick, der mich geführt, landete ich mit einer sehr einfachen Lösung Einbeziehung der add Methode der AddForm Klasse bis:

class MyAddView(dexterity.AddForm): 
    grok.name('MyType') 
    grok.require('my.package.AddMyType') 

    def update(self): 
     # check here if the user is anonymous and raise exception if not 
     super(AddView, self).update() 

    def add(self, object): 
     container = aq_inner(self.context) 
     addContentToContainer(container, object, checkConstraints=False) 
     self.immediate_view = container.absolute_url() 

es besser zu verstehen, sollten Sie einen Blick auf, die original code in plone.dexterity.

Eine wichtige Sache, die Sie möglicherweise auch beachten, ist, dass Sie wahrscheinlich Ihre Workflow-Berechtigungen beheben müssen, um die Rolle von einigen von ihnen zu entfernen, oder Sie können mit Inhalten enden, die auch von anonymen Benutzern bearbeitet werden können.