wagtail-nest / wagtail-ab-testing

A/B testing for Wagtail
Other
23 stars 20 forks source link

TypeError: can_be_triggered_on_page_type() missing 1 required positional argument: 'page_type' #25

Open feliche93 opened 3 years ago

feliche93 commented 3 years ago

I am trying to use this new awesome features but get the following error: TypeError: can_be_triggered_on_page_type() missing 1 required positional argument: 'page_type'. Callback traces to here:

https://github.com/torchbox/wagtail-ab-testing/blob/449a237292d401dea4a9dfe0ee49381cf5a049b4/wagtail_ab_testing/views.py#L135

My wagtail_hooks.py looks like this:

from wagtail.core import hooks
from wagtail_ab_testing.events import BaseEvent

from .models import ProductDetailPage

class ExternalLinkClickEvent(BaseEvent):
    name = "External Link Click"

    def get_page_types(self):
        return [
            ProductDetailPage,
        ]

@hooks.register('register_ab_testing_event_types')
def register_external_link_click_event_type():
    return {
        'external-link-click': ExternalLinkClickEvent,
    }

In my models.py file, I was planning to use RoutablePageMixin with a custom route and javascript call on button click to trigger a request to the route to log any potential conversion. Not sure how the javascript part works yet or what the best solution would be?

class ProductDetailPage(MetadataPageMixin, RoutablePageMixin, Page):
    """
    A generic product detail page.
    """

    product_primary_cta_link = models.URLField(
        help_text='Link to docassemble interview',
        blank=True,
        null=True
    )

    # other Fields...

    @route(r'^external_link_clicked/$')
    def external_link_clicked(self, request, *args, **kwargs):
        """
        View function for tracking click to external link.
        """

        # Check if the user is trackable
        if request_is_trackable(request):
            # Check if the page is the goal of any running tests
            tests = AbTest.objects.filter(goal_event='external-link-click', goal_page=self, status=AbTest.STATUS_RUNNING)
            for test in tests:
                # Is the user a participant in this test?
                if f'wagtail-ab-testing_{test.id}_version' not in request.session:
                    continue

                # Has the user already completed the test?
                if f'wagtail-ab-testing_{test.id}_completed' in request.session:
                    continue

                # Log a conversion
                test.log_conversion(request.session[f'wagtail-ab-testing_{test.id}_version'])
                request.session[f'wagtail-ab-testing_{test.id}_completed'] = 'yes'

Any help would be very much appreciated! Thanks 🙏

suxilog commented 3 years ago

@feliche93 Did u solve this error? I meet same problem.

suxilog commented 3 years ago

@feliche93 pls check here, hook register return a class. The document miss '()'. https://github.com/torchbox/wagtail-ab-testing/blob/34468119198164e884d0e16887ca47cbd8a57fbf/wagtail_ab_testing/test/wagtail_hooks.py#L14