Skip to content

Commit a613a96

Browse files
authored
Merge pull request #254 from PROCOLLAB-github/verybigsad-pro-53
Добавить возможность делать только "от" или только "до" в фильтрах по возрасту
2 parents dbdd3a6 + af0ed71 commit a613a96

2 files changed

Lines changed: 31 additions & 15 deletions

File tree

users/filters.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import datetime
21
from django.contrib.auth import get_user_model
32
from django.db.models import Q
43
from django_filters import rest_framework as filters
54

65
from partner_programs.models import PartnerProgram, PartnerProgramUserProfile
6+
from users.utils import filter_age
77

88
User = get_user_model()
9+
MIN_AGE_VALUE = 0
10+
MAX_AGE_VALUE = 1000
911

1012

1113
class UserFilter(filters.FilterSet):
@@ -45,19 +47,12 @@ def filter_by_partner_program(cls, queryset, name, value):
4547
return User.objects.none()
4648

4749
@classmethod
48-
def filter_age(cls, queryset, name, value):
49-
start, stop = map(int, value.split(","))
50-
start, stop = min(start, stop), max(start, stop)
51-
return queryset.filter(
52-
Q(
53-
birthday__gte=datetime.datetime.now()
54-
- datetime.timedelta(days=365.24 * int(stop))
55-
)
56-
& Q(
57-
birthday__lte=datetime.datetime.now()
58-
- datetime.timedelta(days=365.24 * int(start))
59-
)
60-
)
50+
def filter_age__gte(cls, queryset, name, value):
51+
return filter_age(queryset, value, MAX_AGE_VALUE)
52+
53+
@classmethod
54+
def filter_age__lte(cls, queryset, name, value):
55+
return filter_age(queryset, MIN_AGE_VALUE, value)
6156

6257
@classmethod
6358
def filter_by_fullname(cls, queryset, name, value):
@@ -93,7 +88,8 @@ def filter_by_fullname(cls, queryset, name, value):
9388
)
9489
fullname = filters.CharFilter(method="filter_by_fullname")
9590

96-
age = filters.Filter(field_name="age", method="filter_age")
91+
age__gte = filters.Filter(method="filter_age__gte")
92+
age__lte = filters.Filter(method="filter_age__lte")
9793

9894
class Meta:
9995
model = User

users/utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from datetime import datetime, timedelta
2+
from django.db.models import Q
3+
4+
5+
def filter_age(queryset, start: int, stop: int):
6+
"""Filters given queryset by age range
7+
8+
Args:
9+
queryset (_type_): Queryset of CustomUser
10+
start (int): start age, included
11+
stop (int): end age range, included
12+
13+
Returns:
14+
Queryset: Filtered queryset of users
15+
"""
16+
start, stop = min(start, stop), max(start, stop)
17+
return queryset.filter(
18+
Q(birthday__gte=datetime.now() - timedelta(days=365.24 * int(stop)))
19+
& Q(birthday__lte=datetime.now() - timedelta(days=365.24 * int(start)))
20+
)

0 commit comments

Comments
 (0)