try timezones

This commit is contained in:
2022-11-23 17:09:35 +03:00
parent a41af344a7
commit 94a31e29e5
16 changed files with 41 additions and 43 deletions

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from datetime import datetime
from datetime import datetime, timezone
from urllib.parse import quote_plus
from graphql.type import GraphQLResolveInfo
@@ -26,7 +26,7 @@ from settings import SESSION_TOKEN_HEADER
async def get_current_user(_, info):
print('[resolvers.auth] get current user %s' % str(info))
user = info.context["request"].user
user.lastSeen = datetime.now()
user.lastSeen = datetime.now(tz=timezone.utc)
with local_session() as session:
session.add(user)
session.commit()
@@ -50,7 +50,7 @@ async def confirm_email(_, info, token):
user = session.query(User).where(User.id == user_id).first()
session_token = await TokenStorage.create_session(user)
user.emailConfirmed = True
user.lastSeen = datetime.now()
user.lastSeen = datetime.now(tz=timezone.utc)
session.add(user)
session.commit()
return {

View File

@@ -1,4 +1,4 @@
from datetime import datetime
from datetime import datetime, timezone
from auth.authenticate import login_required
from base.orm import local_session
@@ -37,7 +37,7 @@ async def invite_author(_, info, author, shout):
if author.id in authors:
return {"error": "already added"}
shout.authors.append(author)
shout.updated_at = datetime.now()
shout.updated_at = datetime.now(tz=timezone.utc)
session.add(shout)
session.commit()
@@ -63,7 +63,7 @@ async def remove_author(_, info, author, shout):
if author.id not in authors:
return {"error": "not in authors"}
shout.authors.remove(author)
shout.updated_at = datetime.now()
shout.updated_at = datetime.now(tz=timezone.utc)
session.add(shout)
session.commit()

View File

@@ -1,4 +1,4 @@
from datetime import datetime
from datetime import datetime, timezone
from auth.authenticate import login_required
from base.orm import local_session
@@ -71,7 +71,7 @@ async def update_shout(_, info, inp):
return {"error": "access denied"}
else:
shout.update(inp)
shout.updatedAt = datetime.now()
shout.updatedAt = datetime.now(tz=timezone.utc)
session.add(shout)
if inp.get("topics"):
# remove old links
@@ -103,7 +103,7 @@ async def delete_shout(_, info, slug):
return {"error": "access denied"}
for a in authors:
reactions_unfollow(a.slug, slug, True)
shout.deletedAt = datetime.now()
shout.deletedAt = datetime.now(tz=timezone.utc)
session.add(shout)
session.commit()

View File

@@ -1,6 +1,6 @@
import json
import uuid
from datetime import datetime
from datetime import datetime, timezone
from auth.authenticate import login_required
from base.redis import redis
@@ -67,7 +67,7 @@ async def update_chat(_, info, chat_new: dict):
chat.update({
"title": chat_new.get("title", chat["title"]),
"description": chat_new.get("description", chat["description"]),
"updatedAt": int(datetime.now().timestamp()),
"updatedAt": int(datetime.now(tz=timezone.utc).timestamp()),
"admins": chat_new.get("admins", chat["admins"]),
"users": chat_new.get("users", chat["users"])
})
@@ -90,8 +90,8 @@ async def create_chat(_, info, title="", members=[]):
members.append(user.slug)
chat = {
"title": title,
"createdAt": int(datetime.now().timestamp()),
"updatedAt": int(datetime.now().timestamp()),
"createdAt": int(datetime.now(tz=timezone.utc).timestamp()),
"updatedAt": int(datetime.now(tz=timezone.utc).timestamp()),
"createdBy": user.slug,
"id": chat_id,
"users": members,

View File

@@ -1,5 +1,5 @@
import json
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
from auth.authenticate import login_required
from base.redis import redis
@@ -83,7 +83,7 @@ async def load_messages_by(_, info, by, limit: int = 50, offset: int = 0):
days = by.get("days")
if days:
messages = filter(
lambda m: datetime.now() - int(m["createdAt"]) < timedelta(days=by.get("days")),
lambda m: datetime.now(tz=timezone.utc) - int(m["createdAt"]) < timedelta(days=by.get("days")),
messages
)
return {

View File

@@ -1,6 +1,6 @@
import asyncio
import json
from datetime import datetime
from datetime import datetime, timezone
from auth.authenticate import login_required
from base.redis import redis
@@ -28,7 +28,7 @@ async def create_message(_, info, chat: str, body: str, replyTo=None):
"author": user.slug,
"body": body,
"replyTo": replyTo,
"createdAt": int(datetime.now().timestamp()),
"createdAt": int(datetime.now(tz=timezone.utc).timestamp()),
}
await redis.execute(
"SET", f"chats/{chat['id']}/messages/{message_id}", json.dumps(new_message)
@@ -70,7 +70,7 @@ async def update_message(_, info, chat_id: str, message_id: int, body: str):
return {"error": "access denied"}
message["body"] = body
message["updatedAt"] = int(datetime.now().timestamp())
message["updatedAt"] = int(datetime.now(tz=timezone.utc).timestamp())
await redis.execute("SET", f"chats/{chat_id}/messages/{message_id}", json.dumps(message))

View File

@@ -1,4 +1,4 @@
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
import sqlalchemy as sa
from sqlalchemy.orm import selectinload
from sqlalchemy.sql.expression import desc, asc, select, case
@@ -27,7 +27,7 @@ def apply_filters(q, filters, user=None):
if filters.get("body"):
q = q.filter(Shout.body.ilike(f'%{filters.get("body")}%s'))
if filters.get("days"):
before = datetime.now() - timedelta(days=int(filters.get("days")) or 30)
before = datetime.now(tz=timezone.utc) - timedelta(days=int(filters.get("days")) or 30)
q = q.filter(Shout.createdAt > before)
return q

View File

@@ -1,5 +1,5 @@
from typing import List
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
from sqlalchemy import and_, func
from sqlalchemy.orm import selectinload
@@ -203,10 +203,10 @@ async def load_authors_by(_, info, by, limit, offset):
aaa = list(map(lambda a: a.slug, TopicStat.authors_by_topic.get(by["topic"])))
aq = aq.filter(User.name._in(aaa))
if by.get("lastSeen"): # in days
days_before = datetime.now() - timedelta(days=by["lastSeen"])
days_before = datetime.now(tz=timezone.utc) - timedelta(days=by["lastSeen"])
aq = aq.filter(User.lastSeen > days_before)
elif by.get("createdAt"): # in days
days_before = datetime.now() - timedelta(days=by["createdAt"])
days_before = datetime.now(tz=timezone.utc) - timedelta(days=by["createdAt"])
aq = aq.filter(User.createdAt > days_before)
aq = aq.group_by(
User.id

View File

@@ -1,4 +1,4 @@
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
from sqlalchemy import and_, asc, desc, select, text, func
from sqlalchemy.orm import aliased
@@ -109,7 +109,7 @@ def check_to_hide(session, user, reaction):
def set_published(session, slug, publisher):
s = session.query(Shout).where(Shout.slug == slug).first()
s.publishedAt = datetime.now()
s.publishedAt = datetime.now(tz=timezone.utc)
s.publishedBy = publisher
s.visibility = text('public')
session.add(s)
@@ -166,7 +166,7 @@ async def update_reaction(_, info, inp):
if reaction.createdBy != user.slug:
return {"error": "access denied"}
reaction.body = inp["body"]
reaction.updatedAt = datetime.now()
reaction.updatedAt = datetime.now(tz=timezone.utc)
if reaction.kind != inp["kind"]:
# NOTE: change mind detection can be here
pass
@@ -191,7 +191,7 @@ async def delete_reaction(_, info, rid):
return {"error": "invalid reaction id"}
if reaction.createdBy != user.slug:
return {"error": "access denied"}
reaction.deletedAt = datetime.now()
reaction.deletedAt = datetime.now(tz=timezone.utc)
session.commit()
return {}
@@ -240,7 +240,7 @@ async def load_reactions_by(_, _info, by, limit=50, offset=0):
if by.get('search', 0) > 2:
q = q.filter(Reaction.body.ilike(f'%{by["body"]}%'))
if by.get("days"):
after = datetime.now() - timedelta(days=int(by["days"]) or 30)
after = datetime.now(tz=timezone.utc) - timedelta(days=int(by["days"]) or 30)
q = q.filter(Reaction.createdAt > after)
order_way = asc if by.get("sort", "").startswith("-") else desc
order_field = by.get("sort") or Reaction.createdAt