server/search: add safety search for posts
This commit is contained in:
parent
74fba05302
commit
802c7feca0
4 changed files with 45 additions and 4 deletions
2
API.md
2
API.md
|
@ -615,6 +615,8 @@ data.
|
|||
| `fav-time` | alias of `fav-date` |
|
||||
| `feature-date` | featured at given date |
|
||||
| `feature-time` | alias of `feature-time` |
|
||||
| `safety` | having given safety. `<value>` can be either `safe`, `sketchy` (or `questionable`) or `unsafe`. |
|
||||
| `rating` | alias of `safety` |
|
||||
|
||||
**Sort style tokens**
|
||||
|
||||
|
|
|
@ -146,6 +146,14 @@
|
|||
<td><code>feature-time</code></td>
|
||||
<td>alias of <code>feature-time</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>safety</code></td>
|
||||
<td>having given safety</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>rating</code></td>
|
||||
<td>alias of <code>safety</code></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ from szurubooru.func import util
|
|||
from szurubooru.search.base_search_config import BaseSearchConfig
|
||||
|
||||
def _type_transformer(value):
|
||||
available_types = {
|
||||
available_values = {
|
||||
'image': db.Post.TYPE_IMAGE,
|
||||
'animation': db.Post.TYPE_ANIMATION,
|
||||
'animated': db.Post.TYPE_ANIMATION,
|
||||
|
@ -17,10 +17,23 @@ def _type_transformer(value):
|
|||
'swf': db.Post.TYPE_FLASH,
|
||||
}
|
||||
try:
|
||||
return available_types[value.lower()]
|
||||
return available_values[value.lower()]
|
||||
except KeyError:
|
||||
raise errors.SearchError('Invalid type: %r. Available types: %r.' % (
|
||||
value, available_types))
|
||||
raise errors.SearchError('Invalid value: %r. Available values: %r.' % (
|
||||
value, available_values))
|
||||
|
||||
def _safety_transformer(value):
|
||||
available_values = {
|
||||
'safe': db.Post.SAFETY_SAFE,
|
||||
'sketchy': db.Post.SAFETY_SKETCHY,
|
||||
'questionable': db.Post.SAFETY_SKETCHY,
|
||||
'unsafe': db.Post.SAFETY_UNSAFE,
|
||||
}
|
||||
try:
|
||||
return available_values[value.lower()]
|
||||
except KeyError:
|
||||
raise errors.SearchError('Invalid value: %r. Available values: %r.' % (
|
||||
value, available_values))
|
||||
|
||||
class PostSearchConfig(BaseSearchConfig):
|
||||
def create_filter_query(self):
|
||||
|
@ -111,6 +124,8 @@ class PostSearchConfig(BaseSearchConfig):
|
|||
self._create_date_filter(db.Post.last_favorite_time),
|
||||
('feature-date', 'feature-time'):
|
||||
self._create_date_filter(db.Post.last_feature_time),
|
||||
('safety', 'rating'):
|
||||
self._create_str_filter(db.Post.safety, _safety_transformer),
|
||||
})
|
||||
|
||||
@property
|
||||
|
|
|
@ -292,6 +292,22 @@ def test_filter_by_type(verify_unpaged, post_factory, input, expected_post_ids):
|
|||
db.session.add_all([post1, post2, post3, post4])
|
||||
verify_unpaged(input, expected_post_ids)
|
||||
|
||||
@pytest.mark.parametrize('input,expected_post_ids', [
|
||||
('safety:safe', [1]),
|
||||
('safety:sketchy', [2]),
|
||||
('safety:questionable', [2]),
|
||||
('safety:unsafe', [3]),
|
||||
])
|
||||
def test_filter_by_safety(verify_unpaged, post_factory, input, expected_post_ids):
|
||||
post1 = post_factory(id=1)
|
||||
post2 = post_factory(id=2)
|
||||
post3 = post_factory(id=3)
|
||||
post1.safety = db.Post.SAFETY_SAFE
|
||||
post2.safety = db.Post.SAFETY_SKETCHY
|
||||
post3.safety = db.Post.SAFETY_UNSAFE
|
||||
db.session.add_all([post1, post2, post3])
|
||||
verify_unpaged(input, expected_post_ids)
|
||||
|
||||
def test_filter_by_invalid_type(executor):
|
||||
with pytest.raises(errors.SearchError):
|
||||
actual_count, actual_posts = executor.execute(
|
||||
|
|
Loading…
Reference in a new issue