@@ -42,7 +42,11 @@ def _getFullIndexList(self, indexName):
4242
4343 @security .protected (config .MANAGE_KEYWORDS_PERMISSION )
4444 def change (
45- self , old_keywords , new_keyword , context = None , indexName = "Subject"
45+ self ,
46+ new_keyword : str ,
47+ old_keywords : list ,
48+ context = None ,
49+ indexName : str = "Subject" ,
4650 ) -> int :
4751 """Updates all objects using the old_keywords.
4852
@@ -59,16 +63,16 @@ def change(
5963
6064 new_keyword = to_str (new_keyword )
6165 try :
62- querySet = api .content .find (** query )
66+ brains = api .content .find (** query )
6367 except UnicodeDecodeError :
6468 old_keywords = [
6569 k .decode ("utf8" ) if isinstance (k , str ) else k for k in old_keywords
6670 ]
6771 query [indexName ] = old_keywords
68- querySet = api .content .find (** query )
72+ brains = api .content .find (** query )
6973
70- for item in querySet :
71- obj = item .getObject ()
74+ for brain in brains :
75+ obj = brain .getObject ()
7276 # #MOD Dynamic field getting
7377
7478 value = self .getFieldValue (obj , indexName )
@@ -87,7 +91,7 @@ def change(
8791
8892 self .updateObject (obj , indexName , value )
8993
90- return len (querySet )
94+ return len (brains )
9195
9296 @security .protected (config .MANAGE_KEYWORDS_PERMISSION )
9397 def delete (self , keywords : list , context = None , indexName : str = "Subject" ) -> int :
@@ -119,27 +123,46 @@ def delete(self, keywords: list, context=None, indexName: str = "Subject") -> in
119123
120124 return len (brains )
121125
122- def updateObject (self , obj , indexName , value ) -> None :
126+ def updateObject (self , obj , indexName : str , value ) -> None :
123127 updateField = self .getSetter (obj , indexName )
124128 if updateField is not None :
125129 updateField (value )
126130 idxs = self ._getFullIndexList (indexName )
127131 obj .reindexObject (idxs = idxs )
128132
129133 @security .protected (config .MANAGE_KEYWORDS_PERMISSION )
130- def getKeywords (self , indexName = "Subject" ):
134+ def getKeywords (
135+ self , indexName : str = "Subject" , withLengths : bool = False
136+ ) -> list [str ] | list [tuple [str , int ]]:
137+ """Return all unique keyword values from the specified catalog index,
138+ sorted alphabetically.
139+
140+ Args:
141+ indexName: The name of the keyword index to query. Defaults to "Subject".
142+ withLengths: If True, returns tuples of (keyword, count) instead of
143+ just keywords. Defaults to False.
144+
145+ Returns:
146+ A sorted list of keyword strings, or a sorted list of (keyword, count)
147+ tuples if withLengths is True.
148+
149+ Raises:
150+ ValueError: If indexName is not a valid keyword index.
151+ """
131152 processQueue ()
132153 if indexName not in self .getKeywordIndexes ():
133- raise ValueError (f"{ indexName } is not a valid field " )
154+ raise ValueError (f"' { indexName } ' is not a valid index " )
134155
135156 catalog = api .portal .get_tool ("portal_catalog" )
136- keywords = [x for x in catalog .uniqueValuesFor (indexName ) if x is not None ]
137- keywords .sort (key = lambda x : x .lower ())
157+ keywords = sorted (
158+ catalog .Indexes [indexName ].uniqueValues (withLengths = withLengths ),
159+ key = lambda x : x .lower () if isinstance (x , str ) else x [0 ].lower (),
160+ )
138161
139162 # can we turn this into a yield?
140163 return keywords
141164
142- def getKeywordLength (self , key , indexName = "Subject" ) -> int :
165+ def getKeywordLength (self , key , indexName : str = "Subject" ) -> int :
143166 processQueue ()
144167 if indexName not in self .getKeywordIndexes ():
145168 raise ValueError (f"{ indexName } is not a valid field" )
@@ -184,7 +207,7 @@ def getScoredMatches(self, word, possibilities, num, score, context=None):
184207 # Return first n terms without scores
185208 return [item [1 ] for item in res [:num ]]
186209
187- def getKeywordIndexes (self ):
210+ def getKeywordIndexes (self ) -> list [ str ] :
188211 """Gets a list of indexes from the catalog. Uses config.py to choose the
189212 meta type and filters out a subset of known indexes that should not be
190213 managed.
@@ -200,7 +223,7 @@ def getKeywordIndexes(self):
200223 return idxs
201224
202225 @security .private
203- def fieldNameForIndex (self , indexName ) :
226+ def fieldNameForIndex (self , indexName : str ) -> str :
204227 """The name of the index may not be the same as the field on the object,
205228 and we need the actual field name in order to find its mutator.
206229 """
0 commit comments