I am having a problem using the view_config decorator.

We have extended the view_config decorator to automatically include
the match_param
attribute.  This new decorator is called action_config.  I have
already eliminated
this as the source of my troubles, as the stock view_config decorator raises
the same errors.

I have 2 routes, 'contact' and 'contact id' that are being used by 4
view callables on a ContactHandler class.  Only 1 of the view callables is using
the 'contact id' route while the other 3 use the 'contact' route.

(Note: Our project is using namespace packages, so application.lib is
located at application.lib/application/lib on disk, for example)

Routes
application/module/__init__.py:
...
    config.add_route('contact',
            '/contact/{action}',
            factory='application.lib.contexts:ContactFactory')

    config.add_route('contact id',
            '/contact/{action}/{contact_id}',
            factory='application.lib.contexts:ContactFactory')

    config.scan('application.lib.handlers')
...


Callables
application.lib/application/lib/handlers/contact.py:

class ContactHandler(Handler):

    @action_config(route_name='contact id')
    def edit(self):
        """ Add or edit a contact """
        ...

    @action_config(route_name='contact')
    def index(self):
        """ Return list of contacts. """
        ...


    @action_config(route_name='contact')
    def search(self):
        """ Return a list of contacts matching search parameters """
        ...

    @action_config(route_name='contact')
    def find(self):
        """ Find a contacts """
        ...

I can't figure out how or why these route is conflicting.  My application is
only scanning application.lib/application/lib/handlers/contact.py in one place
and each view/callable method is only decorated once, each for a specific route
as defined in my __init__.py.

If I decorate the ContactHandler class with @view_defaults(route_name='contact')
and remove all of the @action_config decorators from my class methods, no errors
are raised.  However, this is not ideal as I one route requires an ID parameter
and one does not.

When using pdb.set_trace() inside of the our extended action_config
__call__ method
inside of the callback passed to view_config.venusian.attach(),
I find that the callback is being called 3 times for each of these routes.
I don't know if that is related to the problem.

Stragely, I am using this same action_config decorator in another module
inside of my application with no problems.

The error:
Traceback (most recent call last):
  File "~/.virtualenvs/application/bin/paster", line 8, in <module>
    load_entry_point('PasteScript==1.7.5', 'console_scripts', 'paster')()
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteScript-1.7.5-py2.7.egg/paste/script/command.py",
line 104, in run
    invoke(command, command_name, options, args[1:])
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteScript-1.7.5-py2.7.egg/paste/script/command.py",
line 143, in invoke
    exit_code = runner.run(args)
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteScript-1.7.5-py2.7.egg/paste/script/command.py",
line 238, in run
    result = self.command()
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteScript-1.7.5-py2.7.egg/paste/script/serve.py",
line 284, in command
    relative_to=base, global_conf=vars)
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteScript-1.7.5-py2.7.egg/paste/script/serve.py",
line 321, in loadapp
    **kw)
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 247, in loadapp
    return loadobj(APP, uri, name=name, **kw)
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 272, in loadobj
    return context.create()
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 710, in create
    return self.object_type.invoke(self)
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 144, in invoke
    **context.local_conf)
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/util.py",
line 56, in fix_call
    val = callable(*args, **kw)
  File 
"~/code/src/application/BRANCH/application.lib/application/lib/middleware/vhost.py",
line 199, in vhost_addict_factory
    settings['app'] = loader.get_app(key, global_conf=global_conf)
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 350, in get_app
    name=name, global_conf=global_conf).create()
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 710, in create
    return self.object_type.invoke(self)
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 146, in invoke
    return fix_call(context.object, context.global_conf, **context.local_conf)
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/util.py",
line 56, in fix_call
    val = callable(*args, **kw)
  File 
"~/code/src/application/BRANCH/application/application/module/__init__.py",
line 137, in main
    return config.make_wsgi_app()
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/pyramid-1.3.2-py2.7.egg/pyramid/config/__init__.py",
line 921, in make_wsgi_app
    self.commit()
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/pyramid-1.3.2-py2.7.egg/pyramid/config/__init__.py",
line 594, in commit
    self.action_state.execute_actions(introspector=self.introspector)
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/pyramid-1.3.2-py2.7.egg/pyramid/config/__init__.py",
line 1030, in execute_actions
    for action in resolveConflicts(self.actions):
  File 
"~/.virtualenvs/application/lib/python2.7/site-packages/pyramid-1.3.2-py2.7.egg/pyramid/config/__init__.py",
line 1136, in resolveConflicts
    raise ConfigurationConflictError(conflicts)


pyramid.exceptions.ConfigurationConflictError: Conflicting configuration actions
  For: ('view', None, '', None, <InterfaceClass
pyramid.interfaces.IView>, None, None, None, 'contact', 'add', False,
None, None, None, 'action=add')
    Line 184 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
    Line 184 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
    Line 184 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
  For: ('view', None, '', None, <InterfaceClass
pyramid.interfaces.IView>, None, None, None, 'contact', 'find', False,
None, None, None, 'action=find')
    Line 137 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
    Line 137 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
    Line 137 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
  For: ('view', None, '', None, <InterfaceClass
pyramid.interfaces.IView>, None, None, None, 'contact', 'index',
False, None, None, None, 'action=index')
    Line 94 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
    Line 94 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
    Line 94 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
  For: ('view', None, '', None, <InterfaceClass
pyramid.interfaces.IView>, None, None, None, 'contact', 'search',
False, None, None, None, 'action=search')
    Line 133 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
    Line 133 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
    Line 133 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact')
  For: ('view', None, '', None, <InterfaceClass
pyramid.interfaces.IView>, None, None, None, 'contact id', 'edit',
False, None, None, None, 'action=edit')
    Line 37 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact id')
    Line 37 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact id')
    Line 37 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
        @action_config(route_name='contact id')




-- 
Ian Marcinkowski
[email protected]

-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/pylons-discuss?hl=en.

Reply via email to