From 25c0fbf8ebe0b02a92b3774580a93d53b0c06132 Mon Sep 17 00:00:00 2001 From: cdhigh Date: Tue, 30 Apr 2024 10:39:00 -0300 Subject: [PATCH] add utc tzinfo to utcnow() --- application/base_handler.py | 2 +- application/lib/calibre/web/feeds/news.py | 4 ++-- application/static/base.js | 5 +++-- application/view/admin.py | 2 +- application/view/adv.py | 2 +- application/view/library_offical.py | 9 +++++---- application/view/login.py | 10 +++++----- application/view/logs.py | 4 ++-- application/view/subscribe.py | 8 ++++---- 9 files changed, 24 insertions(+), 22 deletions(-) diff --git a/application/base_handler.py b/application/base_handler.py index 484d2bc9..69534203 100644 --- a/application/base_handler.py +++ b/application/base_handler.py @@ -42,6 +42,6 @@ def save_delivery_log(user, book, size, status='ok', to=None): try: DeliverLog.create(user=name, to=to, size=size, time_str=user.local_time("%Y-%m-%d %H:%M"), - datetime=datetime.datetime.utcnow(), book=book, status=status) + datetime=datetime.datetime.now(datetime.timezone.utc), book=book, status=status) except Exception as e: default_log.warning('DeliverLog failed to save: {}'.format(e)) diff --git a/application/lib/calibre/web/feeds/news.py b/application/lib/calibre/web/feeds/news.py index d09deb9d..881ded87 100644 --- a/application/lib/calibre/web/feeds/news.py +++ b/application/lib/calibre/web/feeds/news.py @@ -2172,7 +2172,7 @@ def parse_feeds(self): added.add(url) timeItem = LastDelivered.get_or_none((LastDelivered.user==self.user.name) & (LastDelivered.url==url)) - delta = (datetime.datetime.utcnow() - timeItem.datetime) if timeItem else None + delta = (datetime.datetime.now(datetime.timezone.utc) - timeItem.datetime) if timeItem else None #这里oldest_article和其他的recipe不一样,这个参数表示在这个区间内不会重复推送 if ((not timeItem) or (not self.oldest_article) or (self.delivery_reason == 'manual') or (delta.days * 24 * 3600 + delta.seconds > 24 * 3600 * self.oldest_article)): @@ -2183,7 +2183,7 @@ def parse_feeds(self): if ((self.delivery_reason == 'manual') or (not self.oldest_article)) and timeItem: timeItem.delete_instance() elif timeItem: - timeItem.datetime = datetime.datetime.utcnow() + timeItem.datetime = datetime.datetime.now(datetime.timezone.utc) timeItem.save() else: LastDelivered.create(user=self.user.name, url=url) diff --git a/application/static/base.js b/application/static/base.js index 293695b5..d7d1ee71 100644 --- a/application/static/base.js +++ b/application/static/base.js @@ -797,9 +797,10 @@ function OpenUploadRecipeDialog() { //删除一个已经上传的Recipe function DeleteUploadRecipe(id, title) { - if (!confirm(i18n.areYouSureDelete.format(title))) { + if (!(event.ctrlKey || event.metaKey) && !confirm(i18n.areYouSureDelete.format(title))) { return; } + $.post("/recipe/delete", {id: id}, function (data) { if (data.status == "ok") { for (var idx = 0; idx < my_uploaded_recipes.length; idx++) { @@ -816,7 +817,7 @@ function DeleteUploadRecipe(id, title) { } PopulateMySubscribed(); PopulateLibrary(''); - alert(i18n.recipeDeleted); + //alert(i18n.recipeDeleted); } else if (data.status == i18n.loginRequired) { window.location.href = '/login'; } else { diff --git a/application/view/admin.py b/application/view/admin.py index 859880f1..c8511c96 100644 --- a/application/view/admin.py +++ b/application/view/admin.py @@ -173,7 +173,7 @@ def AdminAccountChangePost(name): else: dbItem.expiration_days = expiration if expiration: - dbItem.expires = datetime.datetime.utcnow() + datetime.timedelta(days=expiration) + dbItem.expires = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=expiration) else: dbItem.expires = None if sm_service == 'admin': diff --git a/application/view/adv.py b/application/view/adv.py index 3bb15c4e..3e52d241 100644 --- a/application/view/adv.py +++ b/application/view/adv.py @@ -198,7 +198,7 @@ def AdvImportPost(): dbItem.save() else: Recipe.create(title=title, url=url, user=user.name, isfulltext=isfulltext, type_='custom', - time=datetime.datetime.utcnow()) + time=datetime.datetime.now(datetime.timezone.utc)) return redirect(url_for("bpSubscribe.MySubscription")) else: diff --git a/application/view/library_offical.py b/application/view/library_offical.py index c984165c..7412c789 100644 --- a/application/view/library_offical.py +++ b/application/view/library_offical.py @@ -79,7 +79,7 @@ def SharedLibraryOfficalAjax(): creator = hashlib.md5(creator.encode('utf-8')).hexdigest() #判断是否存在,如果存在,则更新分类或必要的信息,同时返回成功 - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) if url: #自定义RSS,以url为准 dbItem = SharedRss.get_or_none(SharedRss.url == url) else: #上传的recipe,以title为准 @@ -123,12 +123,13 @@ def SharedLibraryOfficalAjax(): #更新共享库的最新时间信息 def UpdateLastSharedRssTime(): - AppInfo.set_value(AppInfo.lastSharedRssTime, str(int(datetime.datetime.utcnow().timestamp()))) + now = datetime.datetime.now(datetime.timezone.utc) + AppInfo.set_value(AppInfo.lastSharedRssTime, str(int(now.timestamp()))) #共享库的订阅源信息管理 @bpLibraryOffical.post(LIBRARY_MGR + "") def SharedLibraryMgrOffical(mgrType): - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) form = request.form #print(mgrType, LIBRARY_GETSRC) if mgrType == LIBRARY_GETSRC: #获取一个共享recipe的源代码 @@ -164,7 +165,7 @@ def SharedLibraryMgrOffical(mgrType): return respDict #希望能做到“免维护”,在一定数量的失效报告之后,自动删除对应的源,假定前提是人性本善 - delta = abs(now - dbItem.last_invalid_report_time.replace(tzinfo=None)) + delta = abs(now - dbItem.last_invalid_report_time) deltaDays = delta.days if deltaDays > 180: #半年内没有人报告失效则重新计数 diff --git a/application/view/login.py b/application/view/login.py index 23ca5a40..be14dd3b 100644 --- a/application/view/login.py +++ b/application/view/login.py @@ -64,7 +64,7 @@ def LoginPost(): session['userName'] = name session['role'] = 'admin' if name == adminName else 'user' if user.expires and user.expiration_days > 0: #用户登陆后自动续期 - user.expires = datetime.datetime.utcnow() + datetime.timedelta(days=user.expiration_days) + user.expires = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=user.expiration_days) user.save() if 'resetpwd' in user.custom: #成功登录后清除复位密码的设置 custom = user.custom @@ -123,7 +123,7 @@ def CreateAccountIfNotExist(name, password=None, email='', sender=None, sm_servi user = KeUser(name=name, passwd_hash=pwdHash, expires=None, expiration_days=expiration, share_links={'key': shareKey}, base_config=base_config, send_mail_service=sm_service) if expiration: - user.expires = datetime.datetime.utcnow() + datetime.timedelta(days=expiration) + user.expires = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=expiration) user.save() return True @@ -147,7 +147,7 @@ def ResetPasswordRoute(): user = KeUser.get_or_none(KeUser.name == name) if name else None if user and token: #重设密码的最后一步 pre_set = user.custom.get('resetpwd', {}) - now = datetime.datetime.utcnow().timestamp() + now = datetime.datetime.now(datetime.timezone.utc).timestamp() pre_time = pre_set.get('expires') or (now - datetime.timedelta(hours=1)).timestamp() if (token == pre_set.get('token')) and (now < pre_time): return render_template('reset_password.html', tips='', userName=name, firstStep=False, @@ -186,7 +186,7 @@ def ResetPasswordPost(): return render_template('reset_password.html', tips=tips, userName=name, firstStep=True) else: token = new_secret_key(length=24) - expires = (datetime.datetime.utcnow() + datetime.timedelta(days=1)).timestamp() + expires = (datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=1)).timestamp() user.set_custom('resetpwd', {'token': token, 'expires': expires}) user.save() tips = send_resetpwd_email(user, token) @@ -269,7 +269,7 @@ def send_resetpwd_email(user, token): #重置密码的最后一步,校验密码,写入数据库 def reset_pwd_final_step(user, token, new_p1, new_p2): pre_set = user.custom.get('resetpwd', {}) - now = datetime.datetime.utcnow().timestamp() + now = datetime.datetime.now(datetime.timezone.utc).timestamp() pre_time = pre_set.get('expires') or (now - datetime.timedelta(hours=1)).timestamp() if (token == pre_set.get('token')) and (now < pre_time): if new_p1 == new_p2: diff --git a/application/view/logs.py b/application/view/logs.py index 88adfd84..e9bd9892 100644 --- a/application/view/logs.py +++ b/application/view/logs.py @@ -33,14 +33,14 @@ def RemoveLogsRoute(): def RemoveLogs(): #停止过期用户的推送 - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) for user in KeUser.select(): if user.cfg('enable_send') and user.expires and (user.expires < now): user.set_cfg('enable_send', '') user.save() #清理30天之前的推送记录 - time30 = datetime.datetime.utcnow() - datetime.timedelta(days=30) + time30 = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=30) cnt = DeliverLog.delete().where(DeliverLog.datetime < time30).execute() cnt += LastDelivered.delete().where(LastDelivered.datetime < time30).execute() return "{} lines delivery log removed.".format(cnt) diff --git a/application/view/subscribe.py b/application/view/subscribe.py index 17939f25..7c3eb8db 100644 --- a/application/view/subscribe.py +++ b/application/view/subscribe.py @@ -76,7 +76,7 @@ def MySubscriptionPost(): return redirect(url_for("bpSubscribe.MySubscription", tips=(_("Duplicated subscription!")))) else: Recipe.create(title=title, url=url, isfulltext=isfulltext, type_='custom', user=user.name, - time=datetime.datetime.utcnow()) + time=datetime.datetime.now(datetime.timezone.utc)) return redirect(url_for("bpSubscribe.MySubscription")) #添加/删除自定义RSS订阅的AJAX处理函数 @@ -145,7 +145,7 @@ def AddCustomRss(user, form): return ret else: rss = Recipe.create(title=title, url=url, isfulltext=isfulltext, type_='custom', user=user.name, - time=datetime.datetime.utcnow()) + time=datetime.datetime.now(datetime.timezone.utc)) ret['id'] = rss.recipe_id UpdateBookedCustomRss(user) @@ -184,7 +184,7 @@ def UpdateBookedCustomRss(user: KeUser): if user.cfg('enable_send') == 'all': #添加自定义RSS的订阅 for rss in custom_rss: BookedRecipe.get_or_create(recipe_id=rss.recipe_id, defaults={'separated': False, 'user': userName, - 'title': rss.title, 'description': rss.description, 'time': datetime.datetime.utcnow(), + 'title': rss.title, 'description': rss.description, 'time': datetime.datetime.now(datetime.timezone.utc), 'translator': rss.translator, 'tts': rss.tts, 'custom': rss.custom}) elif custom_rss: #删除订阅 ids = [rss.recipe_id for rss in custom_rss] @@ -311,7 +311,7 @@ def SaveRecipeIfCorrect(user: KeUser, src: str): raise Exception(_('The recipe is already in the library.')) params = {"title": recipe.title, "description": recipe.description, "type_": 'upload', - "needs_subscription": recipe.needs_subscription, "src": src, "time": datetime.datetime.utcnow(), + "needs_subscription": recipe.needs_subscription, "src": src, "time": datetime.datetime.now(datetime.timezone.utc), "user": user.name, "language": recipe.language} dbInst = Recipe.create(**params) params.pop('src')