- Downloads
Project 'mj/mo-submit' was moved to 'mo-p/osmo'. Please update any links and bookmarks that may still have the old path.
Implementováno mazání uživatelů
Zatím je dostupné pouze správci a umí vyřešit pouze triviální případy.
Showing
- mo/web/org_users.py 90 additions, 0 deletionsmo/web/org_users.py
- mo/web/templates/org_org.html 1 addition, 0 deletionsmo/web/templates/org_org.html
- mo/web/templates/org_user.html 1 addition, 0 deletionsmo/web/templates/org_user.html
- mo/web/templates/org_user_delete.html 28 additions, 0 deletionsmo/web/templates/org_user_delete.html
| ... | @@ -664,3 +664,93 @@ def org_orgs_import(): | ... | @@ -664,3 +664,93 @@ def org_orgs_import(): |
| year=mo.config.CURRENT_YEAR if form.only_this_year.data else None | year=mo.config.CURRENT_YEAR if form.only_this_year.data else None | ||
| ) | ) | ||
| return generic_import_page(form, imp, url_for('org_orgs_import'), template='org_global_orgs_import.html') | return generic_import_page(form, imp, url_for('org_orgs_import'), template='org_global_orgs_import.html') | ||
| class ConfirmDeleteForm(FlaskForm): | |||
| delete = SubmitField('Potvrdit smazání') | |||
| @app.route('/org/user/<int:user_id>/delete', methods=('GET', 'POST')) | |||
| def org_user_delete(user_id: int): | |||
| if not g.user.is_admin: | |||
| raise werkzeug.exceptions.Forbidden() | |||
| sess = db.get_session() | |||
| user = sess.query(db.User).get(user_id) | |||
| if not user: | |||
| raise werkzeug.exceptions.NotFound() | |||
| warnings = [] | |||
| errors = [] | |||
| pants = sess.query(db.Participant).filter_by(user=user).all() | |||
| for pant in pants: | |||
| warnings.append(f'Účastní se {pant.year}. ročníku') | |||
| pions = (sess.query(db.Participation) | |||
| .filter_by(user=user) | |||
| # .options(joinedload(db.Participation.contest, db.Participation.contest.round)) | |||
|
|||
| .all()) | |||
| for pion in pions: | |||
| warnings.append(f'Účastní se kola {pion.contest.round.round_code()}') | |||
| num_roles = sess.query(db.UserRole).filter_by(user=user).count() | |||
| if num_roles > 0: | |||
| warnings.append(f'Má přidělené role ({num_roles})') | |||
| sols = (sess.query(db.Solution) | |||
| .filter_by(user=user) | |||
| # .options(joinedload(db.Solution.task, db.Solution.task.round)) | |||
| .all()) | |||
| for sol in sols: | |||
| errors.append(f'Odevzdal úlohu {sol.task.code} v kole {sol.task.round.round_code()}') | |||
| num_papers = sess.query(db.Paper).filter_by(for_user_obj=user).count() | |||
| if num_papers: | |||
| errors.append(f'Patří mu řešení/opravy ({num_papers})') | |||
| num_uploads = sess.query(db.Paper).filter_by(uploaded_by_obj=user).count() | |||
| if num_uploads: | |||
| errors.append(f'Nahrál řešení/opravy ({num_uploads})') | |||
| logs = sess.query(db.Log).filter_by(user=user).all() | |||
| num_good_logs = 0 | |||
| num_bad_logs = 0 | |||
| for log in logs: | |||
| if log.details.get('reason', "") == 'user-join': | |||
| num_good_logs += 1 | |||
| else: | |||
| num_bad_logs += 1 | |||
| if num_good_logs > 0: | |||
| warnings.append(f'Vlastní záznamy v logu z registrace ({num_good_logs})') | |||
| if num_bad_logs > 0: | |||
| errors.append(f'Vlastní záznamy v logu ({num_bad_logs})') | |||
| form = ConfirmDeleteForm() | |||
| if form.validate_on_submit() and not errors: | |||
| sess.rollback() | |||
| conn = sess.connection() | |||
| pant_table = db.Participation.__table__ | |||
| pion_table = db.Participant.__table__ | |||
| role_table = db.UserRole.__table__ | |||
| log_table = db.Log.__table__ | |||
| conn.execute(pant_table.delete().where(pant_table.c.user_id == user.user_id)) | |||
| conn.execute(pion_table.delete().where(pion_table.c.user_id == user.user_id)) | |||
| conn.execute(role_table.delete().where(role_table.c.user_id == user.user_id)) | |||
| conn.execute(log_table.delete().where(log_table.c.changed_by == user.user_id)) | |||
| sess.commit() | |||
| mo.util.log( | |||
| type=db.LogType.user, | |||
| what=user.user_id, | |||
| details={'action': 'delete', 'user': db.row2dict(user)}, | |||
| ) | |||
| sess.delete(user) | |||
| sess.commit() | |||
| app.logger.info(f"Uživatel #{user.user_id} smazán") | |||
| flash('Uživatel smazán.', 'danger') | |||
| return redirect(url_for('org_orgs') if user.is_org else url_for('org_users')) | |||
| return render_template('org_user_delete.html', user=user, form=form, warnings=warnings, errors=errors) | |||
mo/web/templates/org_user_delete.html
0 → 100644