From a09b8eab7ac678415694b2f0fd4d19822886a424 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Mon, 11 Jan 2021 17:23:12 +0100
Subject: [PATCH] =?UTF-8?q?Opraven=20v=C3=BDpis=20=C3=BAloh=20dostupn?=
 =?UTF-8?q?=C3=BDch=20=C3=BA=C4=8Dastn=C3=ADkovi?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Byl v tom kouzelný bug: Úloha z výpisu občas zmizela, pokud ji odevzdal
jiný účastník :)

Poučení: U vnějšího JOINu záleží na tom, jestli je podmínka uvedena u JOINu
nebo až ve WHERE.
---
 mo/web/user.py | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/mo/web/user.py b/mo/web/user.py
index 88c33fc0..3c097386 100644
--- a/mo/web/user.py
+++ b/mo/web/user.py
@@ -3,7 +3,7 @@ from flask_wtf import FlaskForm
 import flask_wtf.file
 import os
 import secrets
-from sqlalchemy import or_
+from sqlalchemy import or_, and_
 from sqlalchemy.orm import joinedload
 from typing import Optional
 import werkzeug.exceptions
@@ -74,9 +74,8 @@ def user_contest(id: int):
 
     task_sols = (db.get_session().query(db.Task, db.Solution)
                  .select_from(db.Task)
-                 .outerjoin(db.Solution)
+                 .outerjoin(db.Solution, and_(db.Solution.task_id == db.Task.task_id, db.Solution.user == g.user))
                  .filter(db.Task.round == contest.round)
-                 .filter(or_(db.Solution.user_id == None, db.Solution.user == g.user))
                  .options(joinedload(db.Solution.final_submit_obj),
                           joinedload(db.Solution.final_feedback_obj))
                  .order_by(db.Task.code)
-- 
GitLab