Skip to content

Commit fa6ab6b

Browse files
author
Richard Jones
committed
fix detection of "missing" existing values in CGI form parser [SF#1414149]
1 parent b8700fc commit fa6ab6b

File tree

5 files changed

+38
-9
lines changed

5 files changed

+38
-9
lines changed

CHANGES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ Fixed:
3232
- enforce correct encoding of PostgreSQL backend (sf bug 1374235)
3333
- grouping/sorting on link to same class fixed (sf bug 1404930)
3434
- all backends implement the retired check in getnodeids (sf bug 1290560)
35+
- fix detection of "missing" existing values in CGI form parser (sf bug
36+
1414149)
3537

3638

3739
2005-10-07 0.9.0b1

roundup/backends/back_metakit.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# $Id: back_metakit.py,v 1.101 2006-01-24 08:27:05 a1s Exp $
1+
# $Id: back_metakit.py,v 1.102 2006-01-25 02:24:28 richard Exp $
22
'''Metakit backend for Roundup, originally by Gordon McMillan.
33
44
Known Current Bugs:
@@ -82,6 +82,11 @@ def Database(config, journaltag=None):
8282
return db
8383

8484
class _Database(hyperdb.Database, roundupdb.Database):
85+
# Metakit has no concept of an explicit NULL
86+
BACKEND_MISSING_STRING = ''
87+
BACKEND_MISSING_NUMBER = 0
88+
BACKEND_MISSING_BOOLEAN = 0
89+
8590
def __init__(self, config, journaltag=None):
8691
self.config = config
8792
self.journaltag = journaltag

roundup/cgi/form_parser.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -463,15 +463,18 @@ def parse(self, create=0, num_re=re.compile('^\d+$')):
463463

464464
# "missing" existing values may not be None
465465
if not existing:
466-
if isinstance(proptype, hyperdb.String) and not existing:
466+
if isinstance(proptype, hyperdb.String):
467467
# some backends store "missing" Strings as empty strings
468-
existing = None
469-
elif isinstance(proptype, hyperdb.Number) and not existing:
468+
if existing == self.db.BACKEND_MISSING_STRING:
469+
existing = None
470+
elif isinstance(proptype, hyperdb.Number):
470471
# some backends store "missing" Numbers as 0 :(
471-
existing = 0
472-
elif isinstance(proptype, hyperdb.Boolean) and not existing:
472+
if existing == self.db.BACKEND_MISSING_NUMBER:
473+
existing = None
474+
elif isinstance(proptype, hyperdb.Boolean):
473475
# likewise Booleans
474-
existing = 0
476+
if existing == self.db.BACKEND_MISSING_BOOLEAN:
477+
existing = None
475478

476479
# if changed, set it
477480
if value != existing:

roundup/hyperdb.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
1616
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1717
#
18-
# $Id: hyperdb.py,v 1.114 2006-01-24 08:22:42 a1s Exp $
18+
# $Id: hyperdb.py,v 1.115 2006-01-25 02:24:28 richard Exp $
1919

2020
"""Hyperdatabase implementation, especially field types.
2121
"""
@@ -271,6 +271,10 @@ class Database:
271271
# flag to set on retired entries
272272
RETIRED_FLAG = '__hyperdb_retired'
273273

274+
BACKEND_MISSING_STRING = None
275+
BACKEND_MISSING_NUMBER = None
276+
BACKEND_MISSING_BOOLEAN = None
277+
274278
def __init__(self, config, journaltag=None):
275279
"""Open a hyperdatabase given a specifier to some storage.
276280

test/test_cgi.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# but WITHOUT ANY WARRANTY; without even the implied warranty of
99
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1010
#
11-
# $Id: test_cgi.py,v 1.26 2004-11-18 16:23:58 a1s Exp $
11+
# $Id: test_cgi.py,v 1.27 2006-01-25 02:24:28 richard Exp $
1212

1313
import unittest, os, shutil, errno, sys, difflib, cgi, re
1414

@@ -424,15 +424,30 @@ def testInvalidNumber(self):
424424
def testSetNumber(self):
425425
self.assertEqual(self.parseForm({'number': '1'}),
426426
({('test', None): {'number': 1}}, []))
427+
self.assertEqual(self.parseForm({'number': '0'}),
428+
({('test', None): {'number': 0}}, []))
427429
self.assertEqual(self.parseForm({'number': '\n0\n'}),
428430
({('test', None): {'number': 0}}, []))
431+
432+
def testSetNumberReplaceOne(self):
429433
nodeid = self.db.test.create(number=1)
430434
self.assertEqual(self.parseForm({'number': '1'}, 'test', nodeid),
431435
({('test', nodeid): {}}, []))
436+
self.assertEqual(self.parseForm({'number': '0'}, 'test', nodeid),
437+
({('test', nodeid): {'number': 0}}, []))
438+
439+
def testSetNumberReplaceZero(self):
432440
nodeid = self.db.test.create(number=0)
433441
self.assertEqual(self.parseForm({'number': '0'}, 'test', nodeid),
434442
({('test', nodeid): {}}, []))
435443

444+
def testSetNumberReplaceNone(self):
445+
nodeid = self.db.test.create()
446+
self.assertEqual(self.parseForm({'number': '0'}, 'test', nodeid),
447+
({('test', nodeid): {'number': 0}}, []))
448+
self.assertEqual(self.parseForm({'number': '1'}, 'test', nodeid),
449+
({('test', nodeid): {'number': 1}}, []))
450+
436451
def testEmptyNumberSet(self):
437452
nodeid = self.db.test.create(number=0)
438453
self.assertEqual(self.parseForm({'number': ''}, 'test', nodeid),

0 commit comments

Comments
 (0)