Hi,
I think I have found the (hope it's the bug, not a bug ;)).
Would you mind trying attached pathches (newcontroller.py.diff and
decorator.py.diff).
Thanks.
Simon
Jorge Godoy wrote:
Simon Belak <[EMAIL PROTECTED]> writes:
Interesting. Would you mind posting (privately or here, whichever you prefer)
the relevant controller code.
Thnaks,
Simon
Sure, I don't mind passing it here.
The code in question is (don't mind it is just a "draft" yet, it is where I
try widgets and etc., coming from TG 0.8a3 up to the newest svn revision ;-)):
================================================================================
@turbogears.expose(inputform = formulario_clientes)
@identity.require(identity.conditions.in_any_group('latam_novo', 'admin'))
def save(self, cliente_id, nome_abreviado=None, nome_completo=None,
contrato=None, contrato_assinatura=None,
contrato_vencimento=None, auto_renovar=False, is_ativo=False,
endereco=None, cidade=None, estado=None, cep=None, cnpj=None,
ie=None, cpf=None, contato=None, email=None, fone=None,
fax=None, tg_errors = None):
# if cherrypy.request.form_errors:
# flashData = {"status": "error", "msg": _("Erro no preenchimento dos
dados")}
# turbogears.flash(json.write(jsonify(flashData)))
# return self.index()
agora = datetime.datetime.now()
erro = None
try:
model.hub.begin()
cliente = model.Cliente(
nomeAbreviado = nome_abreviado,
nomeCompleto = nome_completo,
isAtivo = is_ativo,
endereco = endereco,
cidade = cidade,
estado = estado,
cep = cep,
cnpj = cnpj,
ie = ie,
cpf = cpf,
fone = fone,
fax = fax,
email = email,
contato = contato,
condicaoPagamento = 0,
contrato = None,
tabelaID = 1,
incluidoPor = identity.current.user,
incluidoEm = agora,
alteradoPor = identity.current.user,
alteradoEm = agora,
)
if contrato:
_contrato = model.Contrato(
contrato = contrato,
autoRenovar = auto_renovar,
dataAssinatura = contrato_assinatura,
dataVencimento = None,
incluidoPor = identity.current.user,
incluidoEm = agora,
alteradoPor = identity.current.user,
alteradoEm = agora,
)
if contrato_vencimento != '':
_contrato.dataVencimento=contrato_vencimento
_contrato.sync()
cliente.contrato = _contrato,
cliente.sync()
model.hub.commit()
except model.Cliente._connection.module.ProgrammingError, error:
erro = error
model.hub.end()
if erro is not None:
flashData = {"status": "error", "msg": str(erro)}
turbogears.flash(json.write(jsonify(flashData)))
else:
flashData = {"status": "success", "msg": _("Registro cadastrado no banco
de dados!")}
turbogears.flash(json.write(jsonify(flashData)))
raise cherrypy.HTTPRedirect(turbogears.url("/clientes/"))
================================================================================
And my template is:
================================================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-t
ransitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" py:extends="'master.kid'"
xmlns:py="http://purl.org/kid/ns#">
<head>
<title>Cadastro de Amostras</title>
<script language="JavaScript" src="/tg_widgets/turbogears.widgets/calendar.js">
</script>
<script language="JavaScript"
src="/tg_widgets/turbogears.widgets/lang/calendar-pt-utf8.js"> </script>
<script language="JavaScript"
src="/tg_widgets/turbogears.widgets/calendar-setup.js"> </script>
<link href="/tg_widgets/turbogears.widgets/calendar-system.css" type="text/css"
rel="stylesheet"> </link>
</head>
<body>
<div id="mainbar">
<div py:def="intro()"> </div>
<?python
from turbogears.i18n.format import format_date
?>
<h1>Clientes</h1>
<div py:if='len(clientes) > 0' align="center">
<p><b>ATENÇÃO</b>: apenas clientes sem quaisquer dados associados a eles
podem ser removidos. Para tornar um cliente indisponível para acesso e
entrada de dados, desmarque-o como ativo.</p>
<span py:replace="grid_clientes.insert(tudo_clientes, add_link_title =
add_link_title, show_add_
link = False)" />
<p align='center'><a href='/clientes/ContratosVencendo/'>Relação de
contratos que
vencem nos próximos 7 dias</a></p>
</div>
<p align='center'><a href='/'>Retornar à página principal</a></p>
<p py:if="usuario">Os campos assinalados com um círculo vermelho devem
obrigatoriamente conter um valor tanto para o cadastro quanto para a
atualização de informações.</p>
<div py:if="cliente_id and usuario">
<br />
<h1>Editar cliente</h1>
<span py:replace="formulario.insert(data, action='/clientes/update', method =
'post')" />
<a href='/'>Retornar à página principal</a>
</div>
<div py:if="usuario">
<br />
<h1>Novo cliente</h1>
<span py:replace="formulario.insert(data_new, action='/clientes/save')"
/>
<a href='/'>Retornar à página principal</a>
</div>
</div>
</body>
</html>
================================================================================
Index: newcontrollers.py
===================================================================
--- newcontrollers.py (revision 618)
+++ newcontrollers.py (working copy)
@@ -225,8 +225,8 @@
def _remove_excess_args(func, kw):
""" Remove all excess arguments. """
argnames, varargs, kwargs = inspect.getargspec(func)[:-1]
- if kwargs is None:
- kw = dict(ifilter(lambda (key, _): key in argnames, kw.iteritems()))
+ if kwargs in (None, "tg_kw"):
+ kw = dict(ifilter(lambda (key, val): key in argnames, kw.iteritems()))
return kw
def _execute_func(self, func, tg_format, html, fragment, **kw):
Index: decorator.py
===================================================================
--- decorator.py (revision 618)
+++ decorator.py (working copy)
@@ -9,8 +9,9 @@
""" Decorates function with caller preserving original signature. """
def entangle(func):
argnames, varargs, kwargs, defaults = getargspec(func)
+ # Argument sink
if kwargs is None:
- kwargs = "kw"
+ kwargs = "tg_kw"
counter = itertools.count()
full_sign = formatargspec(argnames, varargs, kwargs, defaults,
formatvalue=lambda value: "=defaults[%i]" % (