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
David Winterbottom 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 %}]
Krzysztof Szularz
szuliq added a note

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

David Winterbottom 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']
+ )
Krzysztof Szularz

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

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