diff --git a/analytical/templatetags/chartbeat.py b/analytical/templatetags/chartbeat.py
index a49e7c2..70f49c4 100644
--- a/analytical/templatetags/chartbeat.py
+++ b/analytical/templatetags/chartbeat.py
@@ -19,24 +19,24 @@ from analytical.utils import is_internal_ip, disable_html, validate_setting, \
USER_ID_RE = re.compile(r'^\d{5}$')
INIT_CODE = """"""
SETUP_CODE = """
-
+
"""
DOMAIN_CONTEXT_KEY = 'chartbeat_domain'
diff --git a/analytical/templatetags/hubspot.py b/analytical/templatetags/hubspot.py
index d958c2b..4e3b39a 100644
--- a/analytical/templatetags/hubspot.py
+++ b/analytical/templatetags/hubspot.py
@@ -16,10 +16,10 @@ PORTAL_ID_RE = re.compile(r'^\d+$')
DOMAIN_RE = re.compile(r'^[\w.-]+$')
TRACKING_CODE = """
"""
@@ -52,7 +52,7 @@ class HubSpotNode(Node):
html = TRACKING_CODE % {'portal_id': self.portal_id,
'domain': self.domain}
if is_internal_ip(context, 'HUBSPOT'):
- html = disable_html(html, self.name)
+ html = disable_html(html, 'HubSpot')
return html
diff --git a/analytical/templatetags/optimizely.py b/analytical/templatetags/optimizely.py
index 99e7323..4823ebd 100644
--- a/analytical/templatetags/optimizely.py
+++ b/analytical/templatetags/optimizely.py
@@ -42,7 +42,7 @@ class OptimizelyNode(Node):
def render(self, context):
html = SETUP_CODE % {'account_number': self.account_number}
if is_internal_ip(context, 'OPTIMIZELY'):
- html = disable_html(html, self.name)
+ html = disable_html(html, 'Optimizely')
return html
diff --git a/analytical/tests/test_tag_chartbeat.py b/analytical/tests/test_tag_chartbeat.py
index fa3bbbd..8bf4237 100644
--- a/analytical/tests/test_tag_chartbeat.py
+++ b/analytical/tests/test_tag_chartbeat.py
@@ -6,6 +6,7 @@ import re
from django.conf import settings
from django.contrib.sites.models import Site
+from django.http import HttpRequest
from django.template import Context
from analytical.templatetags.chartbeat import ChartbeatTopNode, \
@@ -77,3 +78,13 @@ class ChartbeatTagTestCase(TagTestCase):
'var _sf_async_config={.*"uid": "12345".*};', r), r)
self.assertTrue(re.search(
'var _sf_async_config={.*"domain": "test.com".*};', r), r)
+
+ def test_render_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ r = ChartbeatBottomNode().render(context)
+ self.assertTrue(r.startswith(
+ ''), r)
diff --git a/analytical/tests/test_tag_clicky.py b/analytical/tests/test_tag_clicky.py
index 2130dbb..ccc386b 100644
--- a/analytical/tests/test_tag_clicky.py
+++ b/analytical/tests/test_tag_clicky.py
@@ -5,6 +5,7 @@ Tests for the Clicky template tags and filters.
import re
from django.contrib.auth.models import User
+from django.http import HttpRequest
from django.template import Context
from analytical.templatetags.clicky import ClickyNode
@@ -55,3 +56,13 @@ class ClickyTagTestCase(TagTestCase):
'clicky_var2': 'val2'}))
self.assertTrue(re.search('var clicky_custom = {.*'
'"var1": "val1", "var2": "val2".*};', r), r)
+
+ def test_render_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ r = ClickyNode().render(context)
+ self.assertTrue(r.startswith(
+ ''), r)
diff --git a/analytical/tests/test_tag_crazy_egg.py b/analytical/tests/test_tag_crazy_egg.py
index 755d2e2..b7c53f8 100644
--- a/analytical/tests/test_tag_crazy_egg.py
+++ b/analytical/tests/test_tag_crazy_egg.py
@@ -2,6 +2,7 @@
Tests for the Crazy Egg template tags and filters.
"""
+from django.http import HttpRequest
from django.template import Context
from analytical.templatetags.crazy_egg import CrazyEggNode
@@ -41,3 +42,13 @@ class CrazyEggTagTestCase(TagTestCase):
r = CrazyEggNode().render(context)
self.assertTrue("CE2.set(1, 'foo');" in r, r)
self.assertTrue("CE2.set(2, 'bar');" in r, r)
+
+ def test_render_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ r = CrazyEggNode().render(context)
+ self.assertTrue(r.startswith(
+ ''), r)
diff --git a/analytical/tests/test_tag_google_analytics.py b/analytical/tests/test_tag_google_analytics.py
index 119d441..1165f23 100644
--- a/analytical/tests/test_tag_google_analytics.py
+++ b/analytical/tests/test_tag_google_analytics.py
@@ -2,6 +2,7 @@
Tests for the Google Analytics template tags and filters.
"""
+from django.http import HttpRequest
from django.template import Context
from analytical.templatetags.google_analytics import GoogleAnalyticsNode
@@ -44,3 +45,13 @@ class GoogleAnalyticsTagTestCase(TagTestCase):
in r, r)
self.assertTrue("_gaq.push(['_setCustomVar', 5, 'test2', 'bar', 1]);"
in r, r)
+
+ def test_render_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ r = GoogleAnalyticsNode().render(context)
+ self.assertTrue(r.startswith(
+ ''), r)
diff --git a/analytical/tests/test_tag_hubspot.py b/analytical/tests/test_tag_hubspot.py
index 9d2374e..2db461a 100644
--- a/analytical/tests/test_tag_hubspot.py
+++ b/analytical/tests/test_tag_hubspot.py
@@ -2,6 +2,7 @@
Tests for the HubSpot template tags and filters.
"""
+from django.http import HttpRequest
from django.template import Context
from analytical.templatetags.hubspot import HubSpotNode
@@ -44,3 +45,13 @@ class HubSpotTagTestCase(TagTestCase):
def test_wrong_domain(self):
self.settings_manager.set(HUBSPOT_DOMAIN='wrong domain')
self.assertRaises(AnalyticalException, HubSpotNode)
+
+ def test_render_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ r = HubSpotNode().render(context)
+ self.assertTrue(r.startswith(
+ ''), r)
diff --git a/analytical/tests/test_tag_kiss_metrics.py b/analytical/tests/test_tag_kiss_metrics.py
index 5f9ed16..2c6d3a6 100644
--- a/analytical/tests/test_tag_kiss_metrics.py
+++ b/analytical/tests/test_tag_kiss_metrics.py
@@ -3,6 +3,7 @@ Tests for the KISSmetrics tags and filters.
"""
from django.contrib.auth.models import User
+from django.http import HttpRequest
from django.template import Context
from analytical.templatetags.kiss_metrics import KissMetricsNode
@@ -52,3 +53,13 @@ class KissMetricsTagTestCase(TagTestCase):
('test_event', {'prop1': 'val1', 'prop2': 'val2'})}))
self.assertTrue("_kmq.push(['record', 'test_event', "
'{"prop1": "val1", "prop2": "val2"}]);' in r, r)
+
+ def test_render_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ r = KissMetricsNode().render(context)
+ self.assertTrue(r.startswith(
+ ''), r)
diff --git a/analytical/tests/test_tag_mixpanel.py b/analytical/tests/test_tag_mixpanel.py
index 40d3fb2..a7c1f30 100644
--- a/analytical/tests/test_tag_mixpanel.py
+++ b/analytical/tests/test_tag_mixpanel.py
@@ -3,6 +3,7 @@ Tests for the Mixpanel tags and filters.
"""
from django.contrib.auth.models import User
+from django.http import HttpRequest
from django.template import Context
from analytical.templatetags.mixpanel import MixpanelNode
@@ -55,3 +56,13 @@ class MixpanelTagTestCase(TagTestCase):
('test_event', {'prop1': 'val1', 'prop2': 'val2'})}))
self.assertTrue("mpq.push(['track', 'test_event', "
'{"prop1": "val1", "prop2": "val2"}]);' in r, r)
+
+ def test_render_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ r = MixpanelNode().render(context)
+ self.assertTrue(r.startswith(
+ ''), r)
diff --git a/analytical/tests/test_tag_optimizely.py b/analytical/tests/test_tag_optimizely.py
index 34742bf..073a490 100644
--- a/analytical/tests/test_tag_optimizely.py
+++ b/analytical/tests/test_tag_optimizely.py
@@ -2,6 +2,7 @@
Tests for the Optimizely template tags and filters.
"""
+from django.http import HttpRequest
from django.template import Context
from analytical.templatetags.optimizely import OptimizelyNode
@@ -37,3 +38,13 @@ class OptimizelyTagTestCase(TagTestCase):
self.assertRaises(AnalyticalException, OptimizelyNode)
self.settings_manager.set(OPTIMIZELY_ACCOUNT_NUMBER='12345678')
self.assertRaises(AnalyticalException, OptimizelyNode)
+
+ def test_render_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ r = OptimizelyNode().render(context)
+ self.assertTrue(r.startswith(
+ ''), r)
diff --git a/analytical/tests/test_utils.py b/analytical/tests/test_utils.py
index d5d72ac..909cb9c 100644
--- a/analytical/tests/test_utils.py
+++ b/analytical/tests/test_utils.py
@@ -1,3 +1,51 @@
"""
Tests for the analytical.utils module.
"""
+
+from django.http import HttpRequest
+from django.template import Context
+
+from analytical.utils import is_internal_ip
+from analytical.tests.utils import TestCase
+
+
+class InternalIpTestCase(TestCase):
+ def test_render_no_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ context = Context()
+ self.assertFalse(is_internal_ip(context))
+
+ def test_render_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ self.assertTrue(is_internal_ip(context))
+
+ def test_render_prefix_internal_ip(self):
+ self.settings_manager.set(TEST_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ self.assertTrue(is_internal_ip(context, 'TEST'))
+
+ def test_render_internal_ip_fallback(self):
+ self.settings_manager.set(INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '1.1.1.1'
+ context = Context({'request': req})
+ self.assertTrue(is_internal_ip(context))
+
+ def test_render_internal_ip_forwarded_for(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['HTTP_X_FORWARDED_FOR'] = '1.1.1.1'
+ context = Context({'request': req})
+ self.assertTrue(is_internal_ip(context))
+
+ def test_render_different_internal_ip(self):
+ self.settings_manager.set(ANALYTICAL_INTERNAL_IPS=['1.1.1.1'])
+ req = HttpRequest()
+ req.META['REMOTE_ADDR'] = '2.2.2.2'
+ context = Context({'request': req})
+ self.assertFalse(is_internal_ip(context))
diff --git a/analytical/tests/utils.py b/analytical/tests/utils.py
index e52093e..0304145 100644
--- a/analytical/tests/utils.py
+++ b/analytical/tests/utils.py
@@ -7,7 +7,7 @@ from django.core.management import call_command
from django.db.models import loading
from django.template import Template, Context, RequestContext
from django.test.simple import run_tests as django_run_tests
-from django.test.testcases import TestCase
+from django.test.testcases import TestCase as DjangoTestCase
def run_tests(labels=()):
@@ -17,9 +17,9 @@ def run_tests(labels=()):
django_run_tests(labels, verbosity=1, interactive=True)
-class TagTestCase(TestCase):
+class TestCase(DjangoTestCase):
"""
- Tests for a template tag.
+ Base test case for the django-analytical tests.
Includes the settings manager.
"""
@@ -30,6 +30,14 @@ class TagTestCase(TestCase):
def tearDown(self):
self.settings_manager.revert()
+
+class TagTestCase(TestCase):
+ """
+ Tests for a template tag.
+
+ Includes the settings manager.
+ """
+
def render_tag(self, library, tag, vars=None, request=None):
if vars is None:
vars = {}
diff --git a/analytical/utils.py b/analytical/utils.py
index 9e85a65..2fe5456 100644
--- a/analytical/utils.py
+++ b/analytical/utils.py
@@ -6,7 +6,8 @@ from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
-HTML_COMMENT = ""
+HTML_COMMENT = ""
def validate_setting(setting, value_re, invalid_msg):
@@ -57,7 +58,9 @@ def is_internal_ip(context, prefix=None):
request = context['request']
remote_ip = request.META.get('HTTP_X_FORWARDED_FOR', '')
if not remote_ip:
- remote_ip = request.META.get('HTTP_X_FORWARDED_FOR', '')
+ remote_ip = request.META.get('REMOTE_ADDR', '')
+ if not remote_ip:
+ return False
internal_ips = ''
if prefix is not None:
@@ -72,7 +75,7 @@ def is_internal_ip(context, prefix=None):
return False
-def disable_html(self, html, service):
+def disable_html(html, service):
return HTML_COMMENT % locals()