diff --git a/src/personalisation/admin.py b/src/personalisation/admin.py index ad3c2b7..3351b7e 100644 --- a/src/personalisation/admin.py +++ b/src/personalisation/admin.py @@ -1,40 +1,29 @@ from django.contrib import admin from personalisation import models -from polymorphic.admin import PolymorphicInlineSupportMixin, StackedPolymorphicInline - -class RulesInline(StackedPolymorphicInline): - - class TimeRuleAdminInline(StackedPolymorphicInline.Child): - """Inline the Time Rule into the administration interface for segments""" - model = models.TimeRule - extra = 0 - class ReferralRuleAdminInline(StackedPolymorphicInline.Child): - """ - Inline the Referral Rule into the administration interface for segments - """ - model = models.ReferralRule - extra = 0 +class TimeRuleAdminInline(admin.TabularInline): + """Inline the Time Rule into the administration interface for segments""" + model = models.TimeRule + extra = 0 - class VisitCountRuleAdminInline(StackedPolymorphicInline.Child): - """ - Inline the Visit Count Rule into the administration interface for segments - """ - model = models.VisitCountRule - extra = 0 +class ReferralRuleAdminInline(admin.TabularInline): + """Inline the Referral Rule into the administration interface for segments""" + model = models.ReferralRule + extra = 0 - model = models.AbstractBaseRule - child_inlines = ( - TimeRuleAdminInline, - ReferralRuleAdminInline, - VisitCountRuleAdminInline, - ) +class VisitCountRuleAdminInline(admin.TabularInline): + """Inline the Visit Count Rule into the administration interface for segments""" + model = models.VisitCountRule + extra = 0 -@admin.register(models.Segment) -class SegmentAdmin(PolymorphicInlineSupportMixin, admin.ModelAdmin): - inlines = (RulesInline,) +class SegmentAdmin(admin.ModelAdmin): + """Add the inlines to the Segment admin interface""" + inlines = (TimeRuleAdminInline, ReferralRuleAdminInline, VisitCountRuleAdminInline) + + +admin.site.register(models.Segment, SegmentAdmin) diff --git a/src/personalisation/migrations/0031_auto_20161130_1224.py b/src/personalisation/migrations/0031_auto_20161130_1224.py new file mode 100644 index 0000000..4773d40 --- /dev/null +++ b/src/personalisation/migrations/0031_auto_20161130_1224.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2016-11-30 11:24 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import modelcluster.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('personalisation', '0030_personalisablepage_is_segmented'), + ] + + operations = [ + migrations.RemoveField( + model_name='abstractbaserule', + name='polymorphic_ctype', + ), + migrations.RemoveField( + model_name='abstractbaserule', + name='segment', + ), + migrations.RemoveField( + model_name='referralrule', + name='abstractbaserule_ptr', + ), + migrations.RemoveField( + model_name='timerule', + name='abstractbaserule_ptr', + ), + migrations.RemoveField( + model_name='visitcountrule', + name='abstractbaserule_ptr', + ), + migrations.AddField( + model_name='referralrule', + name='id', + field=models.AutoField(auto_created=True, default=0, primary_key=True, serialize=False, verbose_name='ID'), + preserve_default=False, + ), + migrations.AddField( + model_name='referralrule', + name='segment', + field=modelcluster.fields.ParentalKey(default=0, on_delete=django.db.models.deletion.CASCADE, related_name='personalisation_referralrule_related', related_query_name='personalisation_referralrules', to='personalisation.Segment'), + preserve_default=False, + ), + migrations.AddField( + model_name='timerule', + name='id', + field=models.AutoField(auto_created=True, default=0, primary_key=True, serialize=False, verbose_name='ID'), + preserve_default=False, + ), + migrations.AddField( + model_name='timerule', + name='segment', + field=modelcluster.fields.ParentalKey(default=0, on_delete=django.db.models.deletion.CASCADE, related_name='personalisation_timerule_related', related_query_name='personalisation_timerules', to='personalisation.Segment'), + preserve_default=False, + ), + migrations.AddField( + model_name='visitcountrule', + name='id', + field=models.AutoField(auto_created=True, default=0, primary_key=True, serialize=False, verbose_name='ID'), + preserve_default=False, + ), + migrations.AddField( + model_name='visitcountrule', + name='segment', + field=modelcluster.fields.ParentalKey(default=0, on_delete=django.db.models.deletion.CASCADE, related_name='personalisation_visitcountrule_related', related_query_name='personalisation_visitcountrules', to='personalisation.Segment'), + preserve_default=False, + ), + migrations.DeleteModel( + name='AbstractBaseRule', + ), + ] diff --git a/src/personalisation/models.py b/src/personalisation/models.py index ead30e4..ce7c299 100644 --- a/src/personalisation/models.py +++ b/src/personalisation/models.py @@ -22,12 +22,10 @@ from wagtail.wagtailcore.models import Page @python_2_unicode_compatible -class AbstractBaseRule(PolymorphicModel): +class AbstractBaseRule(models.Model): """Base for creating rules to segment users with""" segment = ParentalKey( 'personalisation.Segment', - # TODO: Make the related names accessible to wagtail admin - # for inlining them. related_name="%(app_label)s_%(class)s_related", related_query_name="%(app_label)s_%(class)ss" ) @@ -39,6 +37,9 @@ class AbstractBaseRule(PolymorphicModel): def __str__(self): return "Segmentation rule" + class Meta: + abstract = True + @python_2_unicode_compatible class TimeRule(AbstractBaseRule): @@ -175,6 +176,14 @@ class Segment(ClusterableModel): 'personalisation_timerule_related', label=_("Time rule"), min_num=0, max_num=1 ), + InlinePanel( + 'personalisation_referralrule_related', + label=_("Referral rule"), min_num=0, max_num=1 + ), + InlinePanel( + 'personalisation_visitcountrule_related', + label=_("Visit count rule"), min_num=0, max_num=1 + ), ] def __str__(self):