Creating custom rules

Rules consist of two important elements, the model fields and the test_user function. They should inherit the AbstractBaseRule class from wagtail_personalisation.rules.

A simple example of a rule could look something like this:

class UserIsLoggedInRule(AbstractBaseRule):
    """User is logged in rule to segment users based on their authentication
    status.

    Matches when the user is authenticated.

    """
    icon = 'fa-user'

    is_logged_in = models.BooleanField(default=False)

    panels = [
        FieldPanel('is_logged_in'),
    ]

    class Meta:
        verbose_name = _('Logged in Rule')

    def test_user(self, request=None):
        return request.user.is_authenticated() == self.is_logged_in

    def description(self):
        return {
            'title': _('These visitors are'),
            'value': _('Logged in') if self.is_logged_in else _('Not logged in'),
        }

As you can see, the only real requirement is the test_user function that will either return True or False based on the model fields and optionally the request object.

That’s it!