1
1
import datetime
2
2
3
+ from sqlalchemy import Enum
3
4
from sqlalchemy import Column
4
5
from sqlalchemy import String
5
6
from sqlalchemy import Integer
7
+ from sqlalchemy import Boolean
6
8
from sqlalchemy import DateTime
7
9
from sqlalchemy import ForeignKey
8
10
from sqlalchemy .orm import backref
9
11
from sqlalchemy .orm import relationship
10
12
13
+ from sqlalchemy import sql
14
+
11
15
from .base import Model
12
16
13
- __all__ = ["Team" ]
17
+ __all__ = ["Team" , "UserTeam" ]
14
18
15
19
16
20
class Team (Model ):
@@ -22,10 +26,8 @@ class Team(Model):
22
26
The name of the team.
23
27
admin : :class:`ramp_database.model.User`
24
28
The admin user of the team.
25
- initiator : None or :class:`ramp_database.model.Team`, default is None
26
- The team initiating a merging.
27
- acceptor : None or :class:`ramp_database.model.Team`, default is None
28
- The team accepting a merging.
29
+ is_individual : bool
30
+ This team is an individual team.
29
31
30
32
Attributes
31
33
----------
@@ -37,14 +39,6 @@ class Team(Model):
37
39
The ID of the admin user.
38
40
admin : :class:`ramp_database.model.User`
39
41
The admin user instance.
40
- initiator_id : int
41
- The ID of the team asking for merging.
42
- initiator : :class:`ramp_database.model.Team`
43
- The team instance asking for merging.
44
- acceptor_id : int
45
- The ID of the team accepting the merging.
46
- acceptor : :class:`ramp_database.model.Team`
47
- The team instance accepting the merging.
48
42
team_events : :class:`ramp_database.model.EventTeam`
49
43
A back-reference to the events to which the team is enroll.
50
44
"""
@@ -59,30 +53,68 @@ class Team(Model):
59
53
"User" , backref = backref ("admined_teams" , cascade = "all, delete" )
60
54
)
61
55
62
- # initiator asks for merge, acceptor accepts
63
- initiator_id = Column (Integer , ForeignKey ("teams.id" ), default = None )
64
- initiator = relationship (
65
- "Team" , primaryjoin = ("Team.initiator_id == Team.id" ), uselist = False
66
- )
67
-
68
- acceptor_id = Column (Integer , ForeignKey ("teams.id" ), default = None )
69
- acceptor = relationship (
70
- "Team" , primaryjoin = ("Team.acceptor_id == Team.id" ), uselist = False
71
- )
72
-
56
+ is_individual = Column (Boolean , default = True , nullable = False )
73
57
creation_timestamp = Column (DateTime , nullable = False )
74
58
75
- def __init__ (self , name , admin , initiator = None , acceptor = None ):
59
+ def __init__ (self , name , admin , is_individual = True ):
76
60
self .name = name
77
61
self .admin = admin
78
- self .initiator = initiator
79
- self .acceptor = acceptor
80
62
self .creation_timestamp = datetime .datetime .utcnow ()
63
+ self .is_individual = is_individual
81
64
82
65
def __str__ (self ):
83
- return "Team({})" .format (self .name )
66
+ return f"Team({ self .name } )"
67
+
68
+ def __repr__ (self ):
69
+ return (
70
+ f"Team(name={ self .name } , admin_name={ self .admin .name } , "
71
+ f"is_individual={ self .is_individual } )"
72
+ )
73
+
74
+
75
+ class UserTeam (Model ):
76
+ """User to team many-to-many association table.
77
+
78
+ Parameters
79
+ ----------
80
+ user_id : int
81
+ The ID of the user.
82
+ team_id : int
83
+ The ID of the team.
84
+ status: str
85
+ The relationship status. One of "asked", "accepted".
86
+
87
+ Attributes
88
+ ----------
89
+ id : int
90
+ The ID of the table row.
91
+ update_timestamp : datetime
92
+ Last updated timestamp.
93
+ """
94
+
95
+ __tablename__ = "user_teams"
96
+
97
+ id = Column (Integer , primary_key = True )
98
+ user_id = Column (Integer , ForeignKey ("users.id" ))
99
+ user = relationship (
100
+ "User" , backref = backref ("user_user_team" , cascade = "all, delete" )
101
+ )
102
+ team_id = Column (Integer , ForeignKey ("teams.id" ))
103
+ team = relationship (
104
+ "Team" , backref = backref ("team_user_team" , cascade = "all, delete" )
105
+ )
106
+ status = Column (Enum ("asked" , "accepted" , name = "status" ), default = "asked" )
107
+ update_timestamp = Column (
108
+ DateTime , onupdate = sql .func .now (), server_default = sql .func .now ()
109
+ )
110
+
111
+ def __init__ (self , user_id , team_id , status = "asked" ):
112
+ self .user_id = user_id
113
+ self .team_id = team_id
114
+ self .status = status
84
115
85
116
def __repr__ (self ):
86
- return "Team(name={}, admin_name={}, initiator={}, acceptor={})" .format (
87
- self .name , self .admin .name , self .initiator , self .acceptor
117
+ return (
118
+ f"UserTeam(user_id={ self .user_id } , team_id={ self .team_id } , "
119
+ f"status='{ self .status } ')"
88
120
)
0 commit comments