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