def add_notification(self, name, data): if self.notifications: self.notifications.filter_by(name=name).delete() n = Notification(name=name, payload_json=json.dumps(data), user=self) db.session.add(n) return n
def send_notification(user, action, title, message): if not current_app.config['TESTING']: notification = Notification(user_id=user.id, title=title, message=message, action=action) save_to_db(notification, msg="Notification saved") record_activity('notification_event', user=user, action=action, title=title)
def save_notification(self, type, message, receiver_id, sender_id): notification = Notification() notification.sender_uid = sender_id notification.receiver_uid = receiver_id notification.message = message notification.type = type db.session.add(notification) try: db.session.commit() return True except SQLAlchemyError as e: data = e.orig.args return False
def send_notification(user, title, message, actions=None): """ Helper function to send notifications. :param user: :param title: :param message: :param actions: :return: """ notification = Notification(user_id=user.id, title=title, message=message) if not actions: actions = [] notification.actions = actions save_to_db(notification, msg="Notification saved") record_activity('notification_event', user=user, title=title, actions=actions)
def send(cls, query: dict, session: dict) -> Notification: """ Business method to send a new notification. """ assert isinstance(session, dict) SendNotificationQueryValidation.validate(query) user = User.objects.get(pk=query[cls.USER_ID]) notification = Notification() notification.code = query[cls.CODE] notification.is_error = query.get(cls.IS_ERROR) notification.title = query[cls.TITLE] notification.message = query[cls.MESSAGE] user.notifications.append(notification) user.save() queue = Queue(f"notifications-{user.id}") queue.add(notification.to_json()) return notification
def create(self, payloads): response = ResponseBuilder() notification = Notification() notification.message = payloads['message'] notification.receiver_uid = payloads['receiver'] notification.type = payloads['type'] notification.sender_uid = payloads['user']['id'] db.session.add(notification) try: db.session.commit() data = notification.as_dict() data['receiver'] = notification.receiver.include_photos().as_dict() data['sender'] = notification.sender.include_photos().as_dict() return response.set_data(data).build() except SQLAlchemyError as e: data = e.orig.args return response.set_data(data).set_error(True).build()
def test_notification_get_data(self): """ WHEN getting a notification's data THEN return the data as JSON """ payload = dict(test=1) user = create_user(A_USERNAME, A_PASSWORD, AN_EMAIL) notification = Notification( name="test", user_profile=user.profile, timestamp=23.4324324, payload_json=json.dumps(payload), ) data = notification.get_data() self.assertEqual(data, payload)
def send_notification(notification_content: NotificationContent, user=None, users=None): if not NotificationSettings.is_enabled(notification_content.type): logger.info( 'Notification of type %s are disabled, hence skipping', notification_content.type, ) return users = users or [] if user: users.append(user) if not users: raise ValueError( 'Either provide user or users for sending notification') for user in set(users): notification = Notification(content=notification_content, user=user) db.session.add(notification) db.session.commit()
def notify_observers(self, book_id): reservations = reservation_service.get_reservations_by_book_id(book_id) for reservation in reservations: message = f"The book titled {reservation.book.title} is now available" notificationn = Notification(message, reservation.member) reservation.member.receive_notification(notificationn)
def create_app(config_name): from config import config, logger app.config.from_object(config[config_name]) # 中文化 Babel(app) # 注册flask-login login.init_app(app) # bootstrap bootstrap.init_app(app) @login.user_loader def load_user(user_id): return User.query.get(user_id) # 注册蓝图 from app.main.views import bp as main_bp app.register_blueprint(main_bp) # 注册数据库 db.init_app(app) # 注册flask-admin admin.init_app(app, index_view=AdminIndexView(template='admin/index.html', url='/')) # 注册APScheduler scheduler.init_app(app) scheduler.start() # 视图 from app.models.task import Task from app.models.rss_task import RSSTask from app.models.mail_setting import MailSetting from app.models.notification import Notification from app.models.task_status import TaskStatus from app.models.user import User admin.add_view(TaskStatusView(TaskStatus, db.session, name='任务状态')) admin.add_view(TaskView(Task, db.session, name='网页监控任务管理')) admin.add_view(RSSTaskView(RSSTask, db.session, name='RSS监控任务管理')) admin.add_view(NotificationView(Notification, db.session, name='通知方式管理')) admin.add_view(MailSettingView(MailSetting, db.session, name='系统邮箱设置')) admin.add_view(UserView(User, db.session, name='账号密码管理')) with app.test_request_context(): db.create_all() mail_setting = MailSetting.query.first() # 插入默认邮箱配置 if mail_setting is None: mail_setting = MailSetting() db.session.add(mail_setting) db.session.commit() # 初始化账号密码 user = User.query.first() if user is None: user = User('admin', 'admin') db.session.add(user) db.session.commit() # 插入默认通知方式 notis = Notification.query.all() mail_exist = False wechat_exist = False if len(notis) != 0: for noti in notis: if noti.type == 'mail': mail_exist = True if noti.type == 'wechat': wechat_exist = True if not mail_exist: mail_noti = Notification('mail') db.session.add(mail_noti) db.session.commit() if not wechat_exist: wechat_noti = Notification('wechat') db.session.add(wechat_noti) db.session.commit() # 在系统重启时重启任务 from app.main.scheduler import add_job task_statuss = TaskStatus.query.all() count = 0 for task_status in task_statuss: if task_status.task_status == 'run': count += 1 task_id = task_status.task_id if task_status.task_type == 'html': task = Task.query.filter_by(id=task_id).first() add_job(task.id, task.frequency) logger.info('重启task_' + str(task_id)) elif task_status.task_type == 'rss': task = RSSTask.query.filter_by(id=task_id).first() add_job(task_id, task.frequency, 'rss') logger.info('重启task_rss' + str(task_id)) logger.info('重启{}个任务'.format(count)) return app
def create_app(config_name): from config import config, logger app.config.from_object(config[config_name]) # 中文化 Babel(app) # 注册flask-login login.init_app(app) # bootstrap bootstrap.init_app(app) @login.user_loader def load_user(user_id): return User.query.get(user_id) # 注册蓝图 from app.main.views import bp as main_bp app.register_blueprint(main_bp) # 注册数据库 db.init_app(app) # 注册flask-admin admin.init_app( app, index_view=AdminIndexView(template='admin/index.html', url='/')) # 注册APScheduler scheduler.init_app(app) scheduler.start() # 视图 from app.models.task import Task from app.models.rss_task import RSSTask from app.models.mail_setting import MailSetting from app.models.notification import Notification from app.models.task_status import TaskStatus from app.models.user import User admin.add_view(TaskStatusView(TaskStatus, db.session, name='任务状态')) admin.add_view(TaskView(Task, db.session, name='网页监控任务管理')) admin.add_view(RSSTaskView(RSSTask, db.session, name='RSS监控任务管理')) admin.add_view(NotificationView(Notification, db.session, name='通知方式管理')) admin.add_view(MailSettingView(MailSetting, db.session, name='系统邮箱设置')) admin.add_view(UserView(User, db.session, name='账号密码管理')) with app.test_request_context(): db.create_all() mail_setting = MailSetting.query.first() # 插入默认邮箱配置 if mail_setting is None: mail_setting = MailSetting() db.session.add(mail_setting) db.session.commit() # 初始化账号密码 user = User.query.first() if user is None: import random import string random_password = ''.join( random.sample(string.ascii_letters + string.digits, 10)) logger.info('数据库初始化成功,初始密码为' + random_password) user = User('admin', random_password) db.session.add(user) db.session.commit() # 插入默认通知方式 notis = Notification.query.all() mail_exist = False wechat_exist = False if len(notis) != 0: for noti in notis: if noti.type == 'mail': mail_exist = True if noti.type == 'wechat': wechat_exist = True if not mail_exist: mail_noti = Notification('mail') db.session.add(mail_noti) db.session.commit() if not wechat_exist: wechat_noti = Notification('wechat') db.session.add(wechat_noti) db.session.commit() ppid = psutil.Process(os.getppid()) ppid_name = ppid.name() # 加这一步判断主要是因为, # 在debug模式下,会启动另外一个线程来自动重载, # 这样会导致在两个线程中都启动任务,造成重复 if ('python' in ppid_name and config_name == 'development') or config_name != 'development': # 在系统重启时重启任务 from app.main.scheduler import add_job task_statuss = TaskStatus.query.all() count = 0 for task_status in task_statuss: if task_status.task_status == 'run': count += 1 task_id = task_status.task_id if task_status.task_type == 'html': task = Task.query.filter_by(id=task_id).first() add_job(task.id, task.frequency) logger.info('重启task_' + str(task_id)) elif task_status.task_type == 'rss': task = RSSTask.query.filter_by(id=task_id).first() add_job(task_id, task.frequency, 'rss') logger.info('重启task_rss' + str(task_id)) logger.info('重启{}个任务'.format(count)) return app
def insert_notification(message, status): notification = Notification(message=message, status=status) db.session.add(notification) db.session.commit() return notification.serialize