7

Compare commits

...

20 Commits

Author SHA1 Message Date
7ced6db126 Merge branch 'release/0.10.4' 2018-01-22 12:58:31 +02:00
c6ce67c9c9 Version bump 0.10.4 2018-01-22 12:58:12 +02:00
3df3fc0b16 Merge pull request #6 from praekeltfoundation/feature/SAS-87-fix-static-rules
Set QueryRule to be static
2018-01-22 12:03:29 +02:00
a00929846e Set query rule to be static 2018-01-18 16:17:30 +02:00
49fba11049 Merge pull request #5 from praekeltfoundation/enable-linting
Enable and fix lint
2018-01-08 10:23:36 +00:00
e3488e87ad Enable and fix lint 2018-01-08 09:08:11 +00:00
808aa6d202 Add tests for exclude_variants 2018-01-08 09:07:15 +00:00
efb060cc6e Merge branch 'release/0.10.3' into develop 2018-01-05 19:18:14 +02:00
414afa5269 Merge branch 'release/0.10.3' 2018-01-05 19:17:18 +02:00
b3f0ac2d58 Version Bump 0.10.3 2018-01-05 19:16:45 +02:00
4f9c18d2cf Merge pull request #3 from praekeltfoundation/fix-segment-edit-link
Fix segment edit link
2018-01-05 17:08:12 +00:00
a4a283e4f3 Fix segment edit link
This is hardcoded at the moment which doesn't work unless you
redirect URLs to have a trailing slash.

Using the reverse URL lookup works in all cases.
2018-01-05 17:00:15 +00:00
30318549e2 Merge pull request #4 from praekeltfoundation/feature/issue-4-update-wagtail-django-dependencies
Update wagtail and django dependencies
2018-01-05 18:55:18 +02:00
f19de241b0 Update dependencies for wagtail and django
Only run tests for wagtail v1.13 and django v1.11
2018-01-05 18:28:40 +02:00
95ecd8d200 Merge branch 'release/0.10.2' into develop 2017-11-23 16:33:16 +02:00
6436b85b1d Merge branch 'release/0.10.2' 2017-11-23 16:32:31 +02:00
06471248d3 Version Bump 0.10.2 2017-11-23 16:32:20 +02:00
e3df03f559 Merge pull request #2 from torchbox/fix/visitor-rule-not-updating
Fix visitor rule not updating correct paths
2017-11-23 16:29:13 +02:00
0a42ce3eeb Fix not updating visitor count rule properly 2017-11-23 14:10:16 +00:00
e5068894c3 Merge branch 'release/0.10.1' into develop 2017-11-13 15:03:41 +02:00
20 changed files with 102 additions and 53 deletions

View File

@ -4,9 +4,11 @@ language: python
matrix:
include:
# Django 1.9, Wagtail 1.9
- python: 2.7
env: TOXENV=py27-django19-wagtail19
env: lint
- python: 2.7
env: TOXENV=py27-django111-wagtail113
install:
- pip install tox codecov

View File

@ -55,10 +55,10 @@ author = 'Lab Digital BV'
# built documents.
#
# The short X.Y version.
version = '0.10.1'
version = '0.10.4'
# The full version, including alpha/beta/rc tags.
release = '0.10.1'
release = '0.10.4'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

View File

@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.10.1
current_version = 0.10.4
commit = true
tag = true
tag_name = {new_version}

View File

@ -2,7 +2,7 @@ import re
from setuptools import find_packages, setup
install_requires = [
'wagtail>=1.9,<1.11',
'wagtail>=1.10,<1.14',
'user-agents>=1.0.1',
'wagtailfontawesome>=1.0.6',
]
@ -32,7 +32,7 @@ with open('README.rst') as fh:
setup(
name='wagtail-personalisation-molo',
version='0.10.1',
version='0.10.4',
description='A forked version of Wagtail add-on for showing personalized content',
author='Praekelt.org',
author_email='dev@praekeltfoundation.org',

View File

@ -3,7 +3,6 @@ from __future__ import absolute_import, unicode_literals
from django.conf import settings
from django.db.models import F
from django.utils.module_loading import import_string
from django.utils import timezone
from wagtail_personalisation.models import Segment
from wagtail_personalisation.rules import AbstractBaseRule
@ -133,12 +132,13 @@ class SessionSegmentsAdapter(BaseSegmentsAdapter):
if page_visits:
for page_visit in page_visits:
page_visit['count'] += 1
page_visit['path'] = page.url_path if page else self.request.path
self.request.session.modified = True
else:
visit_count.append({
'slug': page.slug,
'id': page.pk,
'path': self.request.path,
'path': page.url_path if page else self.request.path,
'count': 1,
})

View File

@ -8,15 +8,11 @@ from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser
from django.contrib.sessions.models import Session
from django.contrib.staticfiles.templatetags.staticfiles import static
from django.core.exceptions import ValidationError
from django.test.client import RequestFactory
from django.utils import timezone
from django.utils.lru_cache import lru_cache
from django.utils.translation import ugettext_lazy as _
from wagtail.wagtailadmin.forms import WagtailAdminModelForm
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
@ -29,7 +25,6 @@ def user_from_data(user_id):
return AnonymousUser()
class SegmentAdminForm(WagtailAdminModelForm):
def clean(self):
cleaned_data = super(SegmentAdminForm, self).clean()
@ -62,7 +57,6 @@ class SegmentAdminForm(WagtailAdminModelForm):
if field not in excluded:
form.add_error(field, _('Cannot update a static segment'))
def save(self, *args, **kwargs):
is_new = not self.instance.id

View File

@ -2,8 +2,8 @@
# Generated by Django 1.11.1 on 2017-05-31 14:28
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):

View File

@ -2,7 +2,6 @@ from __future__ import absolute_import, unicode_literals
from django import forms
from django.conf import settings
from django.contrib.sessions.models import Session
from django.db import models, transaction
from django.template.defaultfilters import slugify
from django.utils.encoding import python_2_unicode_compatible
@ -11,11 +10,7 @@ from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
from modelcluster.models import ClusterableModel
from wagtail.wagtailadmin.edit_handlers import (
FieldPanel,
FieldRowPanel,
InlinePanel,
MultiFieldPanel,
)
FieldPanel, FieldRowPanel, InlinePanel, MultiFieldPanel)
from wagtail.wagtailcore.models import Page
from wagtail_personalisation.rules import AbstractBaseRule
@ -125,7 +120,7 @@ class Segment(ClusterableModel):
@classmethod
def all_static(cls, rules):
return all(rule.static for rule in rules)
return all(rule.static for rule in rules)
@property
def all_rules_static(self):

View File

@ -261,6 +261,7 @@ class QueryRule(AbstractBaseRule):
"""
icon = 'fa-link'
static = True
parameter = models.SlugField(_("The query parameter to search for"),
max_length=20)

View File

@ -22,7 +22,7 @@
<div class="nice-padding block_container">
{% if all_count %}
{% for segment in object_list %}
<div class="block block--{{ segment.status }}" onclick="location.href = 'edit/{{ segment.pk }}'">
<div class="block block--{{ segment.status }}" onclick="location.href = '{% url 'wagtail_personalisation_segment_modeladmin_edit' segment.pk %}'">
<h2>{{ segment }}</h2>
<div class="inspect_container">
<ul class="inspect segment_stats">
@ -90,7 +90,7 @@
{% elif segment.status == segment.STATUS_ENABLED %}
<li><a href="{% url 'segment:toggle' segment.pk %}" title="{% trans "Disable this segment" %}">disable</a></li>
{% endif %}
<li><a href="edit/{{ segment.pk }}" title="{% trans "Configure this segment" %}">configure this</a></li>
<li><a href="{% url 'wagtail_personalisation_segment_modeladmin_edit' segment.pk %}" title="{% trans "Configure this segment" %}">configure this</a></li>
</ul>
{% endif %}
</div>

View File

@ -103,9 +103,17 @@ def exclude_variants(pages):
:return: List of pages that aren't variants
:rtype: list
"""
return [page for page in pages
if (hasattr(page, 'personalisation_metadata') is False)
or (hasattr(page, 'personalisation_metadata')
and page.personalisation_metadata is None)
or (hasattr(page, 'personalisation_metadata')
and page.personalisation_metadata.is_canonical)]
return [
page for page in pages
if (
(
hasattr(page, 'personalisation_metadata') is False
) or
(
hasattr(page, 'personalisation_metadata') and page.personalisation_metadata is None
) or
(
hasattr(page, 'personalisation_metadata') and page.personalisation_metadata.is_canonical
)
)
]

View File

@ -7,7 +7,7 @@ from django.core.urlresolvers import reverse
from django.template.defaultfilters import pluralize
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
from wagtail.wagtailadmin.site_summary import SummaryItem, PagesSummaryItem
from wagtail.wagtailadmin.site_summary import PagesSummaryItem, SummaryItem
from wagtail.wagtailadmin.widgets import Button, ButtonWithDropdownFromHook
from wagtail.wagtailcore import hooks
from wagtail.wagtailcore.models import Page

View File

@ -1,10 +1,9 @@
from __future__ import absolute_import, unicode_literals
import os
from pkg_resources import parse_version as V
import django
from pkg_resources import parse_version as V
DATABASES = {
'default': {
@ -56,6 +55,7 @@ TEMPLATES = [
},
]
def get_middleware_settings():
return (
'django.middleware.common.CommonMiddleware',
@ -69,6 +69,7 @@ def get_middleware_settings():
'wagtail.wagtailcore.middleware.SiteMiddleware',
)
# Django 1.10 started to use "MIDDLEWARE" instead of "MIDDLEWARE_CLASSES".
if V(django.get_version()) < V('1.10'):
MIDDLEWARE_CLASSES = get_middleware_settings()

View File

@ -21,7 +21,7 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='ContentPage',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.Page')), # noqa: E501
('subtitle', models.CharField(blank=True, default='', max_length=255)),
('body', wagtail.wagtailcore.fields.RichTextField(blank=True, default='')),
],

View File

@ -2,9 +2,9 @@
# Generated by Django 1.11.1 on 2017-06-02 04:26
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import wagtail.wagtailcore.fields
from django.db import migrations, models
class Migration(migrations.Migration):
@ -18,7 +18,7 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='RegularPage',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.Page')), # noqa: E501
('subtitle', models.CharField(blank=True, default='', max_length=255)),
('body', wagtail.wagtailcore.fields.RichTextField(blank=True, default='')),
],

View File

@ -4,16 +4,14 @@ import datetime
import pytest
from tests.factories.page import ContentPageFactory
from tests.factories.rule import (
DayRuleFactory, DeviceRuleFactory, ReferralRuleFactory, TimeRuleFactory)
from tests.factories.rule import ReferralRuleFactory, QueryRuleFactory
from tests.factories.segment import SegmentFactory
from tests.factories.site import SiteFactory
from wagtail_personalisation.models import Segment
from wagtail_personalisation.rules import TimeRule
# Factory tests
@pytest.mark.django_db
def test_segment_create():
factoried_segment = SegmentFactory()
@ -27,8 +25,6 @@ def test_segment_create():
assert factoried_segment.status == segment.status
@pytest.mark.django_db
def test_referral_rule_create():
segment = SegmentFactory(name='Referral')
@ -37,3 +33,16 @@ def test_referral_rule_create():
segment=segment)
assert referral_rule.regex_string == 'test.test'
@pytest.mark.django_db
def test_query_rule_create():
segment = SegmentFactory(name='Query')
query_rule = QueryRuleFactory(
parameter="query",
value="value",
segment=segment)
assert query_rule.parameter == 'query'
assert query_rule.value == 'value'
assert query_rule.static

View File

@ -16,6 +16,8 @@ def test_time_rule_create():
segment=segment)
assert time_rule.start_time == datetime.time(8, 0, 0)
@pytest.mark.django_db
@freeze_time("10:00:00")
def test_requesttime_segment(client, site):

View File

@ -2,15 +2,14 @@ from __future__ import absolute_import, unicode_literals
import datetime
from django.forms.models import model_to_dict
from django.contrib.sessions.backends.db import SessionStore
import pytest
from django.forms.models import model_to_dict
from tests.factories.segment import SegmentFactory
from wagtail_personalisation.forms import SegmentAdminForm
from wagtail_personalisation.models import Segment
from wagtail_personalisation.rules import TimeRule, VisitCountRule
from tests.factories.segment import SegmentFactory
def form_with_data(segment, *rules):
model_fields = ['type', 'status', 'count', 'name', 'match_any']
@ -63,6 +62,7 @@ def test_anonymous_user_not_added_to_static_segment_at_creation(site, client):
assert not instance.static_users.all()
@pytest.mark.django_db
def test_match_any_correct_populates(site, client, django_user_model):
user = django_user_model.objects.create(username='first')

View File

@ -1,4 +1,5 @@
from wagtail_personalisation.utils import impersonate_other_page
from wagtail_personalisation.utils import (
exclude_variants, impersonate_other_page)
class Page(object):
@ -19,3 +20,40 @@ def test_impersonate_other_page():
impersonate_other_page(page, other_page)
assert page == other_page
class Metadata(object):
def __init__(self, is_canonical=True):
self.is_canonical = is_canonical
class PersonalisationMetadataPage(object):
def __init__(self):
self.personalisation_metadata = Metadata()
def test_exclude_variants_includes_pages_with_no_metadata_property():
page = PersonalisationMetadataPage()
del page.personalisation_metadata
result = exclude_variants([page])
assert result == [page]
def test_exclude_variants_includes_pages_with_metadata_none():
page = PersonalisationMetadataPage()
page.personalisation_metadata = None
result = exclude_variants([page])
assert result == [page]
def test_exclude_variants_includes_pages_with_metadata_canonical():
page = PersonalisationMetadataPage()
result = exclude_variants([page])
assert result == [page]
def test_exclude_variants_excludes_pages_with_metadata_not_canonical():
page = PersonalisationMetadataPage()
page.personalisation_metadata.is_canonical = False
result = exclude_variants([page])
assert result == []

View File

@ -1,13 +1,12 @@
[tox]
envlist = py{27}-django{19}-wagtail{19},lint
envlist = py{27}-django{111}-wagtail{113},lint
[testenv]
commands = coverage run --parallel -m pytest {posargs}
extras = test
deps =
django19: django>=1.9,<1.10
wagtail19: wagtail>=1.9,<1.10
wagtail110: wagtail>=1.10,<1.11
django111: django>=1.11,<1.12
wagtail19: wagtail>=1.13,<1.14
[testenv:coverage-report]
basepython = python2.7
@ -21,7 +20,7 @@ commands =
[testenv:lint]
basepython = python2.7
deps = flake8
deps = flake8==3.5.0
commands =
flake8 src tests setup.py
isort -q --recursive --diff src/ tests/