E. Seifert wrote: > Hi list, > > as I'm not very familiar with the internals of ZCatalog I have a question to > all you API experts: > > Why does ZCatalog.py (under Zope 2.4.1) specify a 'addIndex' permission for > a method called 'manage_delIndexes' although there is no such method? The > only method I could find to delete Indexes is 'manage_deleteIndex'. > > Can anyone comment on this?
Well, considering that there's these methods in ZCatalog: manage_addColumn manage_delColumns manage_addIndex manage_deleteIndex ... manage_deleteIndex is obviously the odd one out. Especially as it allows you to delete several indexes in one go. I suggest it be renamed manage_delIndices or manage del_Indexes. manage_clearIndex also operates on multiple indexes, so that should become manage_clearIndexes. Funnily enough, the ZCatalog regression test at ./regressiontests/regressionCatalogTiming.py uses this call: manage_delIndexes([x]) which supports renaming manage_deleteIndex to manage_delIndexes. However, while dtml/catalogIndexes.dtml uses manage_delIndexes, ./dtml/manageIndex.dtml uses manage_deleteIndex. manage_reindexIndex should also become manage_reindexIndexes, as it requires a sequence of ids. Also, manage_reindexIndex doesn't have an associated permission. There's a few more place this touches, although all the changes are in ZCatalog.py and manageIndex.dtml. Congratulations, you've found a bug! This would have been more obvious if ZCatalog were using the new declarative security assertions, as the declaration would be right next to the method definition. Here's a first-draft patch, for comments etc. I haven't looked at the documentation of the API, so that might need changing too. -- Steve Alexander Software Engineer Cat-Box limited
*** ZCatalog.py.orig --- ZCatalog.py *************** *** 196,202 **** 'manage_catalogView', 'manage_catalogFind', 'manage_catalogSchema', 'manage_catalogIndexes', 'manage_catalogAdvanced', 'manage_objectInformation', ! 'manage_catalogReindex', 'manage_catalogFoundItems', 'manage_catalogClear', 'manage_addColumn', 'manage_delColumns', 'manage_addIndex', 'manage_delIndexes', 'manage_main', --- 196,202 ---- 'manage_catalogView', 'manage_catalogFind', 'manage_catalogSchema', 'manage_catalogIndexes', 'manage_catalogAdvanced', 'manage_objectInformation', ! 'manage_reindexIndexes', 'manage_clearIndexes', 'manage_catalogReindex', 'manage_catalogFoundItems', 'manage_catalogClear', 'manage_addColumn', 'manage_delColumns', 'manage_addIndex', 'manage_delIndexes', 'manage_main', *************** *** 422,430 **** RESPONSE.redirect(URL1 + '/manage_main?manage_tabs_message=Index%20Added') ! def manage_deleteIndex(self, ids=None, REQUEST=None, RESPONSE=None, URL1=None): ! """ del an index """ if not ids: return MessageDialog(title='No items specified', message='No items were specified!', --- 422,430 ---- RESPONSE.redirect(URL1 + '/manage_main?manage_tabs_message=Index%20Added') ! def manage_delIndexes(self, ids=None, REQUEST=None, RESPONSE=None, URL1=None): ! """ del indexes """ if not ids: return MessageDialog(title='No items specified', message='No items were specified!', *************** *** 436,444 **** if REQUEST and RESPONSE: RESPONSE.redirect(URL1 + '/manage_main?manage_tabs_message=Index%20Deleted') ! def manage_clearIndex(self, ids=None, REQUEST=None, RESPONSE=None, URL1=None): ! """ del an index """ if not ids: return MessageDialog(title='No items specified', message='No items were specified!', --- 436,444 ---- if REQUEST and RESPONSE: RESPONSE.redirect(URL1 + '/manage_main?manage_tabs_message=Index%20Deleted') ! def manage_clearIndexes(self, ids=None, REQUEST=None, RESPONSE=None, URL1=None): ! """ clear indexes """ if not ids: return MessageDialog(title='No items specified', message='No items were specified!', *************** *** 462,468 **** if obj is not None: self.catalog_object(obj, p, idxs=[name]) ! def manage_reindexIndex(self, ids=None, REQUEST=None, RESPONSE=None, URL1=None): """ Reindex indexes from a ZCatalog""" if not ids: return MessageDialog(title='No items specified', --- 462,468 ---- if obj is not None: self.catalog_object(obj, p, idxs=[name]) ! def manage_reindexIndexes(self, ids=None, REQUEST=None, RESPONSE=None, URL1=None): """ Reindex indexes from a ZCatalog""" if not ids: return MessageDialog(title='No items specified', *** ./dtml/manageIndex.dtml --- ./dtml/manageIndex.dtml *************** *** 209,217 **** <td align="left" valign="top"> <div class="form-element"> ! <input class="form-element" type="submit" name="manage_deleteIndex:method" value="Remove index"> ! <input class="form-element" type="submit" name="manage_reindexIndex:method" value="Reindex"> ! <input class="form-element" type="submit" name="manage_clearIndex:method" value="Clear index"> <script type="text/javascript"> <!-- --- 209,217 ---- <td align="left" valign="top"> <div class="form-element"> ! <input class="form-element" type="submit" name="manage_delIndexes:method" value="Remove index"> ! <input class="form-element" type="submit" name="manage_reindexIndexes:method" value="Reindex"> ! <input class="form-element" type="submit" name="manage_clearIndexes:method" value="Clear index"> <script type="text/javascript"> <!--