Bug #3380
SQL: crash lors de modif des champs "user"
0%
Description
Quand on modifie les champs utilisateurs sur un wcs configuré en SQL, on a une traceback ; cependant le champ est bien ajouté.
Je pense que la trace vient du fait que wcs cherche à savoir qui est l'utillisateur alors que la modif SQL n'a pas encore été faite. A creuser.
LINE 1: ...n, lasso_dump, last_seen, f5, f5_display, f1, f2, f3, f4, f7 ^ ) To: admin@entrouvert.com Exception: type = '<class 'psycopg2.ProgrammingError'>', value = 'ERREUR: la colonne f7 n'existe pas LINE 1: ...n, lasso_dump, last_seen, f5, f5_display, f1, f2, f3, f4, f7 ^ ' Stack trace (most recent call first): File "/usr/lib/python2.6/site-packages/wcs/sql.py", line 262, in get 260 + cls.get_data_fields()), 261 cls._table_name) > 262 cur.execute(sql_statement, {'id': str(id)}) 263 row = cur.fetchone() 264 if row is None: locals: ignore_migration = False cur = <cursor object at 0x2cbf908; closed: 0> sql_statement = 'SELECT id, name, email, roles, is_admin, anonymous, name_identifiers, identification_token, las so_dump, last_seen, f5, f5_display, f1, f2, f3, f4, f7\n FROM users\n WHERE id = %(id)s' ignore_errors = False x = ('last_seen', 'timestamp') id = 9 conn = <connection object at 0x2447060; dsn: 'dbname=wcs', closed: 0> cls = <class 'sql.SqlUser'> File "/usr/lib/python2.6/site-packages/wcs/sql.py", line 95, in f 93 except psycopg2.Error: 94 get_connection().rollback() > 95 raise 96 return f 97 locals: args = (<class 'sql.SqlUser'>, 9) func = <function get at 0x2744320> kwargs = {} File "/usr/lib/python2.6/site-packages/wcs/qommon/sessions.py", line 122, in get_user 120 return get_publisher().user_class.get(user_id) 121 except KeyError: > 122 pass 123 return None 124 locals: self = <BasicSession at 301fc10: 17f034a721d1ebd6> user_id = 9 File "/usr/lib/python2.6/site-packages/extra-wcs-au-quotidien/modules/root.ptl", line 758, in _q_traverse 756 session = get_session() 757 if session: > 758 get_request().user = session.get_user() 759 else: 760 get_request().user = None locals: path = ['admin', 'settings', 'users', 'fields'] self = <modules.root.AlternateRootDirectory object at 0x1e22c50> session = <BasicSession at 301fc10: 17f034a721d1ebd6> File "/usr/lib64/python2.6/site-packages/quixote/publish.py", line 253, in try_publish 251 permanent=True) 252 components = path[1:].split('/') > 253 output = self.root_directory._q_traverse(components) 254 # The callable ran OK, commit any changes to the session 255 self.finish_successful_request() locals: path = '/admin/settings/users/fields' self = <publisher.WcsPublisher instance at 0x26f5ab8> request = <qommon.http_request.HTTPRequest instance at 0x1fb9d88> components = ['admin', 'settings', 'users', 'fields'] File "/usr/lib/python2.6/site-packages/wcs/qommon/publisher.py", line 504, in try_publish 502 for extra_source in self.extra_sources: 503 self.substitutions.feed(extra_source(self, request)) > 504 return Publisher.try_publish(self, request) 505 506 def get_site_language(self): (...)
Fichiers
Historique
Mis à jour par Frédéric Péters il y a plus de 10 ans
- Statut changé de Nouveau à Information nécessaire
Je viens d'essayer en local de reproduire, sans succès. (après avoir corrigé le chargement de max_field_id depuis l'xml d'un formdef).
Mis à jour par Victor Claudet il y a plus de 10 ans
- Statut changé de Information nécessaire à En cours
Je viens de faire le test sur http://calvados.dev.au-quotidien.com/
Ça fonctionnait, mais plantage au moment de supprimer les champs users ajouté.
Pas de traceback, juste un gateway timeout.
Puis en rechargent la page est revenue (le champ avait bien été supprimé).
J'ai ajouté un champ case à cocher à choix unique et replantage, avec un timeout.
En rechargeant je suis tombé sur ce traceback :
Exception: type = '<class 'psycopg2.ProgrammingError'>', value = 'column "f1" does not exist LINE 1: ...n, lasso_dump, last_seen, f5, f5_display, f2, f3, f4, f6, f1 ^ ' Stack trace (most recent call first): File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/sql.py", line 291, in get 289 + cls.get_data_fields()), 290 cls._table_name) > 291 cur.execute(sql_statement, {'id': str(id)}) 292 row = cur.fetchone() 293 if row is None: locals: ignore_migration = False cur = <cursor object at 0x4ca5810; closed: 0> sql_statement = 'SELECT id, name, email, roles, is_admin, anonymous, name_identifiers, identification_token, lasso_dump, last_seen, f5, f5_display, f2, f3, f4, f6, f1\n FROM users\n WHERE id = %(id)s' ignore_errors = False x = ('last_seen', 'timestamp') id = 1 conn = <connection object at 0x50e0a70; dsn: 'dbname=cg14', closed: 0> cls = <class 'sql.SqlUser'> File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/sql.py", line 95, in f 93 except psycopg2.Error: 94 get_connection().rollback() > 95 raise 96 return f 97 locals: args = (<class 'sql.SqlUser'>, 1) func = <function get at 0x4b43578> kwargs = {} File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/qommon/sessions.py", line 122, in get_user 120 return get_publisher().user_class.get(user_id) 121 except KeyError: > 122 pass 123 return None 124 locals: self = <BasicSession at 498bfd0: 158acc8308415e28> user_id = 1 File "/var/vhosts/calvados.dev.au-quotidien.com/src/auquotidien.git/extra/modules/root.ptl", line 758, in _q_traverse 756 session = get_session() 757 if session: > 758 get_request().user = session.get_user() 759 else: 760 get_request().user = None locals: path = ['admin', 'settings', 'users', 'fields', 'new'] self = <modules.root.AlternateRootDirectory object at 0x4498150> session = <BasicSession at 498bfd0: 158acc8308415e28> File "/usr/lib/pymodules/python2.6/quixote/publish.py", line 253, in try_publish 251 permanent=True) 252 components = path[1:].split('/') > 253 output = self.root_directory._q_traverse(components) 254 # The callable ran OK, commit any changes to the session 255 self.finish_successful_request() locals: path = '/admin/settings/users/fields/new' self = <publisher.WcsPublisher instance at 0x375bb90> request = <qommon.http_request.HTTPRequest instance at 0x2d19ef0> components = ['admin', 'settings', 'users', 'fields', 'new'] File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/qommon/publisher.py", line 504, in try_publish 502 for extra_source in self.extra_sources: 503 self.substitutions.feed(extra_source(self, request)) > 504 return Publisher.try_publish(self, request) 505 506 def get_site_language(self): locals: pystatsd = <module 'qommon.vendor.pystatsd' from '/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/qommon/vendor/pystatsd.py'> request = <qommon.http_request.HTTPRequest instance at 0x2d19ef0> script_name = '' extra_source = <class 'modules.abelium_domino_vars.DominoVariables'> canonical_hostname = 'calvados.dev.au-quotidien.com' self = <publisher.WcsPublisher instance at 0x375bb90> File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/publisher.py", line 140, in try_publish 138 if request.get_header('X_WCS_IFRAME_MODE', '') in ('true', 'yes'): 139 request.response.iframe_mode = True > 140 return QommonPublisher.try_publish(self, request) 141 142 set_publisher_class(WcsPublisher) locals: self = <publisher.WcsPublisher instance at 0x375bb90> request = <qommon.http_request.HTTPRequest instance at 0x2d19ef0> File "/usr/lib/pymodules/python2.6/quixote/publish.py", line 281, in process_request 279 except: 280 # Some other exception, generate error messages to the logs, etc. > 281 output = self.finish_failed_request() 282 output = self.filter_output(request, output) 283 self.logger.log_request(request, start_time) locals: start_time = 1376313428.141242 request = <qommon.http_request.HTTPRequest instance at 0x2d19ef0> self = <publisher.WcsPublisher instance at 0x375bb90> File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/qommon/publisher.py", line 810, in process 808 def process(self, stdin, env): 809 request = HTTPRequest(stdin, env) > 810 self.response = self.process_request(request) 811 return self.response 812 locals: self = <publisher.WcsPublisher instance at 0x375bb90> stdin = <open file '<socket>', mode 'r' at 0x4b37db0> request = <qommon.http_request.HTTPRequest instance at 0x2d19ef0> env = {'HTTP_COOKIE': 'wcs-0afe89="158acc8308415e28"', 'SERVER_SOFTWARE': 'Apache/2.2.16 (Debian)', 'SCRIPT_NAME': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/admin/settings/users/fields/new', 'SERVER_PROTOCOL': 'HTTP/1.0', 'QUERY_STRING': '', 'CONTENT_LENGTH': '0', 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36', 'HTTP_CONNECTION': 'close', 'SERVER_NAME': 'calvados.dev.au-quotidien.com', 'REMOTE_ADDR': '192.168.1.1', 'SERVER_PORT': '80', 'SERVER_ADDR': '192.168.1.66', 'DOCUMENT_ROOT': '/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/data/web/', 'SERVER_ADMIN': 'webmaster@au-quotidien.com', 'REMOTE_USER': '1', 'HTTP_HOST': 'calvados.dev.au-quotidien.com', 'HTTP_CACHE_CONTROL': 'max-age=0', 'REQUEST_URI': '/admin/settings/users/fields/new', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'REMOTE_PORT': '59160', 'HTTP_ACCEPT_LANGUAGE': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4', 'SCGI': '1', 'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch'} File "/usr/lib/pymodules/python2.6/quixote/server/scgi_server.py", line 27, in handle_connection 25 env['PATH_INFO'] = path[len(prefix):] + env.get('PATH_INFO', '') 26 > 27 response = self.publisher.process(input, env) 28 try: 29 response.write(output) locals: output = <open file '<socket>', mode 'w' at 0x4b37a50> self = <qommon.scgi_server.QommonHandler instance at 0x38fd560> conn = <socket object, fd=10, family=2, type=1, protocol=0> env = {'HTTP_COOKIE': 'wcs-0afe89="158acc8308415e28"', 'SERVER_SOFTWARE': 'Apache/2.2.16 (Debian)', 'SCRIPT_NAME': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/admin/settings/users/fields/new', 'SERVER_PROTOCOL': 'HTTP/1.0', 'QUERY_STRING': '', 'CONTENT_LENGTH': '0', 'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36', 'HTTP_CONNECTION': 'close', 'SERVER_NAME': 'calvados.dev.au-quotidien.com', 'REMOTE_ADDR': '192.168.1.1', 'SERVER_PORT': '80', 'SERVER_ADDR': '192.168.1.66', 'DOCUMENT_ROOT': '/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/data/web/', 'SERVER_ADMIN': 'webmaster@au-quotidien.com', 'REMOTE_USER': '1', 'HTTP_HOST': 'calvados.dev.au-quotidien.com', 'HTTP_CACHE_CONTROL': 'max-age=0', 'REQUEST_URI': '/admin/settings/users/fields/new', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'REMOTE_PORT': '59160', 'HTTP_ACCEPT_LANGUAGE': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4', 'SCGI': '1', 'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch'} input = <open file '<socket>', mode 'r' at 0x4b37db0> File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/qommon/scgi_server.py", line 35, in handle_connection 33 def handle_connection(self, conn): 34 self.number_of_connection_handled = self.number_of_connection_handled + 1 > 35 quixote.server.scgi_server.QuixoteHandler.handle_connection(self, conn) 36 # input, output and conn are closed, long running jobs could be done 37 # here. locals: self = <qommon.scgi_server.QommonHandler instance at 0x38fd560> conn = <socket object, fd=10, family=2, type=1, protocol=0> File "/usr/lib/pymodules/python2.6/scgi/scgi_server.py", line 71, in serve 69 conn.setblocking(1) 70 os.close(fd) > 71 self.handle_connection(conn) 72 73 locals: self = <qommon.scgi_server.QommonHandler instance at 0x38fd560> fd = 5 conn = <socket object, fd=10, family=2, type=1, protocol=0> File "/usr/lib/pymodules/python2.6/scgi/scgi_server.py", line 194, in spawn_child 192 # the connection in the child 193 os.close(child_fd) > 194 self.handler_class(parent_fd).serve() 195 sys.exit(0) 196 else: locals: self = <qommon.scgi_server.SCGIServer instance at 0x3c0fd88> pid = 0 flags = 2 child_fd = 10 parent_fd = 6 conn = <socket._socketobject object at 0x3490bb0> File "/usr/lib/pymodules/python2.6/scgi/scgi_server.py", line 308, in delegate_request 306 # start more children if we haven't met max_children limit 307 if len(self.children) < self.max_children: > 308 self.spawn_child(conn) 309 310 # Start blocking inside select. We might have reached locals: e = [] w = [] self = <qommon.scgi_server.SCGIServer instance at 0x3c0fd88> r = [] timeout = 0 conn = <socket._socketobject object at 0x3490bb0> File "/usr/lib/pymodules/python2.6/scgi/scgi_server.py", line 327, in serve_on_socket 325 try: 326 conn, addr = self.socket.accept() > 327 self.delegate_request(conn) 328 conn.close() 329 except socket.error, e: locals: s = <socket._socketobject object at 0x3490c20> addr = ('127.0.0.1', 58899) conn = <socket._socketobject object at 0x3490bb0> self = <qommon.scgi_server.SCGIServer instance at 0x3c0fd88> File "/usr/lib/pymodules/python2.6/scgi/scgi_server.py", line 336, in serve 334 335 def serve(self): > 336 self.serve_on_socket(self.get_listening_socket()) 337 338 locals: self = <qommon.scgi_server.SCGIServer instance at 0x3c0fd88> File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/qommon/scgi_server.py", line 74, in run 72 s = SCGIServer(create_handler, host=host, port=port, 73 max_children=max_children) > 74 s.serve() 75 76 locals: create_handler = <function create_handler at 0x3b2f848> handler_connection_limit = -1 max_children = 5 create_publisher = <bound method classobj.create_publisher of <class publisher.WcsPublisher at 0x49521d0>> host = 'localhost' script_name = None s = <qommon.scgi_server.SCGIServer instance at 0x3c0fd88> spawn_cron = True port = 3614 File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/ctl/start.py", line 118, in execute 116 117 try: > 118 run_function(publisher.WcsPublisher.create_publisher, **run_kwargs) 119 except socket.error, e: 120 self.del_pid() locals: publisher = <module 'publisher' from '/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/publisher.py'> self = <wcs.ctl.start.CmdStart instance at 0x3b22518> args = [] sub_options = <Values at 0x3c0fcb0: {'http': False, 'silent': False, 'app_dir': None, 'extra': ['/var/vhosts/calvados.dev.au-quotidien.com/src/auquotidien.git/extra'], 'max_children': None, 'handler_connection_limit': None, 'script_name': None, 'daemonize': False, 'data_dir': None, 'port': '3614', 'pidfile': None}> run_function = <function run at 0x3c260c8> base_options = <Values at 0x3486e60: {'configfile': '/var/vhosts/calvados.dev.au-quotidien.com/wcs.cfg'}> run_kwargs = {'port': 3614, 'spawn_cron': True} File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/qommon/ctl.py", line 64, in run 62 if sub_options.data_dir: 63 self.config.set("main", "data_dir", sub_options.data_dir) > 64 return self.execute(base_options, sub_options, args) 65 66 def parse_args(self, args): locals: sub_options = <Values at 0x3c0fcb0: {'http': False, 'silent': False, 'app_dir': None, 'extra': ['/var/vhosts/calvados.dev.au-quotidien.com/src/auquotidien.git/extra'], 'max_children': None, 'handler_connection_limit': None, 'script_name': None, 'daemonize': False, 'data_dir': None, 'port': '3614', 'pidfile': None}> args = [] base_options = <Values at 0x3486e60: {'configfile': '/var/vhosts/calvados.dev.au-quotidien.com/wcs.cfg'}> self = <wcs.ctl.start.CmdStart instance at 0x3b22518> File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/qommon/ctl.py", line 150, in run 148 command_class = qommon._commands[command] 149 cmd = command_class() > 150 return cmd.run(args, options) 151 locals: cmd = <wcs.ctl.start.CmdStart instance at 0x3b22518> args = ['--port', '3614', '--extra', '/var/vhosts/calvados.dev.au-quotidien.com/src/auquotidien.git/extra'] self = <wcs.qommon.ctl.Ctl instance at 0x3486758> command_class = <class wcs.ctl.start.CmdStart at 0x3c23770> command = 'start' cmd_prefix = 'wcs.ctl' options = <Values at 0x3486e60: {'configfile': '/var/vhosts/calvados.dev.au-quotidien.com/wcs.cfg'}> File "/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcsctl.py", line 8, in <module> 6 7 ctl = wcs.qommon.ctl.Ctl(cmd_prefixes=['wcs.ctl']) > 8 ctl.run(sys.argv[1:]) 9 locals: wcs = <module 'wcs' from '/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcs/__init__.py'> __builtins__ = <module '__builtin__' (built-in)> __file__ = '/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/wcsctl.py' __package__ = None sys = <module 'sys' (built-in)> ctl = <wcs.qommon.ctl.Ctl instance at 0x3486758> __name__ = '__main__' __doc__ = None Form: Cookies: wcs-0afe89 '158acc8308415e28' Environment: CONTENT_LENGTH '0' DOCUMENT_ROOT '/var/vhosts/calvados.dev.au-quotidien.com/src/wcs.git/data/web/' HTTP_ACCEPT 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' HTTP_ACCEPT_ENCODING 'gzip,deflate,sdch' HTTP_ACCEPT_LANGUAGE 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4' HTTP_CACHE_CONTROL 'max-age=0' HTTP_CONNECTION 'close' HTTP_COOKIE 'wcs-0afe89="158acc8308415e28"' HTTP_HOST 'calvados.dev.au-quotidien.com' HTTP_USER_AGENT 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36' PATH_INFO '/admin/settings/users/fields/new' QUERY_STRING '' REMOTE_ADDR '192.168.1.1' REMOTE_PORT '59160' REMOTE_USER '1' REQUEST_METHOD 'GET' REQUEST_URI '/admin/settings/users/fields/new' SCGI '1' SCRIPT_NAME '' SERVER_ADDR '192.168.1.66' SERVER_ADMIN 'webmaster@au-quotidien.com' SERVER_NAME 'calvados.dev.au-quotidien.com' SERVER_PORT '80' SERVER_PROTOCOL 'HTTP/1.0' SERVER_SOFTWARE 'Apache/2.2.16 (Debian)'
Mis à jour par Frédéric Péters il y a plus de 10 ans
- Fichier 0001-settings-properly-restore-max_field_id-for-user-form.patch 0001-settings-properly-restore-max_field_id-for-user-form.patch ajouté
Patch testé sur calvados.dev.
Mis à jour par Frédéric Péters il y a plus de 10 ans
- Statut changé de En cours à Fermé
Patch poussé dans le dépôt.