def mp_track_event(request, event_name, properties=None, **kwargs): import re from mixpanel.tasks import EventTracker if not settings.MIXPANEL_ENABLED: return if properties == None: properties = {} if 'distinct_id' not in properties: properties['distinct_id'] = request.COOKIES.get('mpDistinctID', None) properties['campaign'] = request.COOKIES.get('campaign', 'None') if hasattr(settings, 'ANALYTICS_EXCLUSION_TOKEN'): utmv = request.COOKIES.get('__utmv', None) pattern = re.compile(".*?" + settings.ANALYTICS_EXCLUSION_TOKEN + "*") if utmv and pattern.match(utmv): return try: et = EventTracker() args = (event_name, properties) et.delay(*args, **kwargs) except Exception, err: pass
def test_run_priority_true(self): mp_settings.MIXPANEL_TEST_PRIORITY = False result = EventTracker().run('event_foo', test=True) self.assertTrue(result) query = self.get_querystring_dict() assert 'test' in query self.assertEqual(query['test'], '1')
def test_failed_request(self): mp_settings.MIXPANEL_TRACKING_ENDPOINT = 'brokenurl' et = EventTracker() self.assertRaises(RetryTaskError, et.run, 'event_foo', throw_retry_error=True)
def test_old_run(self): """non-recorded events should return False""" et = EventTracker() # Times older than 3 hours don't get recorded according to: http://mixpanel.com/api/docs/specification # equests will be rejected that are 3 hours older than present time result = et.run('event_foo', {'time': 1245613885}) self.assertFalse(result)
def test_handle_properties_given(self): et = EventTracker() properties = et._handle_properties({'token': 'bar'}, None) self.assertEqual('bar', properties['token']) properties = et._handle_properties({'token': 'bar'}, 'foo') self.assertEqual('bar', properties['token'])
def test_failed_socket_request(self): mp_settings.MIXPANEL_API_SERVER = '127.0.0.1:60000' et = EventTracker() self.assertRaises(RetryTaskError, et.run, 'event_foo', throw_retry_error=True)
def test_run_properties_empty(self): result = EventTracker().run('event_foo', {}) self.assertTrue(result) self.assertParams({ 'event': 'event_foo', 'properties': { 'token': 'testtesttest' } })
def test_run_token(self): result = EventTracker().run('event_foo', token='xxx') self.assertTrue(result) self.assertParams({ 'event': 'event_foo', 'properties': { 'token': 'xxx' } })
def test_disable(self): et = EventTracker() mp_settings.MIXPANEL_DISABLE = True def _fake_get_connection(): assert False, "Should bail out before trying to get a connection." et._get_connection = _fake_get_connection et('foo')
def test_run_properties_foo(self): result = EventTracker().run('event_foo', {'foo': 'bar'}) self.assertTrue(result) self.assertParams({ 'event': 'event_foo', 'properties': { 'token': 'testtesttest', 'foo': 'bar', } })
def test_is_test(self): et = EventTracker() self.assertEqual(et._is_test(None), 1) self.assertEqual(et._is_test(False), 0) self.assertEqual(et._is_test(True), 1) mp_settings.MIXPANEL_TEST_ONLY = False self.assertEqual(et._is_test(None), 0) self.assertEqual(et._is_test(False), 0) self.assertEqual(et._is_test(True), 1)
def test_non_recorded(self): """non-recorded events should return False""" self.response.read.return_value = '0' et = EventTracker() # Times older than 3 hours don't get recorded according to: # http://mixpanel.com/api/docs/specification # requests will be rejected that are 3 hours older than present time # (though actually this is returnin False because of mocking network) result = et.run('event_foo', {'time': 1245613885}) self.assertFalse(result)
def test_build_params(self): et = EventTracker() event = 'foo_event' is_test = 1 properties = {'token': 'testtoken'} params = {'event': event, 'properties': properties} url_params = et._build_params(event, properties, is_test) expected_params = urllib.urlencode({ 'data': base64.b64encode(simplejson.dumps(params)), 'test': is_test, }) self.assertEqual(expected_params, url_params)
def test_build_and_encode_params(self): et = EventTracker() event = 'foo_event' test = True properties = {'token': 'testtoken'} params = {'event': event, 'properties': properties} params = et._build_params(event, properties) url_params = et._encode_params(params, test) expected_params = urllib.parse.urlencode({ 'data': base64.b64encode(json.dumps(params).encode('utf8')), 'test': '1' }) self.assertEqual(expected_params, url_params)
def test_run(self): # "correct" result obtained from: http://mixpanel.com/api/docs/console et = EventTracker() result = et.run('event_foo', {}) self.assertTrue(result)
def test_debug_logger(self): et = EventTracker() result = et.run('event_foo', {}, loglevel=logging.DEBUG) self.assertTrue(result)
def test_handle_properties_w_token(self): et = EventTracker() properties = et._handle_properties({}, 'foo') self.assertEqual('foo', properties['token'])
def test_handle_properties_empty(self): et = EventTracker() mp_settings.MIXPANEL_API_TOKEN = 'bar' properties = et._handle_properties(None, None) self.assertEqual('bar', properties['token'])
def test_run_priority_default_false(self): mp_settings.MIXPANEL_TEST_PRIORITY = False result = EventTracker().run('event_foo') self.assertTrue(result) query = self.get_querystring_dict() assert 'test' not in query
from guelphapi.api.utils.log import get_data from tastypie.resources import Resource, ModelResource from mixpanel.tasks import EventTracker tracker = EventTracker() track_event = lambda *a, **kw: tracker.run(*a, **kw) class LoggingResource(Resource): def dispatch(self, request_type, request, **kwargs): # Let the "real" dispatch do its thing. # This includes checking a throttle, authentication, authorization, etc response = super(LoggingResource, self).dispatch(request_type, request, **kwargs) # Only log "good" requests for now # We know once we're down here, that things are fine data = get_data(request_type, request, kwargs) track_event('request-%s' % request.META.get('REQUEST_METHOD', request_type), data) return response class LoggingModelResource(ModelResource): def dispatch(self, request_type, request, **kwargs): # Let the "real" dispatch do its thing. # This includes checking a throttle, authentication, authorization, etc. response = super(LoggingModelResource, self).dispatch(request_type, request, **kwargs) # Only log "good" requests for now # We know once we're down here, that things are fine data = get_data(request_type, request, kwargs) track_event('request-%s' % request.META.get('REQUEST_METHOD', request_type), data) return response
def __init__(self, tracker=None, tracker_class=EventTracker): if tracker is None: tracker = EventTracker() self.tracker = tracker self.remote_addr = None self.identity = None