Skip to content

User

Bases: User_

Interface for interacting with planka Users and their included sub-objects

Source code in src/plankapy/interfaces.py
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
class User(User_):
    """Interface for interacting with planka Users and their included sub-objects

    """
    @property
    def projects(self) -> QueryableList[Project]:
        """All projects the user is a member of

        Returns:
            Queryable List of all projects the user is a member of
        """
        projects_route = self.routes.get_project_index()
        return QueryableList([
            Project(**project).bind(self.routes)
            for project in projects_route()['items']
        ]).select_where(lambda project: self in project.users)

    @property
    def boards(self) -> QueryableList[Board]:
        """All boards the user is a member of

        Returns:
            Queryable List of all boards the user is a member of
        """
        return QueryableList([
            boardMembership.board
            for project in self.projects
            for boardMembership in project.boardMemberships
            if boardMembership.userId == self.id
        ])

    @property
    def cards(self) -> QueryableList[Card]:
        """All cards assigned to the user in all projects

        Returns:
            Queryable List of all cards assigned to the user
        """
        return QueryableList([
            cardMembership.card
            for board in self.boards
            for cardMembership in board.cardMemberships
            if cardMembership.userId == self.id
        ])

    @property
    def manager_of(self) -> QueryableList[Project]:
        """All projects the user is a manager of

        Returns:
            Queryable List of all projects the user is a manager of
        """
        return QueryableList([
            project
            for project in self.projects
            for manager in project.managers
            if manager.id == self.id
        ])

    @property
    def notifications(self) -> QueryableList[Notification]:
        """All notifications for the user

        Returns:
            Queryable List of all notifications for the user
        """
        route = self.routes.get_notification_index()
        return QueryableList([
            Notification(**notification).bind(self.routes)
            for notification in route()['items']
            if notification['userId'] == self.id
        ])

    def download_avatar(self, path: Path) -> Path | None:
        """Download the user's avatar to a file

        Args:
            path (Path): Path to save the avatar image

        Raises:
            ValueError: If the user has no avatar
        """
        if self.avatarUrl is None:
            return None

        path = Path(path)
        path.write_bytes(self.routes.handler._get_file(self.avatarUrl))
        return path

    def set_avatar(self, image: Path) -> User:
        """Set the user's avatar

        Note:
            The image path can be a local filepath or a URL.

        Args:
            image (Path): Path to the image file

        Returns:
            User: Updated user instance
        """
        route = self.routes.post_user_avatar(id=self.id)
        return User(**route(_file=image)['item']).bind(self.routes)

    def remove_avatar(self) -> None:
        """Remove the user's avatar"""
        with self.editor():
            self.avatarUrl = None

    @overload
    def update(self) -> User: ...

    @overload
    def update(self, user: User) -> User: ...

    @overload
    def update(self, name: str=None, 
               username: str=None, email: str=None, 
               language: str=None, organization: str=None,
               phone: str=None, avatarUrl: str=None,
               isAdmin: bool=None, isDeletionLocked: bool=None,
               isLocked: bool=None, isRoleLocked: bool=None,
               isUsernameLocked: bool=None, subscribeToOwnCards:bool=None) -> User: ...

    def update(self, *args, **kwargs) -> User:
        """Updates the user with new values

        Args:
            name (str): Name of the user (optional)
            username (str): Username of the user (optional)
            email (str): Email of the user (optional)
            language (str): Language of the user (optional)
            organization (str): Organization of the user (optional)
            phone (str): Phone number of the user (optional)
            avatarUrl (str): Avatar url of the user (optional)
            isAdmin (bool): Whether the user is an admin (optional)
            isDeletionLocked (bool): Whether the user is deletion locked (optional)
            isLocked (bool): Whether the user is locked (optional)
            isRoleLocked (bool): Whether the user is role locked (optional)
            isUsernameLocked (bool): Whether the user is username locked (optional)
            subscribeToOwnCards (bool): Whether the user is subscribed to their own cards (optional)

        Args: Alternate
            user (User): User instance to update (required)

        Note:
            If no arguments are provided, the user will update itself with the current values stored in its attributes

        Returns:
            User: Updated user instance
        """
        overload = parse_overload(
            args, kwargs, 
            model='user', 
            options=('name', 'username', 'email', 'language', 
                     'organization', 'phone', 'avatarUrl', 
                     'isAdmin', 'isDeletionLocked', 'isLocked', 
                     'isRoleLocked', 'isUsernameLocked', 
                     'subscribeToOwnCards'),
            noarg=self)
        route = self.routes.patch_user(id=self.id)
        self.__init__(**route(**overload)['item'])
        return self

    def delete(self) -> User:
        """Deletes the user

        Danger:
            This action is irreversible and cannot be undone

        Returns:
            User: Deleted user instance
        """
        self.refresh()
        route = self.routes.delete_user(id=self.id)
        route()
        return self

    def refresh(self) -> None:
        """Refreshes the user data
        """
        route = self.routes.get_user(id=self.id)
        self.__init__(**route()['item'])

boards property

All boards the user is a member of

Returns:

Type Description
QueryableList[Board]

Queryable List of all boards the user is a member of

cards property

All cards assigned to the user in all projects

Returns:

Type Description
QueryableList[Card]

Queryable List of all cards assigned to the user

manager_of property

All projects the user is a manager of

Returns:

Type Description
QueryableList[Project]

Queryable List of all projects the user is a manager of

notifications property

All notifications for the user

Returns:

Type Description
QueryableList[Notification]

Queryable List of all notifications for the user

projects property

All projects the user is a member of

Returns:

Type Description
QueryableList[Project]

Queryable List of all projects the user is a member of

delete()

Deletes the user

Danger

This action is irreversible and cannot be undone

Returns:

Name Type Description
User User

Deleted user instance

Source code in src/plankapy/interfaces.py
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
def delete(self) -> User:
    """Deletes the user

    Danger:
        This action is irreversible and cannot be undone

    Returns:
        User: Deleted user instance
    """
    self.refresh()
    route = self.routes.delete_user(id=self.id)
    route()
    return self

download_avatar(path)

Download the user's avatar to a file

Parameters:

Name Type Description Default
path Path

Path to save the avatar image

required

Raises:

Type Description
ValueError

If the user has no avatar

Source code in src/plankapy/interfaces.py
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
def download_avatar(self, path: Path) -> Path | None:
    """Download the user's avatar to a file

    Args:
        path (Path): Path to save the avatar image

    Raises:
        ValueError: If the user has no avatar
    """
    if self.avatarUrl is None:
        return None

    path = Path(path)
    path.write_bytes(self.routes.handler._get_file(self.avatarUrl))
    return path

refresh()

Refreshes the user data

Source code in src/plankapy/interfaces.py
1327
1328
1329
1330
1331
def refresh(self) -> None:
    """Refreshes the user data
    """
    route = self.routes.get_user(id=self.id)
    self.__init__(**route()['item'])

remove_avatar()

Remove the user's avatar

Source code in src/plankapy/interfaces.py
1253
1254
1255
1256
def remove_avatar(self) -> None:
    """Remove the user's avatar"""
    with self.editor():
        self.avatarUrl = None

set_avatar(image)

Set the user's avatar

Note

The image path can be a local filepath or a URL.

Parameters:

Name Type Description Default
image Path

Path to the image file

required

Returns:

Name Type Description
User User

Updated user instance

Source code in src/plankapy/interfaces.py
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
def set_avatar(self, image: Path) -> User:
    """Set the user's avatar

    Note:
        The image path can be a local filepath or a URL.

    Args:
        image (Path): Path to the image file

    Returns:
        User: Updated user instance
    """
    route = self.routes.post_user_avatar(id=self.id)
    return User(**route(_file=image)['item']).bind(self.routes)

update(*args, **kwargs)

update() -> User
update(user: User) -> User
update(name: str = None, username: str = None, email: str = None, language: str = None, organization: str = None, phone: str = None, avatarUrl: str = None, isAdmin: bool = None, isDeletionLocked: bool = None, isLocked: bool = None, isRoleLocked: bool = None, isUsernameLocked: bool = None, subscribeToOwnCards: bool = None) -> User

Updates the user with new values

Parameters:

Name Type Description Default
name str

Name of the user (optional)

required
username str

Username of the user (optional)

required
email str

Email of the user (optional)

required
language str

Language of the user (optional)

required
organization str

Organization of the user (optional)

required
phone str

Phone number of the user (optional)

required
avatarUrl str

Avatar url of the user (optional)

required
isAdmin bool

Whether the user is an admin (optional)

required
isDeletionLocked bool

Whether the user is deletion locked (optional)

required
isLocked bool

Whether the user is locked (optional)

required
isRoleLocked bool

Whether the user is role locked (optional)

required
isUsernameLocked bool

Whether the user is username locked (optional)

required
subscribeToOwnCards bool

Whether the user is subscribed to their own cards (optional)

required

Alternate

Name Type Description Default
user User

User instance to update (required)

required
Note

If no arguments are provided, the user will update itself with the current values stored in its attributes

Returns:

Name Type Description
User User

Updated user instance

Source code in src/plankapy/interfaces.py
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
def update(self, *args, **kwargs) -> User:
    """Updates the user with new values

    Args:
        name (str): Name of the user (optional)
        username (str): Username of the user (optional)
        email (str): Email of the user (optional)
        language (str): Language of the user (optional)
        organization (str): Organization of the user (optional)
        phone (str): Phone number of the user (optional)
        avatarUrl (str): Avatar url of the user (optional)
        isAdmin (bool): Whether the user is an admin (optional)
        isDeletionLocked (bool): Whether the user is deletion locked (optional)
        isLocked (bool): Whether the user is locked (optional)
        isRoleLocked (bool): Whether the user is role locked (optional)
        isUsernameLocked (bool): Whether the user is username locked (optional)
        subscribeToOwnCards (bool): Whether the user is subscribed to their own cards (optional)

    Args: Alternate
        user (User): User instance to update (required)

    Note:
        If no arguments are provided, the user will update itself with the current values stored in its attributes

    Returns:
        User: Updated user instance
    """
    overload = parse_overload(
        args, kwargs, 
        model='user', 
        options=('name', 'username', 'email', 'language', 
                 'organization', 'phone', 'avatarUrl', 
                 'isAdmin', 'isDeletionLocked', 'isLocked', 
                 'isRoleLocked', 'isUsernameLocked', 
                 'subscribeToOwnCards'),
        noarg=self)
    route = self.routes.patch_user(id=self.id)
    self.__init__(**route(**overload)['item'])
    return self