1
1
import datetime
2
2
import re
3
3
import 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
7
6
8
7
import bs4
9
8
10
9
from tibiapy import abc , InvalidContent , Sex , Vocation
11
10
from 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 , \
13
13
PvpTypeFilter , \
14
14
SkillFilter , \
15
15
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 , \
17
18
parse_tibia_money , \
18
19
parse_tibiacom_content , \
19
20
try_enum
@@ -95,6 +96,10 @@ class AuctionFilters(abc.Serializable):
95
96
The minimum skill level of the selected :attr:`skill` to display.
96
97
max_skill_level: :class:`int`
97
98
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`.
98
103
"""
99
104
__slots__ = (
100
105
"world" ,
@@ -108,7 +113,8 @@ class AuctionFilters(abc.Serializable):
108
113
"max_skill_level" ,
109
114
"order_by" ,
110
115
"order" ,
111
- "item" ,
116
+ "search_string" ,
117
+ "search_type" ,
112
118
)
113
119
114
120
def __init__ (self , ** kwargs ):
@@ -123,7 +129,8 @@ def __init__(self, **kwargs):
123
129
self .max_skill_level : Optional [int ] = kwargs .get ("max_skill_level" )
124
130
self .order_by : Optional [AuctionOrderBy ] = kwargs .get ("order_by" )
125
131
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" )
127
134
128
135
def __repr__ (self ):
129
136
attributes = ""
@@ -132,6 +139,21 @@ def __repr__(self):
132
139
attributes += " %s=%r" % (attr , v )
133
140
return "<{0.__class__.__name__}{1}>" .format (self , attributes )
134
141
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
+
135
157
@property
136
158
def query_params (self ):
137
159
""":class:`str`: The query parameters representing this filter."""
@@ -147,7 +169,8 @@ def query_params(self):
147
169
"filter_skillrangeto" : self .max_skill_level ,
148
170
"order_column" : self .order_by .value if self .order_by else None ,
149
171
"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 ,
151
174
}
152
175
return {k : v for k , v in params .items () if v }
153
176
@@ -167,30 +190,22 @@ def _parse_filter_table(cls, table):
167
190
filters = AuctionFilters ()
168
191
world_select = table .find ("select" , {"name" : "filter_world" })
169
192
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" ]:
173
194
filters .world = selected_world_option ["value" ]
174
195
175
196
pvp_select = table .find ("select" , {"name" : "filter_worldpvptype" })
176
197
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" ]:
180
199
filters .pvp_type = try_enum (PvpTypeFilter , parse_integer (selected_pvp_option ["value" ], None ))
181
200
182
201
battleye_select = table .find ("select" , {"name" : "filter_worldbattleyestate" })
183
202
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" ]:
187
204
filters .battleye = try_enum (BattlEyeTypeFilter , parse_integer (selected_battleye_option ["value" ], None ))
188
205
189
206
vocation_select = table .find ("select" , {"name" : "filter_profession" })
190
207
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" ]:
194
209
filters .vocation = try_enum (VocationAuctionFilter , parse_integer (selected_vocation_option ["value" ], None ))
195
210
196
211
minlevel_input = table .find ("input" , {"name" : "filter_levelrangefrom" })
@@ -200,9 +215,7 @@ def _parse_filter_table(cls, table):
200
215
201
216
skill_select = table .find ("select" , {"name" : "filter_skillid" })
202
217
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" ]:
206
219
filters .skill = try_enum (SkillFilter , parse_integer (selected_skill_option ["value" ], None ))
207
220
min_skill_level_input = table .find ("input" , {"name" : "filter_skillrangefrom" })
208
221
max_skill_level_input = table .find ("input" , {"name" : "filter_skillrangeto" })
@@ -211,20 +224,23 @@ def _parse_filter_table(cls, table):
211
224
212
225
order_by_select = table .find ("select" , {"name" : "order_column" })
213
226
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" ]:
217
228
filters .order_by = try_enum (AuctionOrderBy , parse_integer (selected_order_by_option ["value" ], None ))
218
229
219
230
order_select = table .find ("select" , {"name" : "order_direction" })
220
231
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" ]:
224
233
filters .order = try_enum (AuctionOrder , parse_integer (selected_order_option ["value" ], None ))
225
234
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
+
228
244
return filters
229
245
230
246
0 commit comments