Difference between revisions of "EditBug:10100 Email and website fields in author update interleaved with semicolons"

From ISFDB
Jump to navigation Jump to search
(explaining cause of bug)
 
(include a partial patch)
Line 1: Line 1:
 
I tracked this down in the source; the problem is that PrintMultField() expects a sequence as its last argument, but the viewer is passing the plain ol' string (containing a semicolon-separated list of email addresses). Python will treat a string as a sequence of characters, though, so PrintMultiField() interprets it as a list of 1-character email addresses, and lists them all, separated by semicolons.
 
I tracked this down in the source; the problem is that PrintMultField() expects a sequence as its last argument, but the viewer is passing the plain ol' string (containing a semicolon-separated list of email addresses). Python will treat a string as a sequence of characters, though, so PrintMultiField() interprets it as a list of 1-character email addresses, and lists them all, separated by semicolons.
 +
 +
I started fixing the problem in the code, but realized that if I wanted to test my changes I'd need to install a whole mysql system with some test data and that's more trouble than I want to go to right now. However, I did notice that if you change the author_emails variable to be a tuple (or list) of strings, instead of a single string containing semicolon-separated values, some of the code gets noticeably simpler. And you can get rid of the used_emails variable since it's 1 iff (author_emails is not the empty tuple), which is equivalent to just evaluating the author_emails tuple as a boolean.
 +
 +
Here's an rcsdiff of what I did before stopping --- if you decide to go this route you presumably need to grep for the remaining references to used_emails and author_emails and change them:
 +
 +
<pre>RCS file: common/RCS/authorClass.py,v
 +
retrieving revision 1.5
 +
diff -r1.5 common/authorClass.py
 +
31d30
 +
< self.used_emails = 0
 +
42c41
 +
< self.author_emails = ''
 +
---
 +
> self.author_emails = ()
 +
85,94c84
 +
< rec2 = res2.fetch_row()
 +
< if rec2:
 +
< self.used_emails = 1
 +
< self.author_emails = ""
 +
< while rec2:
 +
< if self.author_emails == "":
 +
< self.author_emails = rec2[0][0]
 +
< else:
 +
< self.author_emails += ";" + rec2[0][0]
 +
<                        rec2 = res2.fetch_row()
 +
---
 +
> self.author_emails = tuple(map(lambda x: x[0], res2.fetch_row(0)))
 +
146c136
 +
< if self.used_emails:
 +
---
 +
> if len(self.author_emails):
 +
148c138
 +
< (self.author_emails)
 +
---
 +
> (';'.join(self.author_emails))
 +
214,215c204
 +
< self.used_emails = 1
 +
< self.author_emails = elem
 +
---
 +
> self.author_emails = tuple(elem.split(';'))
 +
253a243
 +
> emails = [ ]
 +
256,260c246
 +
< if counter == 1:
 +
< self.author_emails = email
 +
< self.used_emails = 1
 +
< else:
 +
< self.author_emails += ';'+email
 +
---
 +
> emails.append(email)
 +
261a248
 +
> self.author_emails = tuple(emails)
 +
===================================================================
 +
RCS file: edit/RCS/submitauth.py,v
 +
retrieving revision 1.6
 +
diff -r1.6 edit/submitauth.py
 +
155,164c155
 +
< update = 0
 +
< if new.used_emails and old.used_emails:
 +
< if new.author_emails != old.author_emails:
 +
< update = 1
 +
< elif new.used_emails and (old.used_emails == 0):
 +
< update = 1
 +
< elif (new.used_emails == 0) and old.used_emails:
 +
< new.author_emails = ""
 +
< update = 1
 +
< if update:
 +
---
 +
> if new.author_emails != old.author_emails:
 +
166,167c157
 +
< emails = string.split(new.author_emails, ';')
 +
< for email in emails:
 +
---
 +
> for email in new.author_emails:
 +
===================================================================
 +
</pre>

Revision as of 04:24, 17 March 2007

I tracked this down in the source; the problem is that PrintMultField() expects a sequence as its last argument, but the viewer is passing the plain ol' string (containing a semicolon-separated list of email addresses). Python will treat a string as a sequence of characters, though, so PrintMultiField() interprets it as a list of 1-character email addresses, and lists them all, separated by semicolons.

I started fixing the problem in the code, but realized that if I wanted to test my changes I'd need to install a whole mysql system with some test data and that's more trouble than I want to go to right now. However, I did notice that if you change the author_emails variable to be a tuple (or list) of strings, instead of a single string containing semicolon-separated values, some of the code gets noticeably simpler. And you can get rid of the used_emails variable since it's 1 iff (author_emails is not the empty tuple), which is equivalent to just evaluating the author_emails tuple as a boolean.

Here's an rcsdiff of what I did before stopping --- if you decide to go this route you presumably need to grep for the remaining references to used_emails and author_emails and change them:

RCS file: common/RCS/authorClass.py,v
retrieving revision 1.5
diff -r1.5 common/authorClass.py
31d30
< 		self.used_emails = 0
42c41
< 		self.author_emails = ''
---
> 		self.author_emails = ()
85,94c84
< 			rec2 = res2.fetch_row()
< 			if rec2:
< 				self.used_emails = 1
< 				self.author_emails = ""
< 				while rec2:
< 					if self.author_emails == "":
< 						self.author_emails = rec2[0][0]
< 					else:
< 						self.author_emails += ";" + rec2[0][0]
<                         		rec2 = res2.fetch_row()
---
> 			self.author_emails = tuple(map(lambda x: x[0], res2.fetch_row(0)))
146c136
< 			if self.used_emails:
---
> 			if len(self.author_emails):
148c138
< 						(self.author_emails)
---
> 						(';'.join(self.author_emails))
214,215c204
< 			self.used_emails = 1
< 			self.author_emails = elem
---
> 			self.author_emails = tuple(elem.split(';'))
253a243
> 		emails = [ ]
256,260c246
< 			if counter == 1:
< 				self.author_emails = email
< 				self.used_emails = 1
< 			else:
< 				self.author_emails += ';'+email
---
> 			emails.append(email)
261a248
> 		self.author_emails = tuple(emails)
===================================================================
RCS file: edit/RCS/submitauth.py,v
retrieving revision 1.6
diff -r1.6 edit/submitauth.py
155,164c155
< 	update = 0
< 	if new.used_emails and old.used_emails:
< 		if new.author_emails != old.author_emails:
< 			update = 1
< 	elif new.used_emails and (old.used_emails == 0):
< 		update = 1
< 	elif (new.used_emails == 0) and old.used_emails:
< 		new.author_emails = ""
< 		update = 1
< 	if update:
---
> 	if new.author_emails != old.author_emails:
166,167c157
< 		emails = string.split(new.author_emails, ';')
< 		for email in emails:
---
> 		for email in new.author_emails:
===================================================================