1010from enum import Enum
1111from pydantic import BaseModel
1212import sqlalchemy as sa
13- from sqlalchemy .orm import Session
13+ from sqlalchemy .orm import Session , relationship
14+ from sqlalchemy .sql .expression import true
15+ from sqlalchemy .ext .declarative import declared_attr
1416from sqlalchemy .ext .declarative import declarative_base
1517from typing import Optional
1618
@@ -31,6 +33,13 @@ class DispatchUser(Base):
3133 email = sa .Column (sa .String )
3234
3335
36+ class Project (Base ):
37+ __tablename__ = "project"
38+ id = sa .Column (sa .Integer , primary_key = True )
39+ name = sa .Column (sa .String )
40+ default = sa .Column (sa .Boolean , default = False )
41+
42+
3443class Case (Base ):
3544 __tablename__ = "case"
3645 id = sa .Column (sa .Integer , primary_key = True )
@@ -72,11 +81,25 @@ class ParticipantRoleCreate(ParticipantRoleBase):
7281 role : Optional [ParticipantRoleType ]
7382
7483
75- class IndividualContact (Base ):
84+ class ProjectMixin (object ):
85+ """Project mixin"""
86+
87+ @declared_attr
88+ def project_id (cls ): # noqa
89+ return sa .Column (sa .Integer , sa .ForeignKey ("project.id" , ondelete = "CASCADE" ))
90+
91+ @declared_attr
92+ def project (cls ): # noqa
93+ return relationship ("Project" )
94+
95+
96+ class IndividualContact (Base , ProjectMixin ):
7697 __tablename__ = "individual_contact"
7798
7899 id = sa .Column (sa .Integer , primary_key = True )
79100 email = sa .Column (sa .String )
101+ name = sa .Column (sa .String )
102+ weblink = sa .Column (sa .String )
80103
81104
82105class Participant (Base ):
@@ -130,6 +153,19 @@ def upgrade():
130153 .filter (IndividualContact .email == current_user .email )
131154 .first ()
132155 )
156+ if individual is None :
157+ i = {}
158+ i ["email" ] = current_user .email
159+ i ["name" ] = current_user .email
160+ i ["weblink" ] = ""
161+ default_project = (
162+ db_session .query (Project ).filter (Project .default == true ()).one_or_none ()
163+ )
164+ individual = IndividualContact (
165+ ** i ,
166+ project = default_project if default_project else "default" ,
167+ )
168+ db_session .add (individual )
133169
134170 participant = Participant (
135171 individual_contact_id = individual .id ,
0 commit comments