Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Minimum viable product

  • Loading branch information...
commit 65a0b60a1997e2f1b949b7eecf9d2bc20fd96f42 0 parents
@codeinthehole codeinthehole authored
2  MANIFEST.in
@@ -0,0 +1,2 @@
+include *.rst
+recursive-include paypal/express/templates/paypal *.txt *.html
30 README.rst
@@ -0,0 +1,30 @@
+============================
+Jirafe integration for Oscar
+============================
+
+This is an extension for `django-oscar`_ that makes integration with the
+`Jirafe`_ e-commerce tracking easy.
+
+.. _`django-oscar`: http://oscarcommerce.com
+.. _`Jirafe`: http://jirafe.com/
+
+Installation
+------------
+
+Install from Github (not on PyPi yet)::
+
+ pip install git+git://github.com/tangentlabs/django-oscar-jirafe.git#egg=django-oscar-jirafe
+
+Now add ``jirafe`` to your ``INSTALLED_APPS`` and update your
+``TEMPLATE_CONTEXT_PROCESSORS`` to include ``jirafe.context_processors.jirafe``.
+Also, set ``JIRAFE_ID`` to be your Jirafe ID.
+
+Finally, you need to include the tracking javascript in your templates. You can
+do this by including::
+
+ {% include 'jirafe/tracking.html' %}
+
+within your ``base.html`` template. An example ``base.html`` is included which
+you can copy into place to get you started.
+
+That's it - the stats should start appearing in your Jirafe dashboard.
0  jirafe/__init__.py
No changes.
10 jirafe/context_processors.py
@@ -0,0 +1,10 @@
+from django.conf import settings
+
+
+def jirafe(request):
+ """
+ Add variables to indicate when to submit variables to Jirafe
+ """
+ return {
+ 'JIRAFE_ID': settings.JIRAFE_ID
+ }
0  jirafe/models.py
No changes.
6 jirafe/templates/base.html
@@ -0,0 +1,6 @@
+{% extends 'templates/base.html' %}
+
+{% block extrascripts %}
+ {{ block.super }}
+ {% include 'jirafe/tracking.html' %}
+{% endblock %}
64 jirafe/templates/jirafe/tracking.html
@@ -0,0 +1,64 @@
+<script type="text/javascript">
+ var jirafe = { "id": {{ JIRAFE_ID }}};
+
+ {% if product %}
+ jirafe.product = {
+ "sku": "{{ product.stockrecord.partner_sku|escapejs }}",
+ "name": "{{ product.get_title|escapejs }}",
+ "price": "{{ product.stockrecord.price_incl_tax }}",
+ "categories": [{% for category in product.categories.all %}"{{ category.name|escapejs }}",{% endfor %}]
@szuliq
szuliq added a note

Are you sure last semicolon won't blow up IE?

@codeinthehole Owner

Good spot.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ };
+ {% endif %}
+
+ {% if category %}
+ jirafe.category = {
+ "name": "{{ category.name|escapejs }}"
+ };
+ {% endif %}
+
+ {# Using voucher_form as a proxy for when we're on the basket page #}
+ {% if voucher_form %}
+ jirafe.cart = {
+ "total": "{{ basket.total_incl_tax }}",
+ "products": [
+ {% for line in basket.lines.all %}
+ {
+ "sku": "{{ line.product.stockrecord.partner_sku|escapejs }}",
+ "name": "{{ line.product.get_title|escapejs }}",
+ "qty": "{{ line.quantity }}",
+ "price": "{{ line.product.stockrecord.price_incl_tax }}",
+ "category": ""
+ },
+ {% endfor %}
+ ]
+ };
+ {% endif %}
+
+ {% if order %}
+ jirafe.confirm = {
+ "orderid": "{{ order.number|escapejs }}",
+ "total": "{{ order.total_incl_tax }}",
+ "shipping": "{{ order.shipping_incl_tax }}",
+ "tax": "{{ order.total_tax }}",
+ "discount": "0.00",
+ "subtotal": "{{ order.basket_total_incl_tax }}",
+ "products": [
+ {% for line in order.lines.all %}
+ {
+ "sku": "{{ line.product.stockrecord.partner_sku|escapejs }}",
+ "name": "{{ line.product.get_title|escapejs }}",
+ "qty": "{{ line.quantity }}",
+ "price": "{{ line.product.stockrecord.price_incl_tax }}",
+ "category": ""
+ },
+ {% endfor %}
+ ]
+ };
+ {% endif %}
+
+ (function(){
+ var d=document,g=d.createElement('script'),s=d.getElementsByTagName('script')[0];
+ g.type='text/javascript';g.defer=g.async=true;g.src=d.location.protocol+'//c.jirafe.com/jirafe.js';
+ s.parentNode.insertBefore(g, s);
+ })();
+</script>
10 sandbox/manage.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
+
+ from django.core.management import execute_from_command_line
+
+ execute_from_command_line(sys.argv)
216 sandbox/settings.py
@@ -0,0 +1,216 @@
+import os
+
+# Django settings for oscar project.
+PROJECT_DIR = os.path.dirname(__file__)
+location = lambda x: os.path.join(os.path.dirname(os.path.realpath(__file__)), x)
+
+DEBUG = True
+TEMPLATE_DEBUG = True
+SQL_DEBUG = True
+
+ADMINS = (
+ # ('Your Name', 'your_email@domain.com'),
+)
+EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
+
+MANAGERS = ADMINS
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+ 'NAME': 'db.sqlite', # Or path to database file if using sqlite3.
+ 'USER': '', # Not used with sqlite3.
+ 'PASSWORD': '', # Not used with sqlite3.
+ 'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
+ 'PORT': '', # Set to empty string for default. Not used with sqlite3.
+ }
+}
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# On Unix systems, a value of None will cause Django to use the same
+# timezone as the operating system.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'Europe/London'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+# If you set this to False, Django will not format dates, numbers and
+# calendars according to the current locale
+USE_L10N = True
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = location("assets")
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = '/media/'
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+#ADMIN_MEDIA_PREFIX = '/media/admin/'
+
+STATIC_URL = '/static/'
+STATICFILES_DIRS = (location('static/'),)
+STATIC_ROOT = location('public')
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = '$)a7n&o80u!6y5t-+jrd3)3!%vh&shg$wqpjpxc!ar&p#!)n1a'
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+ 'django.template.loaders.filesystem.Loader',
+ 'django.template.loaders.app_directories.Loader',
+# 'django.template.loaders.eggs.Loader',
+)
+
+TEMPLATE_CONTEXT_PROCESSORS = (
+ "django.contrib.auth.context_processors.auth",
+ "django.core.context_processors.request",
+ "django.core.context_processors.debug",
+ "django.core.context_processors.i18n",
+ "django.core.context_processors.media",
+ "django.core.context_processors.static",
+ "django.contrib.messages.context_processors.messages",
+ # Oscar specific
+ 'oscar.apps.search.context_processors.search_form',
+ 'oscar.apps.promotions.context_processors.promotions',
+ 'oscar.apps.checkout.context_processors.checkout',
+ 'oscar.core.context_processors.metadata',
+ 'jirafe.context_processors.jirafe',
+)
+
+MIDDLEWARE_CLASSES = (
+ 'django.middleware.common.CommonMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.middleware.transaction.TransactionMiddleware',
+ 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
+ 'debug_toolbar.middleware.DebugToolbarMiddleware',
+ 'oscar.apps.basket.middleware.BasketMiddleware',
+)
+
+INTERNAL_IPS = ('127.0.0.1',)
+
+ROOT_URLCONF = 'urls'
+
+from oscar import OSCAR_PARENT_TEMPLATE_DIR
+TEMPLATE_DIRS = (
+ location('templates'),
+ os.path.join(OSCAR_PARENT_TEMPLATE_DIR, 'templates'),
+ OSCAR_PARENT_TEMPLATE_DIR,
+)
+
+# A sample logging configuration. The only tangible logging
+# performed by this configuration is to send an email to
+# the site admins on every HTTP 500 error.
+# See http://docs.djangoproject.com/en/dev/topics/logging for
+# more details on how to customize your logging configuration.
+LOGGING = {
+ 'version': 1,
+ 'disable_existing_loggers': False,
+ 'formatters': {
+ 'verbose': {
+ 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
+ },
+ 'simple': {
+ 'format': '%(levelname)s %(message)s'
+ },
+ },
+ 'handlers': {
+ 'null': {
+ 'level':'DEBUG',
+ 'class':'django.utils.log.NullHandler',
+ },
+ 'console':{
+ 'level':'DEBUG',
+ 'class':'logging.StreamHandler',
+ 'formatter': 'verbose'
+ },
+ 'mail_admins': {
+ 'level': 'ERROR',
+ 'class': 'django.utils.log.AdminEmailHandler',
+ },
+ },
+ 'loggers': {
+ 'django': {
+ 'handlers':['null'],
+ 'propagate': True,
+ 'level':'INFO',
+ },
+ 'django.request': {
+ 'handlers': ['mail_admins'],
+ 'level': 'ERROR',
+ 'propagate': False,
+ },
+ 'oscar.checkout': {
+ 'handlers': ['console'],
+ 'propagate': True,
+ 'level':'INFO',
+ },
+ 'django.db.backends': {
+ 'handlers':['null'],
+ 'propagate': False,
+ 'level':'DEBUG',
+ },
+ }
+}
+
+
+INSTALLED_APPS = [
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.sites',
+ 'django.contrib.messages',
+ 'django.contrib.admin',
+ 'django.contrib.flatpages',
+ 'django.contrib.staticfiles',
+ # External apps
+ 'django_extensions',
+ 'debug_toolbar',
+ 'haystack',
+ 'sorl.thumbnail',
+ 'south',
+ 'jirafe',
+]
+
+from oscar import get_core_apps
+INSTALLED_APPS += get_core_apps()
+
+AUTHENTICATION_BACKENDS = (
+ 'oscar.apps.customer.auth_backends.Emailbackend',
+ 'django.contrib.auth.backends.ModelBackend',
+)
+
+LOGIN_REDIRECT_URL = '/accounts/'
+APPEND_SLASH = True
+
+DEBUG_TOOLBAR_CONFIG = {
+ 'INTERCEPT_REDIRECTS': False
+}
+
+# Oscar settings
+from oscar.defaults import *
+OSCAR_ALLOW_ANON_CHECKOUT = True
+
+# Haystack settings
+HAYSTACK_SITECONF = 'oscar.search_sites'
+HAYSTACK_SEARCH_ENGINE = 'dummy'
+
+JIRAFE_ID = '40854'
6 sandbox/templates/base.html
@@ -0,0 +1,6 @@
+{% extends 'templates/base.html' %}
+
+{% block extrascripts %}
+ {{ block.super }}
+ {% include 'jirafe/tracking.html' %}
+{% endblock %}
22 sandbox/urls.py
@@ -0,0 +1,22 @@
+from django.conf.urls.defaults import *
+from django.conf import settings
+from django.contrib import admin
+from django.contrib.staticfiles.urls import staticfiles_urlpatterns
+from django.conf.urls.static import static
+from django.views.generic import TemplateView
+
+from oscar.app import shop
+
+admin.autodiscover()
+
+urlpatterns = patterns('',
+ (r'^admin/', include(admin.site.urls)),
+ (r'', include(shop.urls)),
+)
+if settings.DEBUG:
+ urlpatterns += staticfiles_urlpatterns()
+ urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+ urlpatterns += patterns('',
+ url(r'^404$', TemplateView.as_view(template_name='404.html')),
+ url(r'^500$', TemplateView.as_view(template_name='500.html')),
+ )
23 setup.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+from setuptools import setup, find_packages
+
+setup(name='django-oscar-jirafe',
+ version='0.1',
+ url='https://github.com/tangentlabs/django-oscar-jirafe',
+ author="David Winterbottom",
+ author_email="david.winterbottom@tangentlabs.co.uk",
+ description="Jirafe module for django-oscar",
+ long_description=open('README.rst').read(),
+ keywords="Payment, Jirafe",
+ license='BSD',
+ packages=find_packages(),
+ include_package_data = True,
+ # See http://pypi.python.org/pypi?%3Aaction=list_classifiers
+ classifiers=['Environment :: Web Environment',
+ 'Framework :: Django',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: BSD License',
+ 'Operating System :: Unix',
+ 'Programming Language :: Python'],
+ install_requires=['django-oscar>=0.2']
+ )
@szuliq

Are you sure last semicolon won't blow up IE?

Please sign in to comment.
Something went wrong with that request. Please try again.