From: Craig A. H. <svn...@pl...> - 2010-03-01 20:56:31
|
Author: cah190 Date: Mon Mar 1 20:56:24 2010 New Revision: 34438 Modified: plone.app.controlpanel/trunk/CHANGES.txt plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups.py plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_groupmembership.pt plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_groupsoverview.pt plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_usermembership.pt plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_usersoverview.pt Log: Added link to show all results on batched user/group listings. Fixed batching-related problems and behavioral inconsistencies among user/group listings. Modified: plone.app.controlpanel/trunk/CHANGES.txt ============================================================================== --- plone.app.controlpanel/trunk/CHANGES.txt (original) +++ plone.app.controlpanel/trunk/CHANGES.txt Mon Mar 1 20:56:24 2010 @@ -4,6 +4,23 @@ 2.0b4 - Unreleased ------------------ +- Reworked user and group listings to prevent excessively long batching URLs and + resubmission of role changes via the batching links; requires changes to batching + templates in Plone 4.0b1. + [cah190] + +- Added a link to show all search results (thus temporarily disabling batching) for + user and group listings. + [cah190] + +- Performing a search on the users and groups overviews now resets the batching state + such that page 1 is always shown after the search is submitted. + [cah190] + +- The users overview will now return to the same page of results after role changes + are submitted. + [cah190] + - Remove the option to turn off nesting. [esteele] Modified: plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups.py ============================================================================== --- plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups.py (original) +++ plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups.py Mon Mar 1 20:56:24 2010 @@ -116,15 +116,27 @@ return groupResults + userResults + def atoi(self, s): + try: + return int(s) + except ValueError: + return 0 + class UsersOverviewControlPanel(UsersGroupsControlPanelView): def __call__(self): form = self.request.form submitted = form.get('form.submitted', False) + search = form.get('form.button.Search', None) is not None findAll = form.get('form.button.FindAll', None) is not None self.searchString = not findAll and form.get('searchstring', '') or '' self.searchResults = [] + self.newSearch = False + + if search or findAll: + self.newSearch = True + if submitted: if form.get('form.button.Modify', None) is not None: self.manageUser(form.get('users', None), @@ -254,9 +266,15 @@ def __call__(self): form = self.request.form submitted = form.get('form.submitted', False) + search = form.get('form.button.Search', None) is not None findAll = form.get('form.button.FindAll', None) is not None self.searchString = not findAll and form.get('searchstring', '') or '' self.searchResults = [] + self.newSearch = False + + if search or findAll: + self.newSearch = True + if submitted: if form.get('form.button.Modify', None) is not None: self.manageGroup([group[len('group_'):] for group in self.request.keys() if group.startswith('group_')], @@ -364,12 +382,10 @@ self.searchResults = [] self.searchString = '' + self.newSearch = False if submitted: - findAll = form.get('form.button.FindAll', None) is not None and not self.many_users - self.searchString = not findAll and form.get('searchstring', '') or '' - self.searchResults = self.getPotentialMembers(self.searchString) - + # add/delete before we search so we don't show stale results toAdd = form.get('add', []) if toAdd: for u in toAdd: @@ -382,6 +398,15 @@ self.gtool.removePrincipalFromGroup(u, self.groupname, self.request) self.context.plone_utils.addPortalMessage(_(u'Changes made.')) + search = form.get('form.button.Search', None) is not None + findAll = form.get('form.button.FindAll', None) is not None and not self.many_users + self.searchString = not findAll and form.get('searchstring', '') or '' + if findAll or self.searchString != '': + self.searchResults = self.getPotentialMembers(self.searchString) + + if search or findAll: + self.newSearch = True + self.groupMembers = self.getMembers() return self.index() @@ -399,8 +424,7 @@ userResults.sort(key=lambda x: x is not None and x.getProperty('fullname') is not None and x.getProperty('fullname').lower() or '') mergedResults = groupResults + userResults - filter(None, mergedResults) - return mergedResults + return filter(None, mergedResults) def getPotentialMembers(self, searchString): ignoredUsersGroups = [x.id for x in self.getMembers() + [self.group,] if x is not None] @@ -418,6 +442,7 @@ self.searchResults = [] self.searchString = '' + self.newSearch = False if form.get('form.submitted', False): delete = form.get('delete', []) @@ -432,9 +457,15 @@ self.gtool.addPrincipalToGroup(self.userid, groupname, self.request) self.context.plone_utils.addPortalMessage(_(u'Changes made.')) + search = form.get('form.button.Search', None) is not None findAll = form.get('form.button.FindAll', None) is not None and not self.many_groups self.searchString = not findAll and form.get('searchstring', '') or '' - self.searchResults = self.getPotentialGroups(self.searchString) + + if findAll or not self.many_groups or self.searchString != '': + self.searchResults = self.getPotentialGroups(self.searchString) + + if search or findAll: + self.newSearch = True self.groups = self.getGroups() return self.index() @@ -442,9 +473,9 @@ def getGroups(self): groupResults = [self.gtool.getGroupById(m) for m in self.gtool.getGroupsForPrincipal(self.member)] groupResults.sort(key=lambda x: x is not None and x.getGroupTitleOrName().lower()) - filter(None, groupResults) - return groupResults + return filter(None, groupResults) def getPotentialGroups(self, searchString): ignoredGroups = [x.id for x in self.getGroups() if x is not None] return self.membershipSearch(searchString, searchUsers=False, ignore=ignoredGroups) + Modified: plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_groupmembership.pt ============================================================================== --- plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_groupmembership.pt (original) +++ plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_groupmembership.pt Mon Mar 1 20:56:24 2010 @@ -15,13 +15,16 @@ tal:define="template_id string:@@usergroup-groupmembership; errors python:request.get('errors', {}); portal_roles view/portal_roles; + showAll python:request.get('showAll', '') and not view.newSearch and 'y'; Batch python:modules['Products.CMFPlone'].Batch; - b_start python:request.get('b_start',0); - b_size python:20; + resultcount python:len(view.searchResults); + b_size python:resultcount if showAll else 20; + b_start python:0 if showAll or view.newSearch else view.atoi(request.get('b_start',0)); + b_start python:b_start if b_start <= resultcount else resultcount - resultcount % b_size; + b_start python:b_start if b_start < resultcount else max(b_start - b_size, 0); portal_url context/portal_url;"> <div class="documentEditable"> - <!-- simulating views on the groups/user pages until we have real objects. --> <div id="edit-bar"> <ul class="contentViews" id="content-views"> @@ -101,7 +104,8 @@ name="groups" method="post" tal:attributes="action string:$portal_url/$template_id?groupname=${view/groupname}" - tal:define="batch python:Batch(view.searchResults, b_size, int(b_start), orphan=1); + tal:define="batch python:Batch(view.searchResults, b_size, int(b_start)); + batchformkeys python:['searchstring','_authenticator','groupname','form.submitted']; many_users view/many_users"> <h2 i18n:translate="heading_groupmembers_current">Current group members</h2> <table class="listing" summary="Group Members Listing" @@ -295,10 +299,25 @@ </table> <input type="hidden" value="b_start" name="b_start" - tal:attributes="value b_start"/> + tal:attributes="value b_start"/> + + <input type="hidden" value="" name="showAll" + tal:attributes="value showAll"/> <div metal:use-macro="context/batch_macros/macros/navigation" /> + <div class="showAllSearchResults" + tal:condition="python:batch.next or batch.previous" + tal:define="mq python:modules['ZTUtils'].make_query; + keys batchformkeys|nothing; + linkparams python:keys and dict([(key, request.form[key]) for key in keys if key in request]) or request.form; + url batch_base_url | string:${context/absolute_url}/${template_id}"> + <a tal:attributes="href python: '%s?%s' % (url, mq( linkparams, {'showAll':'y'} ))" + i18n:translate="description_pas_show_all_search_results"> + Show all search results + </a> + </div> + <input class="context" type="submit" name="form.button.Add" Modified: plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_groupsoverview.pt ============================================================================== --- plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_groupsoverview.pt (original) +++ plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_groupsoverview.pt Mon Mar 1 20:56:24 2010 @@ -14,15 +14,16 @@ <metal:main fill-slot="prefs_configlet_content" tal:define="template_id string:@@usergroup-groupprefs; errors python:request.get('errors', {}); + showAll python:request.get('showAll', '') and not view.newSearch and 'y'; Batch python:modules['Products.CMFPlone'].Batch; - b_start request/b_start | python:0; - b_size python:20; + b_start python:0 if showAll or view.newSearch else request.get('b_start',0); portal_roles view/portal_roles; search_results view/searchResults; + b_size python:showAll and len(search_results) or 20; batch python:search_results and Batch(search_results, b_size, int(b_start), orphan=1) or None; + batchformkeys python:['searchstring','_authenticator']; portal_url context/portal_url;"> - <div class="documentEditable"> <div id="edit-bar"> @@ -112,6 +113,9 @@ <input type="hidden" value="b_start" name="b_start" tal:attributes="value b_start"/> + <input type="hidden" value="" name="showAll" + tal:attributes="value showAll"/> + <table class="listing" summary="Select roles for each group" i18n:attributes="summary summary_roles_for_groups;"> @@ -242,6 +246,18 @@ <div metal:use-macro="context/batch_macros/macros/navigation" /> + <div class="showAllSearchResults" + tal:condition="python:batch.next or batch.previous" + tal:define="mq python:modules['ZTUtils'].make_query; + keys batchformkeys|nothing; + linkparams python:keys and dict([(key, request.form[key]) for key in keys if key in request]) or request.form; + url batch_base_url | string:${context/absolute_url}/${template_id}"> + <a tal:attributes="href python: '%s?%s' % (url, mq( linkparams, {'showAll':'y'} ))" + i18n:translate="description_pas_show_all_search_results"> + Show all search results + </a> + </div> + <input class="context" type="submit" name="form.button.Modify" Modified: plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_usermembership.pt ============================================================================== --- plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_usermembership.pt (original) +++ plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_usermembership.pt Mon Mar 1 20:56:24 2010 @@ -22,13 +22,18 @@ errors python:request.get('errors', {}); userquery python:view.makeQuery(userid=userid); portal_url context/portal_url; + showAll python:request.get('showAll', '') and not view.newSearch and 'y'; Batch python:modules['Products.CMFPlone'].Batch; - b_start request/b_start | python:0; - b_size python:20; + b_size python:showAll and len(view.searchResults) or 20; many_groups view/many_groups; mq python:modules['ZTUtils'].make_query; results view/searchResults; - batch python:results and Batch(results, b_size, int(b_start), orphan=1) or None;"> + resultcount python:len(results); + b_start python:0 if showAll or view.newSearch else view.atoi(request.get('b_start',0)); + b_start python:b_start if (b_start <= resultcount) else (resultcount - resultcount % b_size); + b_start python:b_start if (b_start < resultcount) else max(b_start - b_size, 0); + batch python:Batch(view.searchResults, b_size, int(b_start)); + batchformkeys python:['searchstring','_authenticator', 'userid'];"> <div class="documentEditable"> <!-- simulating views on the groups/user pages until we have real objects. --> @@ -182,6 +187,26 @@ </tal:block> </table> + <div metal:use-macro="context/batch_macros/macros/navigation" /> + + <div class="showAllSearchResults" + tal:condition="python:batch.next or batch.previous" + tal:define="mq python:modules['ZTUtils'].make_query; + keys batchformkeys|nothing; + linkparams python:keys and dict([(key, request.form[key]) for key in keys if key in request]) or request.form; + url batch_base_url | string:${context/absolute_url}/${template_id}"> + <a tal:attributes="href python: '%s?%s' % (url, mq( linkparams, {'showAll':'y'} ))" + i18n:translate="description_pas_show_all_search_results"> + Show all search results + </a> + </div> + + <input type="hidden" value="b_start" name="b_start" + tal:attributes="value b_start"/> + + <input type="hidden" value="" name="showAll" + tal:attributes="value showAll"/> + <input type="hidden" name="form.submitted" value="1" /> <input class="context" Modified: plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_usersoverview.pt ============================================================================== --- plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_usersoverview.pt (original) +++ plone.app.controlpanel/trunk/plone/app/controlpanel/usergroups_usersoverview.pt Mon Mar 1 20:56:24 2010 @@ -13,9 +13,10 @@ <metal:main fill-slot="prefs_configlet_content" tal:define="template_id string:@@usergroup-userprefs; + showAll python:request.get('showAll', '') and not view.newSearch and 'y'; Batch python:modules['Products.CMFPlone'].Batch; - b_start request/b_start | python:0; - b_size request/b_size | python:20; + b_start python:0 if showAll or view.newSearch else request.get('b_start',0); + b_size python:showAll and len(view.searchResults) or 20; portal_roles view/portal_roles; portal_url context/portal_url;"> @@ -102,6 +103,7 @@ tal:define="findAll python:'form.button.FindAll' in request.keys(); portal_users view/searchResults; batch python:Batch(portal_users, b_size, int(b_start), orphan=1); + batchformkeys python:['searchstring','_authenticator']; many_users view/many_users"> <input type="hidden" name="form.submitted" value="1" /> @@ -235,6 +237,24 @@ <div metal:use-macro="context/batch_macros/macros/navigation" /> + <div class="showAllSearchResults" + tal:condition="python:batch.next or batch.previous" + tal:define="mq python:modules['ZTUtils'].make_query; + keys batchformkeys|nothing; + linkparams python:keys and dict([(key, request.form[key]) for key in keys if key in request]) or request.form; + url batch_base_url | string:${context/absolute_url}/${template_id}"> + <a tal:attributes="href python: '%s?%s' % (url, mq( linkparams, {'showAll':'y'} ))" + i18n:translate="description_pas_show_all_search_results"> + Show all search results + </a> + </div> + + <input type="hidden" value="b_start" name="b_start" + tal:attributes="value b_start"/> + + <input type="hidden" value="" name="showAll" + tal:attributes="value showAll"/> + <input class="context" type="submit" name="form.button.Modify" |