From e9be533ec7bd1bd88918d1e7245e1e6ab8acaf3d Mon Sep 17 00:00:00 2001 From: axolotle Date: Tue, 17 Jan 2023 19:17:50 +0100 Subject: [PATCH] update some test views with new syntax --- src/user.py | 88 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 32 deletions(-) diff --git a/src/user.py b/src/user.py index 4a1187102..792e0254f 100644 --- a/src/user.py +++ b/src/user.py @@ -1,3 +1,5 @@ +from __future__ import annotations + # # Copyright (c) 2022 YunoHost Contributors # @@ -26,16 +28,17 @@ import string import subprocess import copy -from typing import Optional +from typing import Annotated, Optional from moulinette import Moulinette, m18n from moulinette.utils.log import getActionLogger from moulinette.utils.process import check_output -from yunohost.interface import Interface, InterfaceKind +from yunohost.interface import Field, Interface, InterfaceKind +from yunohost.interface.types import Private from yunohost.utils.error import YunohostError, YunohostValidationError from yunohost.service import service_status -from yunohost.log import is_unit_operation +from yunohost.log import OperationLogger, is_unit_operation from yunohost.utils.system import binary_to_human logger = getActionLogger("yunohost.user") @@ -59,6 +62,30 @@ FIELDS_FOR_IMPORT = { ADMIN_ALIASES = ["root", "admin", "admins", "webmaster", "postmaster", "abuse"] +DepreciatedField = Field(deprecated=True) +UsernameField = Field(pattern=("pattern_username", r"^[a-z0-9_]+$"), example="username") +FullnameField = Field( + param_decls=["-F"], + ask=True, + pattern=("pattern_fullname", r"^([^\W\d_]{1,30}[ ,.'-]{0,3})+$"), + example="Camille Dupont", +) +DomainField = Field( + pattern=( + "pattern_domain", + r"^([^\W_A-Z]+([-]*[^\W_A-Z]+)*\.)+((xn--)?[^\W_]{2,})$", + ), + example="domain.tld", +) +PasswordField = Field( + ask=True, + confirm=True, + redac=True, + pattern=("pattern_password", r"^.{3,}$"), + example="secret_password", +) +MailboxQuotaField = Field(pattern=("pattern_mailbox_quota", r"^(\d+[bkMGT])|0$")) + @user.api("/list") @user.cli("list") @@ -139,31 +166,20 @@ def user_list(fields: list[str] = ["username", "fullname", "mail", "mailbox-quot return {"users": users} -@user( - private=["from_import"], - username={"pattern": "^[a-z0-9_]+$"}, - firstname={"deprecated": True}, - lastname={"deprecated": True}, -) @user.api("/create", method="post", as_body=True) -@user.cli( - "create {username}", - domain={"prompt": True}, - password={"prompt": True}, - fullname={"prompt": True}, -) +@user.cli("create {username}") @is_unit_operation([("username", "user")]) def user_create( - operation_logger, - username: str, - domain: str, - password: str, - fullname: Optional[str] = None, - mailbox_quota: str = "0", + operation_logger: Private[OperationLogger], + username: Annotated[str, UsernameField], + domain: Annotated[str, DomainField], + password: Annotated[str, PasswordField], + fullname: Annotated[Optional[str], FullnameField] = None, + mailbox_quota: Annotated[str, MailboxQuotaField] = "0", + firstname: Annotated[Optional[str], DepreciatedField] = None, + lastname: Annotated[Optional[str], DepreciatedField] = None, admin: bool = False, - firstname: Optional[str] = None, - lastname: Optional[str] = None, - from_import: bool = False, + from_import: Private[bool] = False, ): """ Create user @@ -171,9 +187,9 @@ def user_create( - **username**: The unique username to create - **domain**: Domain for the email address and xmpp account - **password**: User password - - **fullname**: The full name of the user + - **fullname**: The full name of the user (ex: 'Camille Dupont') - **mailbox_quota**: Mailbox size quota - - **admin**: Add in adrmin group + - **admin**: Add in `admin` group - **firstname**: Deprecated. Use `--fullname` instead. - **lastname**: Deprecated. Use `--fullname` instead. \f @@ -706,12 +722,14 @@ def user_export(): return body -@user(csvfile={"file": True}) @user.api("/import", method="post") -@user.cli("import") +@user.cli("import {csvfile}") @is_unit_operation() def user_import( - operation_logger, csvfile: str, update: bool = False, delete: bool = False + operation_logger: Private[OperationLogger], + csvfile: Annotated[str, Field(file=True)], + update: bool = False, + delete: bool = False, ): """ Import users from CSV @@ -979,6 +997,10 @@ def user_import( # # Group subcategory # + +GroupnameField = Field(pattern=("pattern_groupname", r"^[a-z0-9_]+$")) + + def user_group_list(short=False, full=False, include_primary_groups=True): """ List users @@ -1324,7 +1346,7 @@ def user_group_update( @group.api("/{groupname}") @group.cli("info {groupname}") -def user_group_info(groupname): +def user_group_info(groupname: Annotated[str, GroupnameField]): """ Get user informations @@ -1360,11 +1382,13 @@ def user_group_info(groupname): } -@group(private=["force", "sync_perm"]) @group.api("/{groupname}/add", method="put") @group.cli("add {groupname} {usernames}") def user_group_add( - groupname: str, usernames: list[str], force: bool = False, sync_perm: bool = True + groupname: Annotated[str, GroupnameField], + usernames: Annotated[list[str], UsernameField], + force: Private[bool] = False, + sync_perm: Private[bool] = True, ): """ Add user(s) to a group