Installation

Prerequisites

Make sure you have installed:

  • Python 2.6.x or 2.7.x
  • A RDBMS of your choice (PostgreSQL, MySQL, SQLite or Oracle)
  • libjpeg8-dev zlib1g-dev (for Image handling via Pillow)

Note

Be prepared that we might abandon all other databases but PostgreSQL in one of the next releases.

Installation

The installation is straightforward and should last just a few minutes. Please execute following steps:

  1. Preferably create a virtualenv and activate it, e.g.:

    $ virtualenv lfs_env
    
  2. Install django-lfs:

    $ pip install django-lfs
    
  3. If you not have an existing one, create a new project:

    $ django-admin startproject <your-projectname>
    
  4. Add the following urls to your project’s urls.py file:

    import django.views.static
    from django.conf import settings
    from django.conf.urls import include
    
    url(r'', include('lfs.core.urls')),
    url(r'^manage/', include('lfs.manage.urls')),
    url(r'^reviews/', include('reviews.urls')),
    url(r'^media/(?P<path>.*)$', django.views.static.serve, {'document_root': settings.MEDIA_ROOT}),
    
  5. Add the following settings to your project’s settings.py file:

    # Django
    from django.utils.translation import ugettext_lazy as _
    
    INSTALLED_APPS = [
        'lfs_theme',
        ...
        'django.contrib.redirects',
        'django.contrib.sites',
        'compressor',
        'lfs.addresses',
        'lfs.caching',
        'lfs.cart',
        'lfs.catalog',
        'lfs.checkout',
        'lfs.core',
        'lfs.criteria',
        'lfs.customer',
        'lfs.customer_tax',
        'lfs.discounts',
        'lfs.export',
        'lfs.gross_price',
        'lfs.mail',
        'lfs.manage',
        'lfs.marketing',
        'lfs.manufacturer',
        'lfs.net_price',
        'lfs.order',
        'lfs.page',
        'lfs.payment',
        'lfs.portlet',
        'lfs.search',
        'lfs.shipping',
        'lfs.supplier',
        'lfs.tax',
        'lfs.tests',
        'lfs.utils',
        'lfs.voucher',
        'lfs_contact',
        'lfs_order_numbers',
        'lfs_paypal',
        'localflavor',
        'paypal.standard.ipn',
        'portlets',
        'postal',
        'reviews',
    ]
    
    AUTHENTICATION_BACKENDS = (
        'lfs.customer.auth.EmailBackend',
        'django.contrib.auth.backends.ModelBackend',
    )
    
    MEDIA_URL = '/media/'
    MEDIA_ROOT = BASE_DIR + '/media'
    
    SESSION_SERIALIZER = "django.contrib.sessions.serializers.PickleSerializer"
    
    SITE_ID = 1
    
    STATICFILES_FINDERS = (
        'django.contrib.staticfiles.finders.AppDirectoriesFinder',
        'compressor.finders.CompressorFinder',
    )
    
    STATIC_URL = '/static/'
    STATIC_ROOT = BASE_DIR + "/sitestatic"
    
    # Please note that ``lfs.core.context_processors.main`` has been added
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                    'lfs.core.context_processors.main',
                ],
            },
        },
    ]
    
    # LFS
    # see http://docs.getlfs.com/en/latest/developer/settings.html for more
    LFS_AFTER_ADD_TO_CART = "lfs_added_to_cart"
    LFS_RECENT_PRODUCTS_LIMIT = 5
    
    LFS_CRITERIA = [
        ["lfs.criteria.models.CartPriceCriterion", _(u"Cart Price")],
        ["lfs.criteria.models.CombinedLengthAndGirthCriterion", _(u"Combined Length and Girth")],
        ["lfs.criteria.models.CountryCriterion", _(u"Country")],
        ["lfs.criteria.models.HeightCriterion", _(u"Height")],
        ["lfs.criteria.models.LengthCriterion", _(u"Length")],
        ["lfs.criteria.models.WidthCriterion", _(u"Width")],
        ["lfs.criteria.models.WeightCriterion", _(u"Weight")],
        ["lfs.criteria.models.ShippingMethodCriterion", _(u"Shipping Method")],
        ["lfs.criteria.models.PaymentMethodCriterion", _(u"Payment Method")],
    ]
    
    LFS_ORDER_NUMBER_GENERATOR = "lfs_order_numbers.models.OrderNumberGenerator"
    LFS_DOCS = "http://docs.getlfs.com/en/latest/"
    
    LFS_INVOICE_COMPANY_NAME_REQUIRED = False
    LFS_INVOICE_EMAIL_REQUIRED = True
    LFS_INVOICE_PHONE_REQUIRED = True
    
    LFS_SHIPPING_COMPANY_NAME_REQUIRED = False
    LFS_SHIPPING_EMAIL_REQUIRED = False
    LFS_SHIPPING_PHONE_REQUIRED = False
    
    LFS_PAYMENT_METHOD_PROCESSORS = [
        ["lfs_paypal.processor.PayPalProcessor", _(u"PayPal")],
    ]
    
    LFS_PRICE_CALCULATORS = [
        ['lfs.gross_price.calculator.GrossPriceCalculator', _(u'Price includes tax')],
        ['lfs.net_price.calculator.NetPriceCalculator', _(u'Price excludes tax')],
    ]
    
    LFS_SHIPPING_METHOD_PRICE_CALCULATORS = [
        ["lfs.shipping.calculator.GrossShippingMethodPriceCalculator", _(u'Price includes tax')],
        ["lfs.shipping.calculator.NetShippingMethodPriceCalculator", _(u'Price excludes tax')],
    ]
    
    LFS_UNITS = [
        _(u"l"),
        _(u"m"),
        _(u"cm"),
        _(u"lfm"),
        _(u"Package(s)"),
        _(u"Piece(s)"),
    ]
    LFS_PRICE_UNITS = LFS_BASE_PRICE_UNITS = LFS_PACKING_UNITS = LFS_UNITS
    
    # Paypal
    LFS_PAYPAL_REDIRECT = True
    PAYPAL_RECEIVER_EMAIL = "info@yourbusiness.com"
    PAYPAL_IDENTITY_TOKEN = "set_this_to_your_paypal_pdt_identity_token"
    
    # Reviews
    # see http://django-reviews.readthedocs.io/en/latest/#settings for more
    REVIEWS_SHOW_PREVIEW = False
    REVIEWS_IS_NAME_REQUIRED = False
    REVIEWS_IS_EMAIL_REQUIRED = False
    REVIEWS_IS_MODERATED = False
    

Optionally you might add:

# Django
# see https://docs.djangoproject.com/en/1.10/topics/cache/ for more.
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    },
}

# Compressor
# see http://django-compressor.readthedocs.io/en/latest/settings/ for more
COMPRESS_CSS_FILTERS = [
    'compressor.filters.css_default.CssAbsoluteFilter',
    'compressor.filters.cssmin.CSSCompressorFilter',
]
COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True
  1. $ python manage.py migrate
  2. $ python manage.py lfs_init
  3. $ python manage.py runserver
  4. Browse to http://localhost:8000

Note

If you encounter problems, please see trouble shooting.

Note

If you’re setting up a production environment then you should not use Django’s builtin development server (bin/django runserver). Instead, you’ll probably want to use uWsgi or Gunicorn servers. Check Django (and uWsgi/Gunicorn) documentation for details.

Note

For production environments you’re supposed to change robots.txt file (otherwise bots/crawlers like google bot will not be allowed to scan your site, which is not what you probably want). Default version of robots.txt is located at lfs_theme application: templates/lfs/shop/robots.txt. You should create your own ‘mytheme’ app with structure like: templates/lfs/shop/robots.txt and place it in settings.INSTALLED_APPS before(!) ‘lfs_theme’. Also note, that in production environment it is good to serve robots.txt directly from HTTP server like nginx or Apache.

Migration from version 0.9 to version 0.10 and higher

Migration starting from 0.10 is based on Django’s default migrations, see: https://docs.djangoproject.com/en/1.8/topics/migrations/

  1. Install the new LFS version
  2. Backup your existing database
  3. Enter your existing database to lfs_project/settings.py
  4. $ bin/django migrate

Migration from versions 0.5 - 0.8 to version 0.10

Migrations from 0.5 - 0.8 to version 0.10 needs an intermediate step through version 0.9.

Migration from versions 0.5 - 0.8 to version 0.9

Migration from versions 0.5 - 0.8 to version 0.9 can be done with a migration command (lfs_migrate) which migrates existing databases up to version 0.9.

  1. Install the 0.9
  2. Backup your existing database
  3. Enter your existing database to lfs_project/settings.py
  4. $ bin/django syncdb
  5. $ bin/django lfs_migrate

What’s next?

Move on to Getting Started.