Skip to content
This repository was archived by the owner on May 25, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
ba1bb44
New template style
Gomez Jan 11, 2013
af50821
egg moved into src
Gomez Jan 11, 2013
1963559
buildout added
Gomez Jan 11, 2013
6a60afd
First tests add & travis config
Gomez Jan 11, 2013
8dbc18b
added other test
Gomez Jan 11, 2013
afcb256
better travis conf
Gomez Jan 11, 2013
266343f
Content test, TravisImage
Gomez Jan 11, 2013
b0b1d80
Functional test layer added
Gomez Jan 11, 2013
ff67703
Now with robotframework
Gomez Jan 11, 2013
13ca160
With Acceptance tests
Gomez Jan 11, 2013
26b218c
Registration needed tests
Gomez Jan 12, 2013
a4f70e6
First step for no registration with tests
Gomez Jan 12, 2013
802f411
Testing the checkout process
Gomez Jan 12, 2013
300d6f0
Test cleanup
Gomez Jan 12, 2013
587f0c3
Update docs/TODO.txt
Gomez Jan 14, 2013
215d6ea
Update README.rst
Gomez Jan 15, 2013
2ec7f4f
Merge remote-tracking branch 'starzel/master' into noreg_order
Gomez Jun 10, 2013
887f65e
jq is deprecated - replaced with $
Gomez Jul 3, 2013
7474cb6
Different API - plone.batching
Gomez Jul 3, 2013
9fe809a
collective.MockMailHost in src - pypi rls not working
Gomez Jul 3, 2013
82d5c21
Correct src checkout
Gomez Jul 3, 2013
79f25e5
No longer use the deprecated jq alias in JavaScript
skaeser Sep 25, 2013
7005bb5
Fixed AttributeError in related products viewlet and improved viewlet…
skaeser Sep 25, 2013
52cb114
Preparing release 1.0b14
skaeser Sep 25, 2013
bde18c1
Back to development: 1.0b15
skaeser Sep 25, 2013
3729e43
Remove moved js
Gomez Aug 8, 2014
a63eaa5
Small fixes
Gomez Nov 24, 2014
6a07654
Fix differnt mails
Gomez Jul 7, 2015
2ac7432
pdb fu
Gomez Jul 7, 2015
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
language: python
python: "2.7"
branches:
only:
- noreg_order
notifications:
irc: "irc.freenode.org#starzel"
install:
- mkdir -p buildout-cache/eggs
- mkdir -p buildout-cache/downloads
- python bootstrap.py -c travis.cfg
- bin/buildout -N -t 3 -c travis.cfg
before_script:
- "export DISPLAY=:99.0"
- "sh -e /etc/init.d/xvfb start"
script: bin/test
3 changes: 3 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ Introduction

PCommerce (Plone commerce) provides a simple shop system which supports:

.. image:: https://api.travis-ci.org/Gomez/pcommerce.core.png
:target: https://travis-ci.org/Gomez/pcommerce.core

* product variations
* multiple prices per product to support special prices per user or group
(over the sharing tab) and prices only available for a specific time
Expand Down
260 changes: 260 additions & 0 deletions bootstrap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,260 @@
##############################################################################
#
# Copyright (c) 2006 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Bootstrap a buildout-based project

Simply run this script in a directory containing a buildout.cfg.
The script accepts buildout command-line options, so you can
use the -c option to specify an alternate configuration file.
"""

import os, shutil, sys, tempfile, textwrap, urllib, urllib2, subprocess
from optparse import OptionParser

if sys.platform == 'win32':
def quote(c):
if ' ' in c:
return '"%s"' % c # work around spawn lamosity on windows
else:
return c
else:
quote = str

# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments.
stdout, stderr = subprocess.Popen(
[sys.executable, '-Sc',
'try:\n'
' import ConfigParser\n'
'except ImportError:\n'
' print 1\n'
'else:\n'
' print 0\n'],
stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
has_broken_dash_S = bool(int(stdout.strip()))

# In order to be more robust in the face of system Pythons, we want to
# run without site-packages loaded. This is somewhat tricky, in
# particular because Python 2.6's distutils imports site, so starting
# with the -S flag is not sufficient. However, we'll start with that:
if not has_broken_dash_S and 'site' in sys.modules:
# We will restart with python -S.
args = sys.argv[:]
args[0:0] = [sys.executable, '-S']
args = map(quote, args)
os.execv(sys.executable, args)
# Now we are running with -S. We'll get the clean sys.path, import site
# because distutils will do it later, and then reset the path and clean
# out any namespace packages from site-packages that might have been
# loaded by .pth files.
clean_path = sys.path[:]
import site
sys.path[:] = clean_path
for k, v in sys.modules.items():
if k in ('setuptools', 'pkg_resources') or (
hasattr(v, '__path__') and
len(v.__path__)==1 and
not os.path.exists(os.path.join(v.__path__[0],'__init__.py'))):
# This is a namespace package. Remove it.
sys.modules.pop(k)

is_jython = sys.platform.startswith('java')

setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py'
distribute_source = 'http://python-distribute.org/distribute_setup.py'

# parsing arguments
def normalize_to_url(option, opt_str, value, parser):
if value:
if '://' not in value: # It doesn't smell like a URL.
value = 'file://%s' % (
urllib.pathname2url(
os.path.abspath(os.path.expanduser(value))),)
if opt_str == '--download-base' and not value.endswith('/'):
# Download base needs a trailing slash to make the world happy.
value += '/'
else:
value = None
name = opt_str[2:].replace('-', '_')
setattr(parser.values, name, value)

usage = '''\
[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]

Bootstraps a buildout-based project.

Simply run this script in a directory containing a buildout.cfg, using the
Python that you want bin/buildout to use.

Note that by using --setup-source and --download-base to point to
local resources, you can keep this script from going over the network.
'''

parser = OptionParser(usage=usage)
parser.add_option("-v", "--version", dest="version",
help="use a specific zc.buildout version")
parser.add_option("-d", "--distribute",
action="store_true", dest="use_distribute", default=False,
help="Use Distribute rather than Setuptools.")
parser.add_option("--setup-source", action="callback", dest="setup_source",
callback=normalize_to_url, nargs=1, type="string",
help=("Specify a URL or file location for the setup file. "
"If you use Setuptools, this will default to " +
setuptools_source + "; if you use Distribute, this "
"will default to " + distribute_source +"."))
parser.add_option("--download-base", action="callback", dest="download_base",
callback=normalize_to_url, nargs=1, type="string",
help=("Specify a URL or directory for downloading "
"zc.buildout and either Setuptools or Distribute. "
"Defaults to PyPI."))
parser.add_option("--eggs",
help=("Specify a directory for storing eggs. Defaults to "
"a temporary directory that is deleted when the "
"bootstrap script completes."))
parser.add_option("-t", "--accept-buildout-test-releases",
dest='accept_buildout_test_releases',
action="store_true", default=False,
help=("Normally, if you do not specify a --version, the "
"bootstrap script and buildout gets the newest "
"*final* versions of zc.buildout and its recipes and "
"extensions for you. If you use this flag, "
"bootstrap and buildout will get the newest releases "
"even if they are alphas or betas."))
parser.add_option("-c", None, action="store", dest="config_file",
help=("Specify the path to the buildout configuration "
"file to be used."))

options, args = parser.parse_args()

# if -c was provided, we push it back into args for buildout's main function
if options.config_file is not None:
args += ['-c', options.config_file]

if options.eggs:
eggs_dir = os.path.abspath(os.path.expanduser(options.eggs))
else:
eggs_dir = tempfile.mkdtemp()

if options.setup_source is None:
if options.use_distribute:
options.setup_source = distribute_source
else:
options.setup_source = setuptools_source

if options.accept_buildout_test_releases:
args.append('buildout:accept-buildout-test-releases=true')
args.append('bootstrap')

try:
import pkg_resources
import setuptools # A flag. Sometimes pkg_resources is installed alone.
if not hasattr(pkg_resources, '_distribute'):
raise ImportError
except ImportError:
ez_code = urllib2.urlopen(
options.setup_source).read().replace('\r\n', '\n')
ez = {}
exec ez_code in ez
setup_args = dict(to_dir=eggs_dir, download_delay=0)
if options.download_base:
setup_args['download_base'] = options.download_base
if options.use_distribute:
setup_args['no_fake'] = True
ez['use_setuptools'](**setup_args)
if 'pkg_resources' in sys.modules:
reload(sys.modules['pkg_resources'])
import pkg_resources
# This does not (always?) update the default working set. We will
# do it.
for path in sys.path:
if path not in pkg_resources.working_set.entries:
pkg_resources.working_set.add_entry(path)

cmd = [quote(sys.executable),
'-c',
quote('from setuptools.command.easy_install import main; main()'),
'-mqNxd',
quote(eggs_dir)]

if not has_broken_dash_S:
cmd.insert(1, '-S')

find_links = options.download_base
if not find_links:
find_links = os.environ.get('bootstrap-testing-find-links')
if find_links:
cmd.extend(['-f', quote(find_links)])

if options.use_distribute:
setup_requirement = 'distribute'
else:
setup_requirement = 'setuptools'
ws = pkg_resources.working_set
setup_requirement_path = ws.find(
pkg_resources.Requirement.parse(setup_requirement)).location
env = dict(
os.environ,
PYTHONPATH=setup_requirement_path)

requirement = 'zc.buildout'
version = options.version
if version is None and not options.accept_buildout_test_releases:
# Figure out the most recent final version of zc.buildout.
import setuptools.package_index
_final_parts = '*final-', '*final'
def _final_version(parsed_version):
for part in parsed_version:
if (part[:1] == '*') and (part not in _final_parts):
return False
return True
index = setuptools.package_index.PackageIndex(
search_path=[setup_requirement_path])
if find_links:
index.add_find_links((find_links,))
req = pkg_resources.Requirement.parse(requirement)
if index.obtain(req) is not None:
best = []
bestv = None
for dist in index[req.project_name]:
distv = dist.parsed_version
if _final_version(distv):
if bestv is None or distv > bestv:
best = [dist]
bestv = distv
elif distv == bestv:
best.append(dist)
if best:
best.sort()
version = best[-1].version
if version:
requirement = '=='.join((requirement, version))
cmd.append(requirement)

if is_jython:
import subprocess
exitcode = subprocess.Popen(cmd, env=env).wait()
else: # Windows prefers this, apparently; otherwise we would prefer subprocess
exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env]))
if exitcode != 0:
sys.stdout.flush()
sys.stderr.flush()
print ("An error occurred when trying to install zc.buildout. "
"Look above this message for any errors that "
"were output by easy_install.")
sys.exit(exitcode)

ws.add_entry(eggs_dir)
ws.require(requirement)
import zc.buildout.buildout
zc.buildout.buildout.main(args)
if not options.eggs: # clean up temporary egg directory
shutil.rmtree(eggs_dir)
56 changes: 56 additions & 0 deletions buildout.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
[buildout]
parts =
lxml
instance
test

extends = http://dist.plone.org/release/4.2.1/versions.cfg

versions = versions
develop = .

extensions = mr.developer

sources = sources
auto-checkout = *
sources-dir = src
eggs =
zcml =

[instance]
recipe = plone.recipe.zope2instance
user = admin:admin
http-address = 8088
eggs =
${buildout:eggs}
collective.MockMailHost
Plone
Pillow
plone.act
pcommerce.core
pcommerce.shipment.parcel
pcommerce.payment.invoice
environment-vars =
zope_i18n_compile_mo_files true

zcml =
${buildout:zcml}

[lxml]
recipe = z3c.recipe.staticlxml
egg = lxml

[test]
recipe = zc.recipe.testrunner
eggs = pcommerce.core [test]
defaults = ['--auto-color', '--auto-progress']

[sources]
plone.act = git git://github.com/plone/plone.act.git
#Bad release 0.6 on PyPi - delete if its fixed
collective.MockMailHost = git https://github.com/collective/collective.mockmailhost.git

[versions]
pcommerce.payment.invoice = 1.0b5
pcommerce.shipment.parcel = 1.0b2
lxml = 2.2.4
16 changes: 8 additions & 8 deletions docs/TODO.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ Customers
Membership integration
~~~~~~~~~~~~~~~~~~~~~~

Integrate order form with site membership, or don't require membership?
[x] Integrate order form with site membership, or don't require membership? Switch in control panel

The payment process should be easier for customers, now lots of duplicate
[] The payment process should be easier for customers, now lots of duplicate
data have to be filled in.

Product filtering
~~~~~~~~~~~~~~~~~

Filter on product properties to narrow down products (ajax?)
[] Filter on product properties to narrow down products (ajax?)


Vendor
Expand All @@ -25,11 +25,11 @@ Vendor
Order management
~~~~~~~~~~~~~~~~

* batching (implemented in 1.0b12)
[x] batching (implemented in 1.0b12)

* filtering (on status, for example)
[] filtering (on status, for example)

* Integrate processing here? The current way is rather flimsy: vendor clicks a
[] Integrate processing here? The current way is rather flimsy: vendor clicks a
link from an email which takes him to the processOrder page, which redirects
to a blank page displaying only "order processed".

Expand All @@ -40,6 +40,6 @@ Order management
General
-------

* Layout: currently has own CSS looking like Plone 3. Try styling by adding
[] Layout: currently has own CSS looking like Plone 3. Try styling by adding
only classes, so we use Plone's own styling (should work in both 3 and 4).
* Translations: replace bare strings with labels and defaults
[] Translations: replace bare strings with labels and defaults
Loading