django-fsm(Finite State Machine)では、ソースとターゲットのルールベースの遷移デコレータがうまく動作しています。今私はアクセス許可の処理を追加しようとしています。これは簡単なようですが、ユーザーの権限や不足にかかわらず、私が何をしていても移行が実行されるようです。 Djangoの許可文字列で試してみましたが、ドキュメントごとにlambda
を試しました。 permission
は、単に、True/Falseの返却任意の呼び出し可能に応じる必要があるため、django-fsm:例外を発生させないパーミッション
@transition(field=state, source='prog', target='appr', permission='claims.change_claim')
と
@transition(field=state, source='prog', target='appr', permission=lambda instance, user: not user.has_perm('claims.change_claim'),)
と、ちょうどダブルチェックとして:私はこれらのすべてを試した
@transition(field=state, source='prog', target='appr', permission=False)
def approve(self):
を
いずれもはになります。移行にアクセスするとすべてのユーザーがTransitionNotAllowed
になります。ただし、権限がない基本ユーザーであっても、引き続き遷移を実行できます(claim.approve()
)。
print(has_transition_perm(claim.approve, request.user))
プリント偽:私は許可文字列の権利を持っていることを証明するために
。
class ClaimEditForm(forms.ModelForm):
'''
Some users can transition claims through allowable states
'''
def clean_state(self):
state = self.cleaned_data['state']
if state == 'appr':
try:
self.instance.approve()
except TransitionNotAllowed:
raise forms.ValidationError("Claim could not be approved")
return state
class Meta:
model = Claim
fields = (
'state',
)
とビューハンドラが標準です:次のように私は(ソース/ターゲットのために働く)の検証をしています
if request.method == "POST":
claim_edit_form = ClaimEditForm(request.POST, instance=claim)
if claim_edit_form.is_valid(): # Validate transition rules
私は何をしないのですか?ありがとう。
もちろん、私は完全に、そして完全にドキュメントを読んでいます。私の記事で説明したように、私は両方の手法をドキュメントに記述して、結果を私の投稿に示しました。私が逃したドキュメントから何かがありますか?ありがとう。 – shacker
「あなたはTransitionNotAllowedを起こすべきですか?」の文章に間違っています。モデルメソッドにパーミッションチェックはありません。モデルメソッドは、ユーザーについても知らない。 – kmmbvnr
ああ!したがって、ソース/ターゲットの検証とは異なる動作をします。はい、それは私の誤った仮定でした。これは重要な区別であり、矛盾しているので、ドキュメントはより明確になる可能性があります。私は 'has_transition_permission'文書のセクションが"あなたのコードのどこかで権限をチェックしたいのであれば... "を意味すると理解しました。その文言を "has_transition_permissionメソッドで許可を確認する必要があります"( "can"ではなく)に変更することをお勧めします。ありがとう。 – shacker