Projet

Général

Profil

Bug #3380

SQL: crash lors de modif des champs "user"

Ajouté par Thomas Noël il y a presque 11 ans. Mis à jour il y a plus de 10 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
26 juillet 2013
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Planning:

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

#1

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).

#2

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)'
#4

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.

Formats disponibles : Atom PDF