Skip to content

Commit 3c39c24

Browse files
committed
Add functions to manage teams
1 parent 977b27f commit 3c39c24

File tree

7 files changed

+495
-10
lines changed

7 files changed

+495
-10
lines changed

ramp-database/ramp_database/model/event.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,11 @@ def set_n_submissions(self):
210210
each team."""
211211
self.n_submissions = 0
212212
for event_team in self.event_teams:
213-
# substract one for starting kit
214-
self.n_submissions += len(event_team.submissions) - 1
213+
if event_team.team.is_individual:
214+
# substract one for starting kit
215+
self.n_submissions += len(event_team.submissions) - 1
216+
else:
217+
self.n_submissions += len(event_team.submissions)
215218

216219
@property
217220
def Predictions(self):
@@ -567,3 +570,8 @@ def __init__(self, event, team):
567570

568571
def __repr__(self):
569572
return "{}/{}".format(self.event, self.team)
573+
574+
@property
575+
def is_locked(self):
576+
"""Check if event team is locked"""
577+
return len(self.submissions) > 1

ramp-database/ramp_database/testing.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def setup_ramp_kit_ramp_data(
158158
'it, you need to set "force=True".'
159159
)
160160
shutil.rmtree(problem_kit_path, ignore_errors=True)
161-
ramp_kit_url = "https://github.com/ramp-kits/{}.git".format(problem_name)
161+
ramp_kit_url = f"https://github.com/ramp-kits/{problem_name}.git"
162162
kwargs = {}
163163
if depth is not None:
164164
kwargs["depth"] = depth

ramp-database/ramp_database/tools/_query.py

+88
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
reduces the complexity of having queries and database connection in the same
44
file. Then, those queries are tested through the public API.
55
"""
6+
from typing import Optional, List
7+
68
from ..model import Event
79
from ..model import EventAdmin
810
from ..model import EventTeam
@@ -14,6 +16,7 @@
1416
from ..model import SubmissionSimilarity
1517
from ..model import Team
1618
from ..model import User
19+
from ..model import UserTeam
1720
from ..model import Workflow
1821
from ..model import WorkflowElement
1922
from ..model import WorkflowElementType
@@ -145,6 +148,57 @@ def select_event_team_by_name(session, event_name, team_name):
145148
)
146149

147150

151+
def select_event_team_by_user_name(
152+
session, event_name: str, user_name: str
153+
) -> Optional[EventTeam]:
154+
"""Query an event-team entry given the event and user name.
155+
156+
Parameters
157+
----------
158+
session : :class:`sqlalchemy.orm.Session`
159+
The session to query the database.
160+
event_name : str
161+
The name of the RAMP event.
162+
user_name : str
163+
The name of the user.
164+
165+
Returns
166+
-------
167+
event_team : :class:`ramp_database.model.EventTeam`
168+
The queried event-team.
169+
"""
170+
event = select_event_by_name(session, event_name)
171+
user = select_user_by_name(session, user_name)
172+
if event is None or user is None:
173+
return None
174+
175+
event_team = (
176+
session.query(EventTeam)
177+
.filter(
178+
EventTeam.event == event,
179+
EventTeam.team_id == UserTeam.team_id,
180+
UserTeam.user == user,
181+
UserTeam.status == "accepted",
182+
)
183+
.first()
184+
)
185+
186+
if event_team is None:
187+
# No classical team found. Fall back to individual teams
188+
189+
event_team = (
190+
session.query(EventTeam)
191+
.filter(
192+
EventTeam.event == event,
193+
EventTeam.team_id == Team.id,
194+
Team.admin == user,
195+
Team.name == user.name,
196+
)
197+
.one_or_none()
198+
)
199+
return event_team
200+
201+
148202
def select_user_by_name(session, user_name):
149203
"""Query an user given its name.
150204
@@ -203,6 +257,40 @@ def select_team_by_name(session, team_name):
203257
return session.query(Team).filter(Team.name == team_name).one_or_none()
204258

205259

260+
def select_team_invites_by_user_name(
261+
session, event_name: str, user_name: str
262+
) -> List[Team]:
263+
"""Query a team given its name.
264+
265+
Parameters
266+
----------
267+
session : :class:`sqlalchemy.orm.Session`
268+
The session to query the database.
269+
event_name : str
270+
The name of the RAMP event.
271+
user_name : str
272+
The user name to query.
273+
274+
Returns
275+
-------
276+
teams : a list of :class:`ramp_database.model.Team`
277+
A list of team invites
278+
"""
279+
return (
280+
session.query(Team)
281+
.filter(
282+
EventTeam.team_id == Team.id,
283+
EventTeam.event_id == Event.id,
284+
Team.id == UserTeam.team_id,
285+
UserTeam.user_id == User.id,
286+
UserTeam.status == "asked",
287+
User.name == user_name,
288+
Event.name == event_name,
289+
)
290+
.all()
291+
)
292+
293+
206294
def select_problem_by_name(session, problem_name):
207295
"""Query a problem given its name.
208296

ramp-database/ramp_database/tools/submission.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import logging
44
import os
55
import shutil
6+
from typing import Optional
67

78
import numpy as np
89
import pandas as pd
@@ -36,7 +37,14 @@
3637

3738
# Add functions: add information to the database
3839
# TODO: move the queries in "_query"
39-
def add_submission(session, event_name, team_name, submission_name, submission_path):
40+
def add_submission(
41+
session,
42+
event_name,
43+
team_name,
44+
submission_name,
45+
submission_path,
46+
user_name: Optional[str] = None,
47+
):
4048
"""Create a submission in the database and returns an handle.
4149
4250
Parameters
@@ -53,6 +61,9 @@ def add_submission(session, event_name, team_name, submission_name, submission_p
5361
The path of the files associated to the current submission. It will
5462
corresponds to the key `ramp_kit_subissions_dir` of the dictionary
5563
created with :func:`ramp_utils.generate_ramp_config`.
64+
user_name: str, default=None
65+
Optional user name to make the submission as for non
66+
individual teams. This is only used for audits.
5667
5768
Returns
5869
-------
@@ -101,7 +112,10 @@ def add_submission(session, event_name, team_name, submission_name, submission_p
101112
)
102113

103114
submission = Submission(
104-
name=submission_name, event_team=event_team, session=session
115+
name=submission_name,
116+
event_team=event_team,
117+
session=session,
118+
user_name=user_name,
105119
)
106120
for cv_fold in event.cv_folds:
107121
submission_on_cv_fold = SubmissionOnCVFold(

0 commit comments

Comments
 (0)