Merge lp:~trb143/openlp/bugfixes into lp:openlp

Proposed by Tim Bentley
Status: Merged
Merged at revision: not available
Proposed branch: lp:~trb143/openlp/bugfixes
Merge into: lp:openlp
Diff against target: None lines
To merge this branch: bzr merge lp:~trb143/openlp/bugfixes
Reviewer Review Type Date Requested Status
Raoul Snyman Approve
Review via email: mp+9148@code.launchpad.net

This proposal supersedes a proposal from 2009-07-22.

To post a comment you must log in.
Revision history for this message
Tim Bentley (trb143) wrote : Posted in a previous version of this proposal

Add Keyboard events to ServiceManage
Add Splash Screen to Display Screen
Fix Renderer for footers

Revision history for this message
Raoul Snyman (raoul-snyman) wrote : Posted in a previous version of this proposal

Sorry if I gave you the wrong impression, but I don't think this will work. CP1252 is a Windows-specific code. We need to find the encoding that matches this.

17 + infile = codecs.open(inname, 'r', encoding='CP1252')

Otherwise everything else looks fine.

review: Needs Fixing
Revision history for this message
Raoul Snyman (raoul-snyman) :
review: Approve
lp:~trb143/openlp/bugfixes updated
496. By Tim Bentley

Fix up song dialog errors
Fix servicemanager key entry
Fix servicemanager state handling

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'cnvdb.py'
--- cnvdb.py 2009-07-19 06:31:08 +0000
+++ cnvdb.py 2009-07-21 18:10:14 +0000
@@ -20,6 +20,7 @@
20"""20"""
21import codecs21import codecs
22import sys22import sys
23import chardet
2324
24def convert_file(inname, outname):25def convert_file(inname, outname):
25 """26 """
@@ -31,7 +32,7 @@
31 ``outname``32 ``outname``
32 The output file name.33 The output file name.
33 """34 """
34 infile = codecs.open(inname, 'r', encoding='iso-8859-1')35 infile = codecs.open(inname, 'r', encoding='CP1252')
35 writefile = codecs.open(outname, 'w', encoding='utf-8')36 writefile = codecs.open(outname, 'w', encoding='utf-8')
36 for line in infile:37 for line in infile:
37 #replace the quotes with quotes38 #replace the quotes with quotes
3839
=== modified file 'openlp/core/lib/renderer.py'
--- openlp/core/lib/renderer.py 2009-07-15 17:33:31 +0000
+++ openlp/core/lib/renderer.py 2009-07-21 20:04:27 +0000
@@ -40,6 +40,7 @@
40 self._debug = 040 self._debug = 0
41 self._right_margin = 64 # the amount of right indent41 self._right_margin = 64 # the amount of right indent
42 self._shadow_offset = 542 self._shadow_offset = 5
43 self._shadow_offset_footer = 3
43 self._outline_offset = 244 self._outline_offset = 2
44 self.theme_name = None45 self.theme_name = None
45 self._theme = None46 self._theme = None
@@ -482,15 +483,17 @@
482 # dont allow alignment messing with footers483 # dont allow alignment messing with footers
483 if footer:484 if footer:
484 align = 0485 align = 0
486 shadow_offset = self._shadow_offset_footer
485 else:487 else:
486 align = int(self._theme .display_horizontalAlign)488 align = int(self._theme .display_horizontalAlign)
489 shadow_offset = self._shadow_offset
487 for linenum in range(len(lines)):490 for linenum in range(len(lines)):
488 line = lines[linenum]491 line = lines[linenum]
489 #find out how wide line is492 #find out how wide line is
490 w , h = self._get_extent_and_render(line, footer, tlcorner=(x, y), draw=False)493 w , h = self._get_extent_and_render(line, footer, tlcorner=(x, y), draw=False)
491 if self._theme.display_shadow:494 if self._theme.display_shadow:
492 w += self._shadow_offset495 w += shadow_offset
493 h += self._shadow_offset496 h += shadow_offset
494 if self._theme.display_outline:497 if self._theme.display_outline:
495 # pixels either side498 # pixels either side
496 w += 2 * self._outline_offset499 w += 2 * self._outline_offset
@@ -515,7 +518,7 @@
515 if live:518 if live:
516 # now draw the text, and any outlines/shadows519 # now draw the text, and any outlines/shadows
517 if self._theme.display_shadow:520 if self._theme.display_shadow:
518 self._get_extent_and_render(line, footer, tlcorner=(x+self._shadow_offset,y+self._shadow_offset),521 self._get_extent_and_render(line, footer, tlcorner=(x + shadow_offset, y + shadow_offset),
519 draw=True, color = self._theme.display_shadow_color)522 draw=True, color = self._theme.display_shadow_color)
520 if self._theme.display_outline:523 if self._theme.display_outline:
521 self._get_extent_and_render(line, footer, (x+self._outline_offset,y), draw=True,524 self._get_extent_and_render(line, footer, (x+self._outline_offset,y), draw=True,
522525
=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py 2009-07-19 07:40:31 +0000
+++ openlp/core/ui/maindisplay.py 2009-07-21 18:10:14 +0000
@@ -62,12 +62,22 @@
62 self.showFullScreen()62 self.showFullScreen()
63 else:63 else:
64 self.showMinimized()64 self.showMinimized()
65 #Build a custom splash screen
66 self.InitialFrame = QtGui.QImage(screen[u'size'].width(),
67 screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied)
68 splash_image = QtGui.QImage(u':/graphics/openlp-splash-screen.png')
69 painter_image = QtGui.QPainter()
70 painter_image.begin(self.InitialFrame)
71 painter_image.fillRect(self.InitialFrame.rect(), QtCore.Qt.white)
72 painter_image.drawImage((screen[u'size'].width() - splash_image.width()) / 2,
73 (screen[u'size'].height() - splash_image.height()) / 2 , splash_image)
74 self.frameView(self.InitialFrame)
75 #Build a Black screen
65 painter = QtGui.QPainter()76 painter = QtGui.QPainter()
66 self.blankFrame = QtGui.QImage(screen[u'size'].width(),77 self.blankFrame = QtGui.QImage(screen[u'size'].width(),
67 screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied)78 screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied)
68 painter.begin(self.blankFrame)79 painter.begin(self.blankFrame)
69 painter.fillRect(self.blankFrame.rect(), QtCore.Qt.black)80 painter.fillRect(self.blankFrame.rect(), QtCore.Qt.black)
70 self.frameView(self.blankFrame)
7181
72 def frameView(self, frame):82 def frameView(self, frame):
73 """83 """
7484
=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py 2009-07-11 05:18:34 +0000
+++ openlp/core/ui/servicemanager.py 2009-07-21 20:04:27 +0000
@@ -41,9 +41,38 @@
41 if event.key() == QtCore.Qt.Key_Enter:41 if event.key() == QtCore.Qt.Key_Enter:
42 self.parent.makeLive()42 self.parent.makeLive()
43 event.accept()43 event.accept()
44 event.ignore()44 elif event.key() == QtCore.Qt.Key_Home:
45 else:45 self.parent.onServiceTop()
46 event.ignore()46 event.accept()
47 elif event.key() == QtCore.Qt.Key_End:
48 self.parent.onServiceEnd()
49 event.accept()
50 elif event.key() == QtCore.Qt.Key_PageUp:
51 self.parent.onServiceUp()
52 event.accept()
53 elif event.key() == QtCore.Qt.Key_PageDown:
54 self.parent.onServiceDown()
55 event.accept()
56 elif event.key() == QtCore.Qt.Key_Up:
57 self.parent.onMoveSelectionUp()
58 event.accept()
59 elif event.key() == QtCore.Qt.Key_Down:
60 self.parent.onMoveSelectionDown()
61 event.accept()
62 event.ignore()
63 else:
64 event.ignore()
65
66class Iter(QtGui.QTreeWidgetItemIterator):
67 def __init__(self, *args):
68 QtGui.QTreeWidgetItemIterator.__init__(self, *args)
69 def next(self):
70 self.__iadd__(1)
71 value = self.value()
72 if value:
73 return self.value()
74 else:
75 return None
4776
48class ServiceManager(QtGui.QWidget):77class ServiceManager(QtGui.QWidget):
49 """78 """
@@ -134,6 +163,52 @@
134 self.servicePath = self.config.get_data_path()163 self.servicePath = self.config.get_data_path()
135 self.service_theme = self.config.get_config(u'theme service theme', u'')164 self.service_theme = self.config.get_config(u'theme service theme', u'')
136165
166 def onMoveSelectionUp(self):
167 """
168 Moves the selection up the window
169 Called by the up arrow
170 """
171 it = Iter(self.ServiceManagerList)
172 item = it.value()
173 tempItem = None
174 setLastItem = False
175 while item is not None:
176 if item.isSelected() and tempItem is None:
177 setLastItem = True
178 item.setSelected(False)
179 if item.isSelected():
180 #We are on the first record
181 if tempItem is not None:
182 tempItem.setSelected(True)
183 item.setSelected(False)
184 else:
185 tempItem = item
186 lastItem = item
187 item = it.next()
188 #Top Item was selected so set the last one
189 if setLastItem:
190 lastItem.setSelected(True)
191
192 def onMoveSelectionDown(self):
193 """
194 Moves the selection down the window
195 Called by the down arrow
196 """
197 it = Iter(self.ServiceManagerList)
198 item = it.value()
199 firstItem = item
200 setSelected = False
201 while item is not None:
202 if setSelected:
203 setSelected = False
204 item.setSelected(True)
205 elif item.isSelected():
206 item.setSelected(False)
207 setSelected = True
208 item = it.next()
209 if setSelected:
210 firstItem.setSelected(True)
211
137 def collapsed(self, item):212 def collapsed(self, item):
138 """213 """
139 Record if an item is collapsed214 Record if an item is collapsed
@@ -159,7 +234,7 @@
159 temp = self.serviceItems[item]234 temp = self.serviceItems[item]
160 self.serviceItems.remove(self.serviceItems[item])235 self.serviceItems.remove(self.serviceItems[item])
161 self.serviceItems.insert(0, temp)236 self.serviceItems.insert(0, temp)
162 self.repaintServiceList()237 self.repaintServiceList(0, count)
163 self.parent.OosChanged(False, self.serviceName)238 self.parent.OosChanged(False, self.serviceName)
164239
165 def onServiceUp(self):240 def onServiceUp(self):
@@ -172,7 +247,7 @@
172 temp = self.serviceItems[item]247 temp = self.serviceItems[item]
173 self.serviceItems.remove(self.serviceItems[item])248 self.serviceItems.remove(self.serviceItems[item])
174 self.serviceItems.insert(item - 1, temp)249 self.serviceItems.insert(item - 1, temp)
175 self.repaintServiceList()250 self.repaintServiceList(item - 1 , count)
176 self.parent.OosChanged(False, self.serviceName)251 self.parent.OosChanged(False, self.serviceName)
177252
178 def onServiceDown(self):253 def onServiceDown(self):
@@ -185,7 +260,7 @@
185 temp = self.serviceItems[item]260 temp = self.serviceItems[item]
186 self.serviceItems.remove(self.serviceItems[item])261 self.serviceItems.remove(self.serviceItems[item])
187 self.serviceItems.insert(item + 1, temp)262 self.serviceItems.insert(item + 1, temp)
188 self.repaintServiceList()263 self.repaintServiceList(item + 1 , count)
189 self.parent.OosChanged(False, self.serviceName)264 self.parent.OosChanged(False, self.serviceName)
190265
191 def onServiceEnd(self):266 def onServiceEnd(self):
@@ -197,7 +272,7 @@
197 temp = self.serviceItems[item]272 temp = self.serviceItems[item]
198 self.serviceItems.remove(self.serviceItems[item])273 self.serviceItems.remove(self.serviceItems[item])
199 self.serviceItems.insert(len(self.serviceItems), temp)274 self.serviceItems.insert(len(self.serviceItems), temp)
200 self.repaintServiceList()275 self.repaintServiceList(len(self.serviceItems) - 1, count)
201 self.parent.OosChanged(False, self.serviceName)276 self.parent.OosChanged(False, self.serviceName)
202277
203 def onNewService(self):278 def onNewService(self):
@@ -216,10 +291,10 @@
216 item, count = self.findServiceItem()291 item, count = self.findServiceItem()
217 if item is not -1:292 if item is not -1:
218 self.serviceItems.remove(self.serviceItems[item])293 self.serviceItems.remove(self.serviceItems[item])
219 self.repaintServiceList()294 self.repaintServiceList(0, 0)
220 self.parent.OosChanged(False, self.serviceName)295 self.parent.OosChanged(False, self.serviceName)
221296
222 def repaintServiceList(self):297 def repaintServiceList(self, serviceItem, serviceItemCount):
223 """298 """
224 Clear the existing service list and prepaint all the items299 Clear the existing service list and prepaint all the items
225 Used when moving items as the move takes place in supporting array,300 Used when moving items as the move takes place in supporting array,
@@ -232,20 +307,20 @@
232 count += 1307 count += 1
233 #Repaint the screen308 #Repaint the screen
234 self.ServiceManagerList.clear()309 self.ServiceManagerList.clear()
235 for item in self.serviceItems:310 for itemcount, item in enumerate(self.serviceItems):
236 serviceitem = item[u'data']311 serviceitem = item[u'data']
237 treewidgetitem = QtGui.QTreeWidgetItem(self.ServiceManagerList)312 treewidgetitem = QtGui.QTreeWidgetItem(self.ServiceManagerList)
238 treewidgetitem.setText(0,serviceitem.title)313 treewidgetitem.setText(0,serviceitem.title)
239 treewidgetitem.setIcon(0,serviceitem.iconic_representation)314 treewidgetitem.setIcon(0,serviceitem.iconic_representation)
240 treewidgetitem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(item[u'order']))315 treewidgetitem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(item[u'order']))
241 treewidgetitem.setExpanded(item[u'expanded'])316 treewidgetitem.setExpanded(item[u'expanded'])
242 count = 0317 for count , frame in enumerate(serviceitem.frames):
243 for frame in serviceitem.frames:
244 treewidgetitem1 = QtGui.QTreeWidgetItem(treewidgetitem)318 treewidgetitem1 = QtGui.QTreeWidgetItem(treewidgetitem)
245 text = frame[u'title']319 text = frame[u'title']
246 treewidgetitem1.setText(0,text[:40])320 treewidgetitem1.setText(0,text[:40])
247 treewidgetitem1.setData(0, QtCore.Qt.UserRole,QtCore.QVariant(count))321 treewidgetitem1.setData(0, QtCore.Qt.UserRole,QtCore.QVariant(count))
248 count = count + 1322 if serviceItem == itemcount and serviceItemCount == count:
323 self.ServiceManagerList.setCurrentItem(treewidgetitem1)
249324
250 def onSaveService(self):325 def onSaveService(self):
251 """326 """
252327
=== modified file 'openlp/plugins/songs/forms/authorsform.py'
--- openlp/plugins/songs/forms/authorsform.py 2009-07-18 05:43:50 +0000
+++ openlp/plugins/songs/forms/authorsform.py 2009-07-22 06:14:34 +0000
@@ -63,6 +63,7 @@
63 else:63 else:
64 self.AuthorListWidget.setCurrentRow(self.currentRow)64 self.AuthorListWidget.setCurrentRow(self.currentRow)
65 self._validate_form()65 self._validate_form()
66 self.onAuthorListWidgetItemClicked()
6667
67 def onDeleteButtonClick(self):68 def onDeleteButtonClick(self):
68 """69 """
@@ -100,31 +101,32 @@
100 self._validate_form()101 self._validate_form()
101 self.DisplayEdit.setFocus()102 self.DisplayEdit.setFocus()
102103
103 def onAuthorListWidgetItemClicked(self, index):104 def onAuthorListWidgetItemClicked(self):
104 """105 """
105 An Author has been selected display it106 An Author has been selected display it
106 If the author is attached to a Song prevent delete107 If the author is attached to a Song prevent delete
107 """108 """
108 self.currentRow = self.AuthorListWidget.currentRow()109 self.currentRow = self.AuthorListWidget.currentRow()
109 item = self.AuthorListWidget.currentItem()110 item = self.AuthorListWidget.currentItem()
110 item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]111 if item is not None:
111 self.author = self.songmanager.get_author(item_id)112 item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
112 self.DisplayEdit.setText(self.author.display_name)113 self.author = self.songmanager.get_author(item_id)
113 if self.author.first_name is None:114 self.DisplayEdit.setText(self.author.display_name)
114 self.FirstNameEdit.setText(u'')115 if self.author.first_name is None:
115 else:116 self.FirstNameEdit.setText(u'')
116 self.FirstNameEdit.setText(self.author.first_name)117 else:
117 if self.author.last_name is None:118 self.FirstNameEdit.setText(self.author.first_name)
118 self.LastNameEdit.setText(u'')119 if self.author.last_name is None:
119 else:120 self.LastNameEdit.setText(u'')
120 self.LastNameEdit.setText(self.author.last_name)121 else:
121 if len(self.author.songs) > 0:122 self.LastNameEdit.setText(self.author.last_name)
122 self.MessageLabel.setText(translate(u'AuthorForm', u'Author in use "Delete" is disabled'))123 if len(self.author.songs) > 0:
123 self.DeleteButton.setEnabled(False)124 self.MessageLabel.setText(translate(u'AuthorForm', u'Author in use "Delete" is disabled'))
124 else:125 self.DeleteButton.setEnabled(False)
125 self.MessageLabel.setText(translate(u'AuthorForm', u'Author in not used'))126 else:
126 self.DeleteButton.setEnabled(True)127 self.MessageLabel.setText(translate(u'AuthorForm', u'Author in not used'))
127 self._validate_form()128 self.DeleteButton.setEnabled(True)
129 self._validate_form()
128 self.DisplayEdit.setFocus()130 self.DisplayEdit.setFocus()
129131
130 def _validate_form(self):132 def _validate_form(self):
131133
=== modified file 'openlp/plugins/songs/forms/songbookform.py'
--- openlp/plugins/songs/forms/songbookform.py 2009-07-14 18:38:33 +0000
+++ openlp/plugins/songs/forms/songbookform.py 2009-07-22 06:14:34 +0000
@@ -62,6 +62,7 @@
62 self.BookSongListWidget.setCurrentRow(self.BookSongListWidget.count() - 1)62 self.BookSongListWidget.setCurrentRow(self.BookSongListWidget.count() - 1)
63 else:63 else:
64 self.BookSongListWidget.setCurrentRow(self.currentRow)64 self.BookSongListWidget.setCurrentRow(self.currentRow)
65 self.onBooksListViewItemClicked()
6566
66 def onDeleteButtonClick(self):67 def onDeleteButtonClick(self):
67 """68 """
@@ -98,24 +99,25 @@
98 self._validate_form()99 self._validate_form()
99 self.NameEdit.setFocus()100 self.NameEdit.setFocus()
100101
101 def onBooksListViewItemClicked(self, index):102 def onBooksListViewItemClicked(self):
102 """103 """
103 An Book has been selected display it104 An Book has been selected display it
104 If the Book is attached to a Song prevent delete105 If the Book is attached to a Song prevent delete
105 """106 """
106 self.currentRow = self.BookSongListWidget.currentRow()107 self.currentRow = self.BookSongListWidget.currentRow()
107 item = self.BookSongListWidget.currentItem()108 item = self.BookSongListWidget.currentItem()
108 item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]109 if item is not None:
109 self.Book = self.songmanager.get_book(item_id)110 item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
110 self.NameEdit.setText(self.Book.name)111 self.Book = self.songmanager.get_book(item_id)
111 self.PublisherEdit.setText(self.Book.publisher)112 self.NameEdit.setText(self.Book.name)
112 if len(self.Book.songs) > 0:113 self.PublisherEdit.setText(self.Book.publisher)
113 self.MessageLabel.setText(translate(u'BookForm', u'Book in use "Delete" is disabled'))114 if len(self.Book.songs) > 0:
114 self.DeleteButton.setEnabled(False)115 self.MessageLabel.setText(translate(u'BookForm', u'Book in use "Delete" is disabled'))
115 else:116 self.DeleteButton.setEnabled(False)
116 self.MessageLabel.setText(translate(u'BookForm', u'Book in not used'))117 else:
117 self.DeleteButton.setEnabled(True)118 self.MessageLabel.setText(translate(u'BookForm', u'Book in not used'))
118 self._validate_form()119 self.DeleteButton.setEnabled(True)
120 self._validate_form()
119 self.NameEdit.setFocus()121 self.NameEdit.setFocus()
120122
121 def _validate_form(self):123 def _validate_form(self):
122124
=== modified file 'openlp/plugins/songs/forms/topicsform.py'
--- openlp/plugins/songs/forms/topicsform.py 2009-07-14 18:38:33 +0000
+++ openlp/plugins/songs/forms/topicsform.py 2009-07-22 06:14:34 +0000
@@ -63,6 +63,7 @@
63 else:63 else:
64 self.TopicsListWidget.setCurrentRow(self.currentRow)64 self.TopicsListWidget.setCurrentRow(self.currentRow)
65 self._validate_form()65 self._validate_form()
66 self.onTopicsListWidgetItemClicked()
6667
67 def onDeleteButtonClick(self):68 def onDeleteButtonClick(self):
68 """69 """
@@ -97,23 +98,24 @@
97 self._validate_form()98 self._validate_form()
98 self.TopicNameEdit.setFocus()99 self.TopicNameEdit.setFocus()
99100
100 def onTopicsListWidgetItemClicked(self, index):101 def onTopicsListWidgetItemClicked(self):
101 """102 """
102 An Topic has been selected display it103 An Topic has been selected display it
103 If the Topic is attached to a Song prevent delete104 If the Topic is attached to a Song prevent delete
104 """105 """
105 self.currentRow = self.TopicsListWidget.currentRow()106 self.currentRow = self.TopicsListWidget.currentRow()
106 item = self.TopicsListWidget.currentItem()107 item = self.TopicsListWidget.currentItem()
107 item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]108 if item is not None:
108 self.topic = self.songmanager.get_topic(item_id)109 item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
109 self.TopicNameEdit.setText(self.topic.name)110 self.topic = self.songmanager.get_topic(item_id)
110 if len(self.topic.songs) > 0:111 self.TopicNameEdit.setText(self.topic.name)
111 self.MessageLabel.setText(translate(u'TopicForm', u'Topic in use "Delete" is disabled'))112 if len(self.topic.songs) > 0:
112 self.DeleteButton.setEnabled(False)113 self.MessageLabel.setText(translate(u'TopicForm', u'Topic in use "Delete" is disabled'))
113 else:114 self.DeleteButton.setEnabled(False)
114 self.MessageLabel.setText(translate(u'TopicForm', u'Topic in not used'))115 else:
115 self.DeleteButton.setEnabled(True)116 self.MessageLabel.setText(translate(u'TopicForm', u'Topic in not used'))
116 self._validate_form()117 self.DeleteButton.setEnabled(True)
118 self._validate_form()
117 self.TopicNameEdit.setFocus()119 self.TopicNameEdit.setFocus()
118120
119 def _validate_form(self):121 def _validate_form(self):
120122
=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py 2009-07-18 05:43:50 +0000
+++ openlp/plugins/songs/lib/mediaitem.py 2009-07-21 18:10:14 +0000
@@ -289,7 +289,7 @@
289 else:289 else:
290 verses = song.lyrics.split(u'\n\n')290 verses = song.lyrics.split(u'\n\n')
291 for slide in verses:291 for slide in verses:
292 service_item.add_from_text(slide[:30], slide)292 service_item.add_from_text(slide[:30], unicode(slide))
293 service_item.title = song.title293 service_item.title = song.title
294 for author in song.authors:294 for author in song.authors:
295 if len(author_list) > 1:295 if len(author_list) > 1: