|
1 | 1 | import datetime |
2 | | -import json |
3 | 2 | import logging |
4 | 3 | from math import ceil |
5 | 4 |
|
6 | 5 | from PyMatcha import celery |
7 | 6 | from PyMatcha import redis |
8 | 7 | from PyMatcha.models.message import Message |
9 | 8 | from PyMatcha.models.user import User |
10 | | -from PyMatcha.utils.match_score import _get_age_diff |
11 | | -from PyMatcha.utils.match_score import _get_common_tags |
12 | | -from PyMatcha.utils.match_score import _get_distance |
13 | | -from PyMatcha.utils.match_score import _get_gender_query |
| 9 | +from PyMatcha.utils.recommendations import create_user_recommendations |
14 | 10 |
|
15 | 11 | BASE_HEAT_SCORE = 30 |
16 | 12 | LIKES_MULTIPLIER = 2 |
@@ -102,66 +98,11 @@ def update_offline_users(): |
102 | 98 | ) |
103 | 99 |
|
104 | 100 |
|
105 | | -def default_date_converter(o): |
106 | | - if isinstance(o, datetime.datetime): |
107 | | - return o.__str__() |
108 | | - |
109 | | - |
110 | 101 | @celery.task |
111 | 102 | def update_user_recommendations(): |
112 | | - today = datetime.datetime.utcnow() |
113 | 103 | count = 0 |
114 | 104 | for user_to_update in User.select_all(): |
115 | | - count += 1 |
116 | | - user_to_update_recommendations = [] |
117 | | - if not user_to_update.birthdate: |
118 | | - continue |
119 | | - if not user_to_update.geohash: |
120 | | - continue |
121 | | - |
122 | | - user_to_update_age = ( |
123 | | - today.year |
124 | | - - user_to_update.birthdate.year |
125 | | - - ((today.month, today.day) < (user_to_update.birthdate.month, user_to_update.birthdate.day)) |
126 | | - ) |
127 | | - user_to_update_tags = [t.name for t in user_to_update.get_tags()] |
128 | | - |
129 | | - query = _get_gender_query(user_to_update.orientation, user_to_update.gender) |
130 | | - |
131 | | - for user in query: |
132 | | - if user.id == user_to_update.id: |
133 | | - continue |
134 | | - score = 0 |
135 | | - |
136 | | - distance = _get_distance(user_to_update.geohash, user.geohash) |
137 | | - if distance: |
138 | | - score -= distance |
139 | | - |
140 | | - user_age = ( |
141 | | - today.year |
142 | | - - user.birthdate.year |
143 | | - - ((today.month, today.day) < (user.birthdate.month, user.birthdate.day)) |
144 | | - ) |
145 | | - age_diff = _get_age_diff(user_to_update_age, user_age) |
146 | | - score -= age_diff |
147 | | - |
148 | | - user_tags = [t.name for t in user.get_tags()] |
149 | | - common_tags = _get_common_tags(user_to_update_tags, user_tags) |
150 | | - score += len(common_tags) * 2 |
151 | | - |
152 | | - score += user.heat_score |
153 | | - |
154 | | - d = {"score": score, "common_tags": common_tags, "distance": distance} |
155 | | - d.update(user.to_dict()) |
156 | | - user_to_update_recommendations.append(d) |
157 | | - user_to_update_recommendations_sorted = sorted( |
158 | | - user_to_update_recommendations, key=lambda x: x["score"], reverse=True |
159 | | - ) |
160 | | - redis.set( |
161 | | - f"user_recommendations:{str(user_to_update.id)}", |
162 | | - json.dumps(user_to_update_recommendations_sorted, default=default_date_converter), |
163 | | - ) |
164 | | - redis.expire(f"user_recommendations:{str(user_to_update.id)}", 3600) |
| 105 | + create_user_recommendations(user_to_update) |
165 | 106 | return f"Successfully updated recommendations for {count} users." |
166 | 107 |
|
167 | 108 |
|
|
0 commit comments