From 5f01dd5625c0dd6c33138a55020e5503788455bb Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 4 Jul 2024 07:13:49 +0800 Subject: [PATCH] fix user --- app/api/endpoints/login.py | 4 +++- app/chain/__init__.py | 1 + app/chain/download.py | 2 +- app/chain/mediaserver.py | 4 ++-- app/chain/subscribe.py | 1 - app/db/models/user.py | 13 +++++++++---- app/helper/notification.py | 19 ++++++++++++++----- app/modules/slack/__init__.py | 2 +- app/modules/synologychat/__init__.py | 2 +- app/modules/telegram/__init__.py | 2 +- app/modules/vocechat/__init__.py | 2 +- app/modules/wechat/__init__.py | 2 +- app/schemas/system.py | 14 ++++++++++++++ app/schemas/types.py | 2 ++ 14 files changed, 51 insertions(+), 19 deletions(-) diff --git a/app/api/endpoints/login.py b/app/api/endpoints/login.py index 0b3a27ca..fb68d509 100644 --- a/app/api/endpoints/login.py +++ b/app/api/endpoints/login.py @@ -1,3 +1,4 @@ +import json from datetime import timedelta from typing import Any, List @@ -72,7 +73,8 @@ async def login_access_token( super_user=user.is_superuser, user_name=user.name, avatar=user.avatar, - level=level + level=level, + permissions=json.loads(user.permissions or '{}') ) diff --git a/app/chain/__init__.py b/app/chain/__init__.py index 661766f7..d1b97465 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -454,6 +454,7 @@ class ChainBase(metaclass=ABCMeta): :param message: 消息体 :return: 成功或失败 """ + # TODO 根据消息场景开关决定发给谁 logger.info(f"发送消息:channel={message.channel}," f"source={message.source}," f"title={message.title}, " diff --git a/app/chain/download.py b/app/chain/download.py index a404c743..a78c8ab9 100644 --- a/app/chain/download.py +++ b/app/chain/download.py @@ -339,7 +339,7 @@ class DownloadChain(ChainBase): if files_to_add: self.downloadhis.add_files(files_to_add) - # 发送消息(群发,不带channel和userid) + # 发送消息 TODO 根据消息场景开关决定发给谁 self.post_download_message(meta=_meta, mediainfo=_media, torrent=_torrent, username=username, download_episodes=download_episodes) # 下载成功后处理 diff --git a/app/chain/mediaserver.py b/app/chain/mediaserver.py index e876249e..f9ae8645 100644 --- a/app/chain/mediaserver.py +++ b/app/chain/mediaserver.py @@ -81,11 +81,11 @@ class MediaServerChain(ChainBase): if not mediaserver: continue server_name = mediaserver.name - sync_blacklist = mediaserver.config.get("sync_blacklist") or [] + sync_blacklist = mediaserver.sync_libraries or [] logger.info(f"开始同步媒体库 {server_name} 的数据 ...") for library in self.librarys(server_name): # 同步黑名单 跳过 - if library.name in sync_blacklist: + if library.id in sync_blacklist: continue logger.info(f"正在同步 {server_name} 媒体库 {library.name} ...") library_count = 0 diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index 83359ea5..3bdab2b1 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -179,7 +179,6 @@ class SubscribeChain(ChainBase): text = f"评分:{mediainfo.vote_average},来自用户:{username}" else: text = f"评分:{mediainfo.vote_average}" - # 群发 if mediainfo.type == MediaType.TV: link = settings.MP_DOMAIN('#/subscribe-tv?tab=mysub') else: diff --git a/app/db/models/user.py b/app/db/models/user.py index 742d534c..84a5ea5d 100644 --- a/app/db/models/user.py +++ b/app/db/models/user.py @@ -3,9 +3,9 @@ from typing import Tuple, Optional from sqlalchemy import Boolean, Column, Integer, String, Sequence from sqlalchemy.orm import Session +from app import schemas from app.core.security import verify_password from app.db import db_query, db_update, Base -from app.schemas import User from app.utils.otp import OtpUtils @@ -15,9 +15,9 @@ class User(Base): """ # ID id = Column(Integer, Sequence('id'), primary_key=True, index=True) - # 用户名 + # 用户名,唯一值 name = Column(String, index=True, nullable=False) - # 邮箱,未启用 + # 邮箱 email = Column(String) # 加密后密码 hashed_password = Column(String) @@ -31,10 +31,15 @@ class User(Base): is_otp = Column(Boolean(), default=False) # otp秘钥 otp_secret = Column(String, default=None) + # 用户权限 json + permissions = Column(String, default='') + # 用户个性化设置 json + settings = Column(String, default='') @staticmethod @db_query - def authenticate(db: Session, name: str, password: str, otp_password: str) -> Tuple[bool, Optional[User]]: + def authenticate(db: Session, name: str, password: str, + otp_password: str) -> Tuple[bool, Optional[schemas.User]]: user = db.query(User).filter(User.name == name).first() if not user: return False, None diff --git a/app/helper/notification.py b/app/helper/notification.py index ed5b3819..dc58e0b5 100644 --- a/app/helper/notification.py +++ b/app/helper/notification.py @@ -1,7 +1,7 @@ from typing import List from app.db.systemconfig_oper import SystemConfigOper -from app.schemas import NotificationConf +from app.schemas import NotificationConf, NotificationSwitchConf from app.schemas.types import SystemConfigKey @@ -13,11 +13,20 @@ class NotificationHelper: def __init__(self): self.systemconfig = SystemConfigOper() - def get_notifications(self) -> List[NotificationConf]: + def get_clients(self) -> List[NotificationConf]: """ 获取消息通知渠道 """ - notification_confs: List[dict] = self.systemconfig.get(SystemConfigKey.Notifications) - if not notification_confs: + client_confs: List[dict] = self.systemconfig.get(SystemConfigKey.Notifications) + if not client_confs: return [] - return [NotificationConf(**conf) for conf in notification_confs] + return [NotificationConf(**conf) for conf in client_confs] + + def get_switchs(self) -> List[dict]: + """ + 获取消息通知场景开关 + """ + switchs: List[dict] = self.systemconfig.get(SystemConfigKey.NotificationSwitchs) + if not switchs: + return [] + return [NotificationSwitchConf(**switch) for switch in switchs] diff --git a/app/modules/slack/__init__.py b/app/modules/slack/__init__.py index ab9f147e..3802bbc4 100644 --- a/app/modules/slack/__init__.py +++ b/app/modules/slack/__init__.py @@ -20,7 +20,7 @@ class SlackModule(_ModuleBase): """ 初始化模块 """ - clients = NotificationHelper().get_notifications() + clients = NotificationHelper().get_clients() if not clients: return self._configs = {} diff --git a/app/modules/synologychat/__init__.py b/app/modules/synologychat/__init__.py index fc146e71..3293ab48 100644 --- a/app/modules/synologychat/__init__.py +++ b/app/modules/synologychat/__init__.py @@ -17,7 +17,7 @@ class SynologyChatModule(_ModuleBase): """ 初始化模块 """ - clients = NotificationHelper().get_notifications() + clients = NotificationHelper().get_clients() if not clients: return self._configs = {} diff --git a/app/modules/telegram/__init__.py b/app/modules/telegram/__init__.py index 07a11690..876f38c9 100644 --- a/app/modules/telegram/__init__.py +++ b/app/modules/telegram/__init__.py @@ -19,7 +19,7 @@ class TelegramModule(_ModuleBase): """ 初始化模块 """ - clients = NotificationHelper().get_notifications() + clients = NotificationHelper().get_clients() if not clients: return self._configs = {} diff --git a/app/modules/vocechat/__init__.py b/app/modules/vocechat/__init__.py index 48f0bb1f..b7dd3881 100644 --- a/app/modules/vocechat/__init__.py +++ b/app/modules/vocechat/__init__.py @@ -18,7 +18,7 @@ class VoceChatModule(_ModuleBase): 初始化模块 """ self._clients = {} - clients = NotificationHelper().get_notifications() + clients = NotificationHelper().get_clients() if not clients: return for client in clients: diff --git a/app/modules/wechat/__init__.py b/app/modules/wechat/__init__.py index 160c9ff8..16ee2ec0 100644 --- a/app/modules/wechat/__init__.py +++ b/app/modules/wechat/__init__.py @@ -21,7 +21,7 @@ class WechatModule(_ModuleBase): """ 初始化模块 """ - clients = NotificationHelper().get_notifications() + clients = NotificationHelper().get_clients() if not clients: return self._configs = {} diff --git a/app/schemas/system.py b/app/schemas/system.py index a821335a..b7c2c8c2 100644 --- a/app/schemas/system.py +++ b/app/schemas/system.py @@ -2,6 +2,8 @@ from typing import Optional from pydantic import BaseModel +from app.schemas import NotificationType + class MediaServerConf(BaseModel): """ @@ -15,6 +17,8 @@ class MediaServerConf(BaseModel): config: Optional[dict] = {} # 是否启用 enabled: Optional[bool] = False + # 同步媒体体库列表 + sync_libraries: Optional[list] = [] class DownloaderConf(BaseModel): @@ -49,6 +53,16 @@ class NotificationConf(BaseModel): enabled: Optional[bool] = False +class NotificationSwitchConf(BaseModel): + """ + 通知场景开关配置 + """ + # 场景名称 + type: NotificationType = None + # 通知范围 all/user/admin/userandadmin + action: Optional[str] = 'all' + + class StorageConf(BaseModel): """ 存储配置 diff --git a/app/schemas/types.py b/app/schemas/types.py index ec7422ea..f3e8f8e7 100644 --- a/app/schemas/types.py +++ b/app/schemas/types.py @@ -64,6 +64,8 @@ class SystemConfigKey(Enum): MediaServers = "MediaServers" # 消息通知配置 Notifications = "Notifications" + # 通知场景开关设置 + NotificationSwitchs = "NotificationSwitchs" # 目录配置 Directories = "Directories" # 存储配置