Passed
Push — main ( 96a9c8...42cd7b )
by Jochen
02:26
created

DbUserGroupMembership.__init__()   A

Complexity

Conditions 1

Size

Total Lines 11
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1.008

Importance

Changes 0
Metric Value
cc 1
eloc 10
nop 5
dl 0
loc 11
ccs 4
cts 5
cp 0.8
crap 1.008
rs 9.9
c 0
b 0
f 0
1
"""
2
byceps.services.user_group.dbmodels
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2014-2024 Jochen Kupperschmidt
6
:License: Revised BSD (see `LICENSE` file for details)
7
"""
8
9 1
from datetime import datetime
10
from uuid import UUID
11 1
12 1
from sqlalchemy.ext.associationproxy import association_proxy
13 1
from sqlalchemy.orm import Mapped, mapped_column, relationship
14
15 1
from byceps.database import db
16 1
from byceps.services.party.models import PartyID
17
from byceps.services.user.dbmodels.user import DbUser
18 1
from byceps.services.user.models.user import UserID
19 1
from byceps.util.instances import ReprBuilder
20 1
21 1
22 1
class DbUserGroup(db.Model):
23 1
    """A self-organized group of users."""
24
25
    __tablename__ = 'user_groups'
26 1
    __table_args__ = (db.UniqueConstraint('party_id', 'title'),)
27
28
    id: Mapped[UUID] = mapped_column(db.Uuid, primary_key=True)
29 1
    party_id: Mapped[PartyID] = mapped_column(
30 1
        db.UnicodeText, db.ForeignKey('parties.id'), index=True
31
    )
32 1
    created_at: Mapped[datetime]
33
    creator_id: Mapped[UserID] = mapped_column(
34
        db.Uuid, db.ForeignKey('users.id'), unique=True
35 1
    )
36
    creator: Mapped[DbUser] = relationship(DbUser)
37
    title: Mapped[str] = mapped_column(db.UnicodeText, unique=True)
38 1
    description: Mapped[str | None] = mapped_column(db.UnicodeText)
39 1
40
    members = association_proxy('memberships', 'user')
41
42 1
    def __init__(
43 1
        self,
44 1
        group_id: UUID,
45
        party_id: PartyID,
46
        created_at: datetime,
47
        creator_id: UserID,
48 1
        title: str,
49
        description: str | None = None,
50 1
    ) -> None:
51
        self.id = group_id
52
        self.party_id = party_id
53
        self.created_at = created_at
54
        self.creator_id = creator_id
55
        self.title = title
56
        self.description = description
57
58
    @property
59
    def member_count(self) -> int:
60
        return len(self.members)
61
62 1
    def __repr__(self) -> str:
63 1
        return (
64
            ReprBuilder(self)
65
            .add_with_lookup('party_id')
66 1
            .add_with_lookup('title')
67
            .build()
68
        )
69
70
71
class DbUserGroupMembership(db.Model):
72
    """The assignment of a user to a user group.
73
74
    A user must not be a member of more than one group per party.
75 1
    """
76
77
    __tablename__ = 'user_group_memberships'
78
79
    id: Mapped[UUID] = mapped_column(db.Uuid, primary_key=True)
80
    group_id: Mapped[UUID] = mapped_column(
81 1
        db.Uuid, db.ForeignKey('user_groups.id')
82
    )
83 1
    group: Mapped[DbUserGroup] = relationship(
84
        DbUserGroup, collection_class=set, backref='memberships'
85
    )
86 1
    user_id: Mapped[UserID] = mapped_column(db.Uuid, db.ForeignKey('users.id'))
87
    user: Mapped[DbUser] = relationship(DbUser, backref='group_membership')
88
    created_at: Mapped[datetime]
89 1
90
    def __init__(
91
        self,
92 1
        membership_id: UUID,
93 1
        group_id: UUID,
94 1
        user_id: UserID,
95
        created_at: datetime,
96 1
    ) -> None:
97
        self.id = membership_id
98
        self.group_id = group_id
99
        self.user_id = user_id
100
        self.created_at = created_at
101
102
    def __repr__(self) -> str:
103
        return (
104
            ReprBuilder(self)
105
            .add_with_lookup('id')
106
            .add_with_lookup('group')
107
            .add_with_lookup('user')
108
            .build()
109
        )
110