Search code examples
pythonpython-3.xdjangowebdjango-rules

Django rules re-using predicate


I've created 2 predicate's, which are extremely similar in nature. One consumes a list and the other a static string.

@rules.predicate
def can_edit_items(user, fields):
    for perm in user.groups.all()
        if perm.name not in settings.fields[fields]
            return False
    return True

@rules.predicate
def can_edit_specific_item(user, field):
    for perm in user.groups.all()
        if perm.name not in settings.fields[field]
            return False
    return True

My requirements are that can_edit_specific_item() must make use of can_edit_items() by passing in a single string field_1

I've tried creating the following variation but it doesn't seem to work as I intend it to

@rules.predicate
def can_edit_specific_item(user, field):
    for perm in user.groups.all()
        if perm.name not in can_edit_items[field]
            return False
    return True

Solution

  • You could define can_edit_specific_item by setting @rules.predicate inside can_edit_specific_item and returning this as a func, having only passed in your required field.

    I'm a little unsure of the wider requirements, but maybe this might do the trick

    def can_edit_specific_item(*field):
        @rules.predicate
        def predicate(user):
            return can_edit_items(user, field)
        return predicate