11import datetime
22import re
33import urllib .parse
4- from abc import abstractmethod
5-
6- from typing import Dict , List , Optional , Type
4+ import warnings
5+ from typing import Dict , List , Optional
76
87import bs4
98
109from tibiapy import abc , InvalidContent , Sex , Vocation
1110from tibiapy .abc import BaseCharacter
12- from tibiapy .enums import AuctionOrder , AuctionOrderBy , AuctionStatus , BattlEyeTypeFilter , BazaarType , BidType , \
11+ from tibiapy .enums import AuctionOrder , AuctionOrderBy , AuctionSearchType , AuctionStatus , BattlEyeTypeFilter , \
12+ BazaarType , BidType , \
1313 PvpTypeFilter , \
1414 SkillFilter , \
1515 VocationAuctionFilter
16- from tibiapy .utils import convert_line_breaks , get_tibia_url , parse_integer , parse_pagination , parse_tibia_datetime , \
16+ from tibiapy .utils import convert_line_breaks , deprecated , get_tibia_url , parse_integer , parse_pagination , \
17+ parse_tibia_datetime , \
1718 parse_tibia_money , \
1819 parse_tibiacom_content , \
1920 try_enum
@@ -95,6 +96,10 @@ class AuctionFilters(abc.Serializable):
9596 The minimum skill level of the selected :attr:`skill` to display.
9697 max_skill_level: :class:`int`
9798 The maximum skill level of the selected :attr:`skill` to display.
99+ search_string: :class:`str`
100+ The search term to filter out auctions.
101+ search_type: :class:`AuctionSearchType`
102+ The type of search to use. Defines the behaviour of :py:attr:`search_string`.
98103 """
99104 __slots__ = (
100105 "world" ,
@@ -108,7 +113,8 @@ class AuctionFilters(abc.Serializable):
108113 "max_skill_level" ,
109114 "order_by" ,
110115 "order" ,
111- "item" ,
116+ "search_string" ,
117+ "search_type" ,
112118 )
113119
114120 def __init__ (self , ** kwargs ):
@@ -123,7 +129,8 @@ def __init__(self, **kwargs):
123129 self .max_skill_level : Optional [int ] = kwargs .get ("max_skill_level" )
124130 self .order_by : Optional [AuctionOrderBy ] = kwargs .get ("order_by" )
125131 self .order : Optional [AuctionOrder ] = kwargs .get ("order" )
126- self .item : Optional [str ] = kwargs .get ("item" )
132+ self .search_string : Optional [str ] = kwargs .get ("search_string" )
133+ self .search_type : Optional [AuctionSearchType ] = kwargs .get ("search_type" )
127134
128135 def __repr__ (self ):
129136 attributes = ""
@@ -132,6 +139,21 @@ def __repr__(self):
132139 attributes += " %s=%r" % (attr , v )
133140 return "<{0.__class__.__name__}{1}>" .format (self , attributes )
134141
142+ @property
143+ def item (self ):
144+ """:class:`str`: The name of the item to search for.
145+
146+ .. deprecated:: 3.5.0
147+ Use :py:attr:`search_string` instead.
148+ """
149+ warnings .warn ("Deprecated, use 'search_string'instead" , DeprecationWarning )
150+ return self .search_string
151+
152+ @item .setter
153+ @deprecated (instead = "search_string" )
154+ def item (self , value ):
155+ self .search_string = value
156+
135157 @property
136158 def query_params (self ):
137159 """:class:`str`: The query parameters representing this filter."""
@@ -147,7 +169,8 @@ def query_params(self):
147169 "filter_skillrangeto" : self .max_skill_level ,
148170 "order_column" : self .order_by .value if self .order_by else None ,
149171 "order_direction" : self .order .value if self .order else None ,
150- "itemname" : self .item ,
172+ "searchstring" : self .search_string ,
173+ "searchtype" : self .search_type .value if self .search_type else None ,
151174 }
152175 return {k : v for k , v in params .items () if v }
153176
@@ -167,30 +190,22 @@ def _parse_filter_table(cls, table):
167190 filters = AuctionFilters ()
168191 world_select = table .find ("select" , {"name" : "filter_world" })
169192 selected_world_option = world_select .find ("option" , {"selected" : True })
170- if selected_world_option is None or not selected_world_option ["value" ]:
171- filters .world = None
172- else :
193+ if selected_world_option is not None and selected_world_option ["value" ]:
173194 filters .world = selected_world_option ["value" ]
174195
175196 pvp_select = table .find ("select" , {"name" : "filter_worldpvptype" })
176197 selected_pvp_option = pvp_select .find ("option" , {"selected" : True })
177- if selected_pvp_option is None or not selected_pvp_option ["value" ]:
178- filters .pvp_type = None
179- else :
198+ if selected_pvp_option is not None and selected_pvp_option ["value" ]:
180199 filters .pvp_type = try_enum (PvpTypeFilter , parse_integer (selected_pvp_option ["value" ], None ))
181200
182201 battleye_select = table .find ("select" , {"name" : "filter_worldbattleyestate" })
183202 selected_battleye_option = battleye_select .find ("option" , {"selected" : True })
184- if selected_battleye_option is None or not selected_battleye_option ["value" ]:
185- filters .battleye = None
186- else :
203+ if selected_battleye_option is not None and selected_battleye_option ["value" ]:
187204 filters .battleye = try_enum (BattlEyeTypeFilter , parse_integer (selected_battleye_option ["value" ], None ))
188205
189206 vocation_select = table .find ("select" , {"name" : "filter_profession" })
190207 selected_vocation_option = vocation_select .find ("option" , {"selected" : True })
191- if selected_vocation_option is None or not selected_vocation_option ["value" ]:
192- filters .vocation = None
193- else :
208+ if selected_vocation_option is not None and selected_vocation_option ["value" ]:
194209 filters .vocation = try_enum (VocationAuctionFilter , parse_integer (selected_vocation_option ["value" ], None ))
195210
196211 minlevel_input = table .find ("input" , {"name" : "filter_levelrangefrom" })
@@ -200,9 +215,7 @@ def _parse_filter_table(cls, table):
200215
201216 skill_select = table .find ("select" , {"name" : "filter_skillid" })
202217 selected_skill_option = skill_select .find ("option" , {"selected" : True })
203- if selected_skill_option is None or not selected_skill_option ["value" ]:
204- filters .skill = None
205- else :
218+ if selected_skill_option is not None and selected_skill_option ["value" ]:
206219 filters .skill = try_enum (SkillFilter , parse_integer (selected_skill_option ["value" ], None ))
207220 min_skill_level_input = table .find ("input" , {"name" : "filter_skillrangefrom" })
208221 max_skill_level_input = table .find ("input" , {"name" : "filter_skillrangeto" })
@@ -211,20 +224,23 @@ def _parse_filter_table(cls, table):
211224
212225 order_by_select = table .find ("select" , {"name" : "order_column" })
213226 selected_order_by_option = order_by_select .find ("option" , {"selected" : True })
214- if selected_order_by_option is None or not selected_order_by_option ["value" ]:
215- filters .order_by = None
216- else :
227+ if selected_order_by_option is not None and selected_order_by_option ["value" ]:
217228 filters .order_by = try_enum (AuctionOrderBy , parse_integer (selected_order_by_option ["value" ], None ))
218229
219230 order_select = table .find ("select" , {"name" : "order_direction" })
220231 selected_order_option = order_select .find ("option" , {"selected" : True })
221- if selected_order_option is None or not selected_order_option ["value" ]:
222- filters .order = None
223- else :
232+ if selected_order_option is not None and selected_order_option ["value" ]:
224233 filters .order = try_enum (AuctionOrder , parse_integer (selected_order_option ["value" ], None ))
225234
226- name_input = table .find ("input" , {"name" : "itemname" })
227- filters .item = name_input ["value" ] or None
235+ search_string_input = table .find ("input" , {"name" : "searchstring" })
236+ if search_string_input is not None and search_string_input ["value" ]:
237+ filters .search_string = search_string_input ["value" ] or None
238+
239+ search_type_input = table .find ("input" , {"name" : "searchtype" , "checked" : "checked" })
240+
241+ if search_type_input is not None and search_type_input ["value" ]:
242+ filters .search_type = try_enum (AuctionSearchType , parse_integer (search_type_input ["value" ], None ))
243+
228244 return filters
229245
230246
0 commit comments