|
1 | 1 | from datetime import datetime |
2 | 2 |
|
3 | 3 | import sqlalchemy |
4 | | -from sqlalchemy import select, update |
| 4 | +from sqlalchemy import select, update, delete |
| 5 | +from sqlalchemy.sql.expression import func |
5 | 6 | from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session |
6 | 7 |
|
7 | | -# from handlers import custom_types |
| 8 | + |
8 | 9 |
|
9 | 10 | USERNAME = 'umschooluser' |
10 | 11 | PASSWORD = 'umschoolpswd' |
@@ -110,91 +111,121 @@ def delete_question_by_id_db(question_id: int, session: Session): |
110 | 111 | удалить вопрос, варианты ответа, |
111 | 112 | а также всю статистику связанную с ним из бд |
112 | 113 | """ |
113 | | - pass |
| 114 | + with session.begin(): |
| 115 | + stmt = delete(Question).where(Question.id == question_id) |
| 116 | + session.execute(stmt) |
| 117 | + stmt = delete(Choice).where(Choice.question_id == question_id) |
| 118 | + session.execute(stmt) |
| 119 | + stmt = delete(UserStat).where(UserStat.question_id == question_id) |
| 120 | + session.execute(stmt) |
| 121 | + session.commit() |
114 | 122 |
|
115 | 123 |
|
116 | 124 | @decorator_add_session |
117 | 125 | def get_all_stat(session: Session) -> list[list]: |
118 | 126 | """ |
119 | 127 | получить статистику пользователей |
120 | 128 | """ |
121 | | - return [[]] |
| 129 | + stmt = ( |
| 130 | + select(Question.question_text, Choice.choice_text, Choice.votes) |
| 131 | + .select_from(UserStat) |
| 132 | + .join(Choice, UserStat.choice_id == Choice.id) |
| 133 | + .join(Question, Choice.question_id == Question.id) |
| 134 | + ) |
| 135 | + result = session.execute(stmt) |
| 136 | + out = [] |
| 137 | + for row in result: |
| 138 | + out.append(row) |
| 139 | + return out |
122 | 140 |
|
123 | 141 |
|
124 | 142 | @decorator_add_session |
125 | 143 | def get_personal_stat(telegram_id: int, session: Session) -> list[list]: |
126 | 144 | """ |
127 | 145 | получить личную статистику пользователя |
128 | 146 | """ |
129 | | - return [[]] |
| 147 | + stmt = ( |
| 148 | + select(Question.question_text, Choice.choice_text) |
| 149 | + .select_from(UserStat) |
| 150 | + .where(UserStat.tg_user_id == telegram_id) |
| 151 | + .join(Choice, UserStat.choice_id == Choice.id) |
| 152 | + .join(Question, Choice.question_id == Question.id) |
| 153 | + ) |
| 154 | + result = session.execute(stmt) |
| 155 | + out = [] |
| 156 | + for row in result: |
| 157 | + out.append(row) |
| 158 | + return out |
130 | 159 |
|
131 | 160 |
|
132 | 161 | @decorator_add_session |
133 | | -def get_random_question(telegram_id: int, session: Session): |
| 162 | +def get_random_question(telegram_id: int, session: Session) -> Question: |
134 | 163 | """ |
135 | 164 | получить случайный, неотвеченный вопрос из бд |
136 | 165 |
|
137 | 166 | return: tuple |
138 | 167 | """ |
139 | | - available_ids = set() |
140 | | - answered_ids = set() |
141 | | - text = "" |
142 | | - id_ = -1 |
143 | | - with session.begin(): |
144 | | - stmt = select(Question.id).where(1==1) |
145 | | - for id_ in session.scalars(stmt): |
146 | | - available_ids.add(id_) |
147 | | - stmt = select(UserStat).where(UserStat.tg_user_id == telegram_id) |
148 | | - for id_ in session.scalars(stmt): |
149 | | - answered_ids.add(id_) |
150 | | - id_ = list(available_ids - answered_ids)[0] |
151 | | - stmt = select(Question.question_text).where(Question.id == id_) |
152 | | - for txt in session.scalars(stmt): |
153 | | - text = txt |
154 | | - return (id_, text) |
| 168 | + stmt = ( |
| 169 | + select(Question.id, Question.question_text) |
| 170 | + .select_from(Question) |
| 171 | + .where( |
| 172 | + Question.id.notin_( |
| 173 | + select(UserStat.question_id) |
| 174 | + .where(UserStat.tg_user_id == telegram_id) |
| 175 | + .where(UserStat.question_id == Question.id) |
| 176 | + ) |
| 177 | + ) |
| 178 | + .order_by(func.random()) |
| 179 | + .limit(1) |
| 180 | + ) |
| 181 | + |
| 182 | + question = session.execute(stmt).first() |
| 183 | + if question is None: |
| 184 | + return (-1, "") |
| 185 | + |
| 186 | + return (question.id, question.question_text) |
155 | 187 |
|
156 | 188 |
|
157 | 189 | @decorator_add_session |
158 | 190 | def get_choices_by_question_id(question_id: int, session: Session) -> list[str]: |
159 | 191 | """ |
160 | 192 | получить ответы по заданному question_id |
161 | 193 | """ |
162 | | - choice_text = [] |
163 | | - with session.begin(): |
164 | | - stmt = select(Choice).where(Choice.question_id == question_id) |
165 | | - for choice in session.scalars(stmt): |
166 | | - choice_text.append(choice.choice_text) |
167 | | - return choice_text |
| 194 | + return [ |
| 195 | + (choice.id, choice.choice_text) |
| 196 | + for choice in session.scalars( |
| 197 | + select(Choice.id, Choice.choice_text) |
| 198 | + .where(Choice.question_id == question_id) |
| 199 | + .order_by(Choice.id) |
| 200 | + ) |
| 201 | + ] |
168 | 202 |
|
169 | 203 |
|
170 | 204 | @decorator_add_session |
171 | | -def add_user_vote_db(choice_id: int, telegram_id: int, session: Session): |
| 205 | +def add_user_vote_db(question_id: int, choice_id: int, telegram_id: int, session: Session): |
172 | 206 | """ |
173 | 207 | добавить голос пользователя выбранному варианту ответа |
174 | 208 | """ |
175 | 209 | with session.begin(): |
176 | | - stmt = select(Choice).where(Choice.id == choice_id) |
177 | | - result = session.execute(stmt) |
178 | | - votes = 0 |
179 | | - for choice in result.scalars(): |
180 | | - print(choice) |
181 | | - votes = choice.votes |
182 | | - |
183 | | - new_votes = votes + 1 |
184 | 210 | stmt = ( |
185 | 211 | update(Choice). |
186 | 212 | where(Choice.id == choice_id). |
187 | | - values(votes=new_votes) |
| 213 | + values(votes=Choice.votes+1) |
188 | 214 | ) |
189 | | - print(stmt, new_votes, choice_id) |
190 | 215 | session.execute(stmt) |
| 216 | + |
| 217 | + user_stat = UserStat(question_id=question_id, choice_id=choice_id, tg_user_id=telegram_id) |
| 218 | + session.add(user_stat) |
191 | 219 | session.commit() |
192 | 220 |
|
193 | 221 |
|
194 | 222 |
|
195 | 223 | if __name__ == "__main__": |
196 | | - print(get_random_question(1)) |
197 | | - print(get_choices_by_question_id(1)) |
| 224 | + # print(get_all_stat()) |
| 225 | + # print(get_personal_stat(369937974)) |
| 226 | + print(get_random_question(369937974)) |
| 227 | + # print(get_choices_by_question_id(1)) |
198 | 228 | # create_tables_in_db() |
199 | 229 | # add_question_to_db("test-question", datetime.now()) |
200 | 230 | # add_choice_to_db("test-choice", 20) |
| 231 | + # add_user_vote_db(3, 369937974) |
0 commit comments