housekeep: centralize datetime generation

Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
Kevin Morris 2022-01-18 05:59:52 -08:00
parent 7bcc8d7ce7
commit 7f6c23d4cb
No known key found for this signature in database
GPG key ID: F7E46DED420788F3
41 changed files with 146 additions and 179 deletions

View file

@ -1,6 +1,5 @@
import functools import functools
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from typing import Callable from typing import Callable
@ -13,7 +12,7 @@ from starlette.requests import HTTPConnection
import aurweb.config import aurweb.config
from aurweb import db, filters, l10n, util from aurweb import db, filters, l10n, time, util
from aurweb.models import Session, User from aurweb.models import Session, User
from aurweb.models.account_type import ACCOUNT_TYPE_ID from aurweb.models.account_type import ACCOUNT_TYPE_ID
@ -110,7 +109,7 @@ class BasicAuthBackend(AuthenticationBackend):
"persistent_cookie_timeout") "persistent_cookie_timeout")
# If no session with sid and a LastUpdateTS now or later exists. # If no session with sid and a LastUpdateTS now or later exists.
now_ts = int(datetime.utcnow().timestamp()) now_ts = time.utcnow()
record = db.query(Session).filter(Session.SessionID == sid).first() record = db.query(Session).filter(Session.SessionID == sid).first()
if not record: if not record:
return unauthenticated return unauthenticated

View file

@ -1,9 +1,7 @@
from datetime import datetime
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema from aurweb import schema, time
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
@ -43,7 +41,7 @@ class PackageBase(Base):
# If no SubmittedTS/ModifiedTS is provided on creation, set them # If no SubmittedTS/ModifiedTS is provided on creation, set them
# here to the current utc timestamp. # here to the current utc timestamp.
now = datetime.utcnow().timestamp() now = time.utcnow()
if not self.SubmittedTS: if not self.SubmittedTS:
self.SubmittedTS = now self.SubmittedTS = now
if not self.ModifiedTS: if not self.ModifiedTS:

View file

@ -1,11 +1,9 @@
import typing import typing
from datetime import datetime
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema from aurweb import schema, time
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
@ -71,7 +69,7 @@ class TUVoteInfo(Base):
return attr return attr
def is_running(self): def is_running(self):
return self.End > int(datetime.utcnow().timestamp()) return self.End > time.utcnow()
def total_votes(self): def total_votes(self):
return self.Yes + self.No + self.Abstain return self.Yes + self.No + self.Abstain

View file

@ -1,6 +1,5 @@
import hashlib import hashlib
from datetime import datetime
from typing import List, Set from typing import List, Set
import bcrypt import bcrypt
@ -14,7 +13,7 @@ import aurweb.config
import aurweb.models.account_type import aurweb.models.account_type
import aurweb.schema import aurweb.schema
from aurweb import db, logging, schema, util from aurweb import db, logging, schema, time, util
from aurweb.models.account_type import AccountType as _AccountType from aurweb.models.account_type import AccountType as _AccountType
from aurweb.models.ban import is_banned from aurweb.models.ban import is_banned
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
@ -121,7 +120,7 @@ class User(Base):
exc = None exc = None
for i in range(tries): for i in range(tries):
exc = None exc = None
now_ts = datetime.utcnow().timestamp() now_ts = time.utcnow()
try: try:
with db.begin(): with db.begin():
self.LastLogin = now_ts self.LastLogin = now_ts

View file

@ -1,10 +1,9 @@
from datetime import datetime
from typing import List, Optional, Set from typing import List, Optional, Set
from fastapi import Request from fastapi import Request
from sqlalchemy import and_, orm from sqlalchemy import and_, orm
from aurweb import config, db, l10n, util from aurweb import config, db, l10n, time, util
from aurweb.exceptions import InvariantError from aurweb.exceptions import InvariantError
from aurweb.models import PackageBase, PackageRequest, User from aurweb.models import PackageBase, PackageRequest, User
from aurweb.models.package_request import ACCEPTED_ID, PENDING_ID, REJECTED_ID from aurweb.models.package_request import ACCEPTED_ID, PENDING_ID, REJECTED_ID
@ -106,7 +105,7 @@ def verify_orphan_request(user: User, pkgbase: PackageBase):
PackageRequest.ReqTypeID == ORPHAN_ID) PackageRequest.ReqTypeID == ORPHAN_ID)
for pkgreq in requests: for pkgreq in requests:
idle_time = config.getint("options", "request_idle_time") idle_time = config.getint("options", "request_idle_time")
time_delta = int(datetime.utcnow().timestamp()) - pkgreq.RequestTS time_delta = time.utcnow() - pkgreq.RequestTS
is_due = pkgreq.Status == PENDING_ID and time_delta > idle_time is_due = pkgreq.Status == PENDING_ID and time_delta > idle_time
if is_due: if is_due:
# If the requester is the pkgbase maintainer or the # If the requester is the pkgbase maintainer or the
@ -128,7 +127,7 @@ def close_pkgreq(pkgreq: PackageRequest, closer: User,
:param target: Optional PackageBase instance to merge into :param target: Optional PackageBase instance to merge into
:param status: `pkgreq`.Status value to update to :param status: `pkgreq`.Status value to update to
""" """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
pkgreq.Status = status pkgreq.Status = status
pkgreq.Closer = closer pkgreq.Closer = closer
pkgreq.ClosureComment = ( pkgreq.ClosureComment = (

View file

@ -1,9 +1,7 @@
from datetime import datetime
from fastapi import Request from fastapi import Request
from redis.client import Pipeline from redis.client import Pipeline
from aurweb import config, db, logging from aurweb import config, db, logging, time
from aurweb.models import ApiRateLimit from aurweb.models import ApiRateLimit
from aurweb.redis import redis_connection from aurweb.redis import redis_connection
@ -12,7 +10,7 @@ logger = logging.get_logger(__name__)
def _update_ratelimit_redis(request: Request, pipeline: Pipeline): def _update_ratelimit_redis(request: Request, pipeline: Pipeline):
window_length = config.getint("ratelimit", "window_length") window_length = config.getint("ratelimit", "window_length")
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
time_to_delete = now - window_length time_to_delete = now - window_length
host = request.client.host host = request.client.host
@ -37,7 +35,7 @@ def _update_ratelimit_redis(request: Request, pipeline: Pipeline):
def _update_ratelimit_db(request: Request): def _update_ratelimit_db(request: Request):
window_length = config.getint("ratelimit", "window_length") window_length = config.getint("ratelimit", "window_length")
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
time_to_delete = now - window_length time_to_delete = now - window_length
records = db.query(ApiRateLimit).filter( records = db.query(ApiRateLimit).filter(

View file

@ -1,4 +1,3 @@
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from fastapi import APIRouter, Form, HTTPException, Request from fastapi import APIRouter, Form, HTTPException, Request
@ -6,7 +5,7 @@ from fastapi.responses import HTMLResponse, RedirectResponse
import aurweb.config import aurweb.config
from aurweb import cookies, db from aurweb import cookies, db, time
from aurweb.auth import requires_auth, requires_guest from aurweb.auth import requires_auth, requires_guest
from aurweb.l10n import get_translator_for_request from aurweb.l10n import get_translator_for_request
from aurweb.models import User from aurweb.models import User
@ -57,8 +56,7 @@ async def login_post(request: Request,
login_timeout = aurweb.config.getint("options", "login_timeout") login_timeout = aurweb.config.getint("options", "login_timeout")
expires_at = int(datetime.utcnow().timestamp() expires_at = int(time.utcnow() + max(cookie_timeout, login_timeout))
+ max(cookie_timeout, login_timeout))
response = RedirectResponse(url=next, response = RedirectResponse(url=next,
status_code=HTTPStatus.SEE_OTHER) status_code=HTTPStatus.SEE_OTHER)

View file

@ -3,7 +3,6 @@ decorators in some way; more complex routes should be defined in their
own modules and imported here. """ own modules and imported here. """
import os import os
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from fastapi import APIRouter, Form, HTTPException, Request, Response from fastapi import APIRouter, Form, HTTPException, Request, Response
@ -14,7 +13,7 @@ from sqlalchemy import and_, case, or_
import aurweb.config import aurweb.config
import aurweb.models.package_request import aurweb.models.package_request
from aurweb import cookies, db, models, util from aurweb import cookies, db, models, time, util
from aurweb.cache import db_count_cache from aurweb.cache import db_count_cache
from aurweb.models.account_type import TRUSTED_USER_AND_DEV_ID, TRUSTED_USER_ID from aurweb.models.account_type import TRUSTED_USER_AND_DEV_ID, TRUSTED_USER_ID
from aurweb.models.package_request import PENDING_ID from aurweb.models.package_request import PENDING_ID
@ -97,7 +96,7 @@ async def index(request: Request):
redis, "trusted_user_count", query, expire=cache_expire) redis, "trusted_user_count", query, expire=cache_expire)
# Current timestamp. # Current timestamp.
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
seven_days = 86400 * 7 # Seven days worth of seconds. seven_days = 86400 * 7 # Seven days worth of seconds.
seven_days_ago = now - seven_days seven_days_ago = now - seven_days

View file

@ -1,11 +1,10 @@
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from fastapi import APIRouter, Form, HTTPException, Query, Request, Response from fastapi import APIRouter, Form, HTTPException, Query, Request, Response
from fastapi.responses import JSONResponse, RedirectResponse from fastapi.responses import JSONResponse, RedirectResponse
from sqlalchemy import and_ from sqlalchemy import and_
from aurweb import config, db, l10n, logging, templates, util from aurweb import config, db, l10n, logging, templates, time, util
from aurweb.auth import creds, requires_auth from aurweb.auth import creds, requires_auth
from aurweb.exceptions import InvariantError, ValidationError from aurweb.exceptions import InvariantError, ValidationError
from aurweb.models import PackageBase from aurweb.models import PackageBase
@ -146,7 +145,7 @@ async def pkgbase_flag_post(request: Request, name: str,
has_cred = request.user.has_credential(creds.PKGBASE_FLAG) has_cred = request.user.has_credential(creds.PKGBASE_FLAG)
if has_cred and not pkgbase.Flagger: if has_cred and not pkgbase.Flagger:
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgbase.OutOfDateTS = now pkgbase.OutOfDateTS = now
pkgbase.Flagger = request.user pkgbase.Flagger = request.user
@ -170,7 +169,7 @@ async def pkgbase_comments_post(
# If the provided comment is different than the record's version, # If the provided comment is different than the record's version,
# update the db record. # update the db record.
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
comment = db.create(PackageComment, User=request.user, comment = db.create(PackageComment, User=request.user,
PackageBase=pkgbase, PackageBase=pkgbase,
@ -268,7 +267,7 @@ async def pkgbase_comment_post(
# If the provided comment is different than the record's version, # If the provided comment is different than the record's version,
# update the db record. # update the db record.
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
if db_comment.Comments != comment: if db_comment.Comments != comment:
with db.begin(): with db.begin():
db_comment.Comments = comment db_comment.Comments = comment
@ -316,7 +315,7 @@ async def pkgbase_comment_pin(request: Request, name: str, id: int,
status_code=HTTPStatus.UNAUTHORIZED, status_code=HTTPStatus.UNAUTHORIZED,
detail=_("You are not allowed to pin this comment.")) detail=_("You are not allowed to pin this comment."))
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
comment.PinnedTS = now comment.PinnedTS = now
@ -387,7 +386,7 @@ async def pkgbase_comment_delete(request: Request, name: str, id: int,
status_code=HTTPStatus.UNAUTHORIZED, status_code=HTTPStatus.UNAUTHORIZED,
detail=_("You are not allowed to delete this comment.")) detail=_("You are not allowed to delete this comment."))
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
comment.Deleter = request.user comment.Deleter = request.user
comment.DelTS = now comment.DelTS = now
@ -446,7 +445,7 @@ async def pkgbase_vote(request: Request, name: str):
).first() ).first()
has_cred = request.user.has_credential(creds.PKGBASE_VOTE) has_cred = request.user.has_credential(creds.PKGBASE_VOTE)
if has_cred and not vote: if has_cred and not vote:
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
db.create(PackageVote, db.create(PackageVote,
User=request.user, User=request.user,
@ -683,7 +682,7 @@ async def pkgbase_request_post(request: Request, name: str,
return render_template(request, "pkgbase/request.html", context) return render_template(request, "pkgbase/request.html", context)
# All good. Create a new PackageRequest based on the given type. # All good. Create a new PackageRequest based on the given type.
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgreq = db.create(PackageRequest, pkgreq = db.create(PackageRequest,
ReqTypeID=types.get(type), ReqTypeID=types.get(type),

View file

@ -1,11 +1,10 @@
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from fastapi import APIRouter, Form, Query, Request from fastapi import APIRouter, Form, Query, Request
from fastapi.responses import RedirectResponse from fastapi.responses import RedirectResponse
from sqlalchemy import case from sqlalchemy import case
from aurweb import db, defaults, util from aurweb import db, defaults, time, util
from aurweb.auth import creds, requires_auth from aurweb.auth import creds, requires_auth
from aurweb.models import PackageRequest, User from aurweb.models import PackageRequest, User
from aurweb.models.package_request import PENDING_ID, REJECTED_ID from aurweb.models.package_request import PENDING_ID, REJECTED_ID
@ -78,7 +77,7 @@ async def request_close_post(request: Request, id: int,
context = make_context(request, "Close Request") context = make_context(request, "Close Request")
context["pkgreq"] = pkgreq context["pkgreq"] = pkgreq
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgreq.Closer = request.user pkgreq.Closer = request.user
pkgreq.ClosureComment = comments pkgreq.ClosureComment = comments

View file

@ -2,14 +2,13 @@ import html
import re import re
import typing import typing
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from fastapi import APIRouter, Form, HTTPException, Request from fastapi import APIRouter, Form, HTTPException, Request
from fastapi.responses import RedirectResponse, Response from fastapi.responses import RedirectResponse, Response
from sqlalchemy import and_, or_ from sqlalchemy import and_, or_
from aurweb import db, l10n, logging, models from aurweb import db, l10n, logging, models, time
from aurweb.auth import creds, requires_auth from aurweb.auth import creds, requires_auth
from aurweb.models import User from aurweb.models import User
from aurweb.models.account_type import TRUSTED_USER_AND_DEV_ID, TRUSTED_USER_ID from aurweb.models.account_type import TRUSTED_USER_AND_DEV_ID, TRUSTED_USER_ID
@ -52,7 +51,7 @@ async def trusted_user(request: Request,
context["pp"] = pp = ITEMS_PER_PAGE context["pp"] = pp = ITEMS_PER_PAGE
context["prev_len"] = MAX_AGENDA_LENGTH context["prev_len"] = MAX_AGENDA_LENGTH
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
if current_by not in {"asc", "desc"}: if current_by not in {"asc", "desc"}:
# If a malicious by was given, default to desc. # If a malicious by was given, default to desc.
@ -290,7 +289,7 @@ async def trusted_user_addvote_post(request: Request,
# Gather some mapped constants and the current timestamp. # Gather some mapped constants and the current timestamp.
duration, quorum = ADDVOTE_SPECIFICS.get(type) duration, quorum = ADDVOTE_SPECIFICS.get(type)
timestamp = int(datetime.utcnow().timestamp()) timestamp = time.utcnow()
# TODO: Review this. Is this even necessary? # TODO: Review this. Is this even necessary?
# Remove <script> and <style> tags. # Remove <script> and <style> tags.

View file

@ -1,16 +1,14 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from datetime import datetime
from sqlalchemy import and_ from sqlalchemy import and_
from aurweb import db from aurweb import db, time
from aurweb.models import PackageBase from aurweb.models import PackageBase
def _main(): def _main():
# One day behind. # One day behind.
limit_to = int(datetime.utcnow().timestamp()) - 86400 limit_to = time.utcnow() - 86400
query = db.query(PackageBase).filter( query = db.query(PackageBase).filter(
and_(PackageBase.SubmittedTS < limit_to, and_(PackageBase.SubmittedTS < limit_to,

View file

@ -1,13 +1,12 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from datetime import datetime
from typing import List from typing import List
from sqlalchemy import and_, func from sqlalchemy import and_, func
from sqlalchemy.sql.functions import coalesce from sqlalchemy.sql.functions import coalesce
from sqlalchemy.sql.functions import sum as _sum from sqlalchemy.sql.functions import sum as _sum
from aurweb import db from aurweb import db, time
from aurweb.models import PackageBase, PackageVote from aurweb.models import PackageBase, PackageVote
@ -20,7 +19,7 @@ def run_variable(pkgbases: List[PackageBase] = []) -> None:
:param pkgbases: List of PackageBase instances :param pkgbases: List of PackageBase instances
""" """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
# NumVotes subquery. # NumVotes subquery.
votes_subq = db.get_session().query( votes_subq = db.get_session().query(

View file

@ -1,12 +1,10 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from datetime import datetime
from sqlalchemy import and_ from sqlalchemy import and_
import aurweb.config import aurweb.config
from aurweb import db from aurweb import db, time
from aurweb.models import TUVoteInfo from aurweb.models import TUVoteInfo
from aurweb.scripts import notify from aurweb.scripts import notify
@ -16,7 +14,7 @@ notify_cmd = aurweb.config.get('notifications', 'notify-cmd')
def main(): def main():
db.get_engine() db.get_engine()
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
start = aurweb.config.getint("tuvotereminder", "range_start") start = aurweb.config.getint("tuvotereminder", "range_start")
filter_from = now + start filter_from = now + start

View file

@ -1,15 +1,13 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from datetime import datetime
from sqlalchemy import update from sqlalchemy import update
from aurweb import db from aurweb import db, time
from aurweb.models import User from aurweb.models import User
def _main(): def _main():
limit_to = int(datetime.utcnow().timestamp()) - 86400 * 7 limit_to = time.utcnow() - 86400 * 7
update_ = update(User).where( update_ = update(User).where(
User.LastLogin < limit_to User.LastLogin < limit_to

View file

@ -1,9 +1,7 @@
import copy import copy
import functools import functools
import os import os
import zoneinfo
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from typing import Callable from typing import Callable
@ -80,8 +78,8 @@ def make_context(request: Request, title: str, next: str = None):
"timezone": timezone, "timezone": timezone,
"timezones": time.SUPPORTED_TIMEZONES, "timezones": time.SUPPORTED_TIMEZONES,
"title": title, "title": title,
"now": datetime.now(tz=zoneinfo.ZoneInfo(timezone)), "now": time.now(timezone),
"utcnow": int(datetime.utcnow().timestamp()), "utcnow": time.utcnow(),
"config": aurweb.config, "config": aurweb.config,
"creds": aurweb.auth.creds, "creds": aurweb.auth.creds,
"next": next if next else request.url.path, "next": next if next else request.url.path,

View file

@ -3,6 +3,7 @@ import zoneinfo
from collections import OrderedDict from collections import OrderedDict
from datetime import datetime from datetime import datetime
from urllib.parse import unquote from urllib.parse import unquote
from zoneinfo import ZoneInfo
from fastapi import Request from fastapi import Request
@ -62,3 +63,22 @@ def get_request_timezone(request: Request):
if request.user.is_authenticated(): if request.user.is_authenticated():
default_tz = request.user.Timezone default_tz = request.user.Timezone
return unquote(request.cookies.get("AURTZ", default_tz)) return unquote(request.cookies.get("AURTZ", default_tz))
def now(timezone: str) -> datetime:
"""
Get the current timezone-localized timestamp.
:param timezone: Valid timezone supported by ZoneInfo
:return: Current localized datetime
"""
return datetime.now(tz=ZoneInfo(timezone))
def utcnow() -> int:
"""
Get the current UTC timestamp.
:return: Current UTC timestamp
"""
return int(datetime.utcnow().timestamp())

View file

@ -1,9 +1,8 @@
from datetime import datetime
from typing import Any, Dict from typing import Any, Dict
from fastapi import Request from fastapi import Request
from aurweb import cookies, db, models from aurweb import cookies, db, models, time
from aurweb.models.ssh_pub_key import get_fingerprint from aurweb.models.ssh_pub_key import get_fingerprint
from aurweb.util import strtobool from aurweb.util import strtobool
@ -14,7 +13,7 @@ def simple(U: str = str(), E: str = str(), H: bool = False,
CN: bool = False, UN: bool = False, ON: bool = False, CN: bool = False, UN: bool = False, ON: bool = False,
S: bool = False, user: models.User = None, S: bool = False, user: models.User = None,
**kwargs) -> None: **kwargs) -> None:
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
user.Username = U or user.Username user.Username = U or user.Username
user.Email = E or user.Email user.Email = E or user.Email

View file

@ -13,7 +13,7 @@ from fastapi.testclient import TestClient
import aurweb.models.account_type as at import aurweb.models.account_type as at
from aurweb import captcha, db, logging from aurweb import captcha, db, logging, time
from aurweb.asgi import app from aurweb.asgi import app
from aurweb.db import create, query from aurweb.db import create, query
from aurweb.models.accepted_term import AcceptedTerm from aurweb.models.accepted_term import AcceptedTerm
@ -155,7 +155,7 @@ def test_post_passreset_user(client: TestClient, user: User):
def test_post_passreset_resetkey(client: TestClient, user: User): def test_post_passreset_resetkey(client: TestClient, user: User):
with db.begin(): with db.begin():
user.session = Session(UsersID=user.ID, SessionID="blah", user.session = Session(UsersID=user.ID, SessionID="blah",
LastUpdateTS=datetime.utcnow().timestamp()) LastUpdateTS=time.utcnow())
# Prepare a password reset. # Prepare a password reset.
with client as request: with client as request:

View file

@ -1,12 +1,10 @@
from datetime import datetime
import fastapi import fastapi
import pytest import pytest
from fastapi import HTTPException from fastapi import HTTPException
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import config, db from aurweb import config, db, time
from aurweb.auth import AnonymousUser, BasicAuthBackend, _auth_required, account_type_required from aurweb.auth import AnonymousUser, BasicAuthBackend, _auth_required, account_type_required
from aurweb.models.account_type import USER, USER_ID from aurweb.models.account_type import USER, USER_ID
from aurweb.models.session import Session from aurweb.models.session import Session
@ -55,7 +53,7 @@ async def test_auth_backend_invalid_sid(backend: BasicAuthBackend):
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_auth_backend_invalid_user_id(): async def test_auth_backend_invalid_user_id():
# Create a new session with a fake user id. # Create a new session with a fake user id.
now_ts = datetime.utcnow().timestamp() now_ts = time.utcnow()
with pytest.raises(IntegrityError): with pytest.raises(IntegrityError):
Session(UsersID=666, SessionID="realSession", Session(UsersID=666, SessionID="realSession",
LastUpdateTS=now_ts + 5) LastUpdateTS=now_ts + 5)
@ -65,7 +63,7 @@ async def test_auth_backend_invalid_user_id():
async def test_basic_auth_backend(user: User, backend: BasicAuthBackend): async def test_basic_auth_backend(user: User, backend: BasicAuthBackend):
# This time, everything matches up. We expect the user to # This time, everything matches up. We expect the user to
# equal the real_user. # equal the real_user.
now_ts = datetime.utcnow().timestamp() now_ts = time.utcnow()
with db.begin(): with db.begin():
db.create(Session, UsersID=user.ID, SessionID="realSession", db.create(Session, UsersID=user.ID, SessionID="realSession",
LastUpdateTS=now_ts + 5) LastUpdateTS=now_ts + 5)
@ -87,7 +85,7 @@ async def test_expired_session(backend: BasicAuthBackend, user: User):
# Set Session.LastUpdateTS to 20 seconds expired. # Set Session.LastUpdateTS to 20 seconds expired.
timeout = config.getint("options", "login_timeout") timeout = config.getint("options", "login_timeout")
now_ts = int(datetime.utcnow().timestamp()) now_ts = time.utcnow()
with db.begin(): with db.begin():
request.user.session.LastUpdateTS = now_ts - timeout - 20 request.user.session.LastUpdateTS = now_ts - timeout - 20

View file

@ -1,6 +1,5 @@
import re import re
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from unittest import mock from unittest import mock
@ -10,7 +9,7 @@ from fastapi.testclient import TestClient
import aurweb.config import aurweb.config
from aurweb import db from aurweb import db, time
from aurweb.asgi import app from aurweb.asgi import app
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.models.session import Session from aurweb.models.session import Session
@ -200,7 +199,7 @@ def test_login_remember_me(client: TestClient, user: User):
cookie_timeout = aurweb.config.getint( cookie_timeout = aurweb.config.getint(
"options", "persistent_cookie_timeout") "options", "persistent_cookie_timeout")
now_ts = int(datetime.utcnow().timestamp()) now_ts = time.utcnow()
session = db.query(Session).filter(Session.UsersID == user.ID).first() session = db.query(Session).filter(Session.UsersID == user.ID).first()
# Expect that LastUpdateTS is not past the cookie timeout # Expect that LastUpdateTS is not past the cookie timeout
@ -294,7 +293,7 @@ def test_generate_unique_sid_exhausted(client: TestClient, user: User,
This exercises the bad path of /login, where we can't find a unique This exercises the bad path of /login, where we can't find a unique
SID to assign the user. SID to assign the user.
""" """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
# Create a second user; we'll login with this one. # Create a second user; we'll login with this one.
user2 = db.create(User, Username="test2", Email="test2@example.org", user2 = db.create(User, Username="test2", Email="test2@example.org",

View file

@ -1,17 +1,17 @@
from datetime import datetime from datetime import datetime
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
from aurweb import filters from aurweb import filters, time
def test_timestamp_to_datetime(): def test_timestamp_to_datetime():
ts = datetime.utcnow().timestamp() ts = time.utcnow()
dt = datetime.utcfromtimestamp(int(ts)) dt = datetime.utcfromtimestamp(int(ts))
assert filters.timestamp_to_datetime(ts) == dt assert filters.timestamp_to_datetime(ts) == dt
def test_as_timezone(): def test_as_timezone():
ts = datetime.utcnow().timestamp() ts = time.utcnow()
dt = filters.timestamp_to_datetime(ts) dt = filters.timestamp_to_datetime(ts)
assert filters.as_timezone(dt, "UTC") == dt.astimezone(tz=ZoneInfo("UTC")) assert filters.as_timezone(dt, "UTC") == dt.astimezone(tz=ZoneInfo("UTC"))

View file

@ -1,6 +1,5 @@
import re import re
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from unittest.mock import patch from unittest.mock import patch
@ -8,7 +7,7 @@ import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from aurweb import db from aurweb import db, time
from aurweb.asgi import app from aurweb.asgi import app
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.models.package import Package from aurweb.models.package import Package
@ -62,7 +61,7 @@ def packages(user):
# For i..num_packages, create a package named pkg_{i}. # For i..num_packages, create a package named pkg_{i}.
pkgs = [] pkgs = []
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
for i in range(num_packages): for i in range(num_packages):
pkgbase = db.create(PackageBase, Name=f"pkg_{i}", pkgbase = db.create(PackageBase, Name=f"pkg_{i}",
@ -184,7 +183,7 @@ def test_homepage_dashboard(redis, packages, user):
def test_homepage_dashboard_requests(redis, packages, user): def test_homepage_dashboard_requests(redis, packages, user):
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
pkg = packages[0] pkg = packages[0]
reqtype = db.query(RequestType, RequestType.ID == DELETION_ID).first() reqtype = db.query(RequestType, RequestType.ID == DELETION_ID).first()
@ -210,7 +209,7 @@ def test_homepage_dashboard_flagged_packages(redis, packages, user):
# Set the first Package flagged by setting its OutOfDateTS column. # Set the first Package flagged by setting its OutOfDateTS column.
pkg = packages[0] pkg = packages[0]
with db.begin(): with db.begin():
pkg.PackageBase.OutOfDateTS = int(datetime.utcnow().timestamp()) pkg.PackageBase.OutOfDateTS = time.utcnow()
cookies = {"AURSID": user.login(Request(), "testPassword")} cookies = {"AURSID": user.login(Request(), "testPassword")}
with client as request: with client as request:

View file

@ -1,11 +1,10 @@
from datetime import datetime
from logging import ERROR from logging import ERROR
from typing import List from typing import List
from unittest import mock from unittest import mock
import pytest import pytest
from aurweb import config, db, models from aurweb import config, db, models, time
from aurweb.models import Package, PackageBase, PackageRequest, User from aurweb.models import Package, PackageBase, PackageRequest, User
from aurweb.models.account_type import TRUSTED_USER_ID, USER_ID from aurweb.models.account_type import TRUSTED_USER_ID, USER_ID
from aurweb.models.request_type import ORPHAN_ID from aurweb.models.request_type import ORPHAN_ID
@ -48,7 +47,7 @@ def user2() -> User:
@pytest.fixture @pytest.fixture
def pkgbases(user: User) -> List[PackageBase]: def pkgbases(user: User) -> List[PackageBase]:
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
output = [] output = []
with db.begin(): with db.begin():

View file

@ -1,10 +1,8 @@
from datetime import datetime
import pytest import pytest
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import db from aurweb import db, time
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.models.package_base import PackageBase from aurweb.models.package_base import PackageBase
from aurweb.models.package_request import (ACCEPTED, ACCEPTED_ID, CLOSED, CLOSED_ID, PENDING, PENDING_ID, REJECTED, from aurweb.models.package_request import (ACCEPTED, ACCEPTED_ID, CLOSED, CLOSED_ID, PENDING, PENDING_ID, REJECTED,
@ -54,7 +52,7 @@ def test_package_request_creation(user: User, pkgbase: PackageBase):
def test_package_request_closed(user: User, pkgbase: PackageBase): def test_package_request_closed(user: User, pkgbase: PackageBase):
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
with db.begin(): with db.begin():
package_request = db.create(PackageRequest, ReqTypeID=MERGE_ID, package_request = db.create(PackageRequest, ReqTypeID=MERGE_ID,
User=user, PackageBase=pkgbase, User=user, PackageBase=pkgbase,

View file

@ -1,10 +1,8 @@
from datetime import datetime
import pytest import pytest
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import db from aurweb import db, time
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.models.package_base import PackageBase from aurweb.models.package_base import PackageBase
from aurweb.models.package_vote import PackageVote from aurweb.models.package_vote import PackageVote
@ -33,7 +31,7 @@ def pkgbase(user: User) -> PackageBase:
def test_package_vote_creation(user: User, pkgbase: PackageBase): def test_package_vote_creation(user: User, pkgbase: PackageBase):
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
with db.begin(): with db.begin():
package_vote = db.create(PackageVote, User=user, package_vote = db.create(PackageVote, User=user,

View file

@ -1,6 +1,5 @@
import re import re
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from typing import List from typing import List
from unittest import mock from unittest import mock
@ -9,7 +8,7 @@ import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from aurweb import asgi, db from aurweb import asgi, db, time
from aurweb.models import License, PackageLicense from aurweb.models import License, PackageLicense
from aurweb.models.account_type import USER_ID, AccountType from aurweb.models.account_type import USER_ID, AccountType
from aurweb.models.dependency_type import DependencyType from aurweb.models.dependency_type import DependencyType
@ -116,7 +115,7 @@ def tu_user():
@pytest.fixture @pytest.fixture
def package(maintainer: User) -> Package: def package(maintainer: User) -> Package:
""" Yield a Package created by user. """ """ Yield a Package created by user. """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgbase = db.create(PackageBase, pkgbase = db.create(PackageBase,
Name="test-package", Name="test-package",
@ -138,7 +137,7 @@ def pkgbase(package: Package) -> PackageBase:
@pytest.fixture @pytest.fixture
def target(maintainer: User) -> PackageBase: def target(maintainer: User) -> PackageBase:
""" Merge target. """ """ Merge target. """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgbase = db.create(PackageBase, Name="target-package", pkgbase = db.create(PackageBase, Name="target-package",
Maintainer=maintainer, Maintainer=maintainer,
@ -166,7 +165,7 @@ def pkgreq(user: User, pkgbase: PackageBase) -> PackageRequest:
@pytest.fixture @pytest.fixture
def comment(user: User, package: Package) -> PackageComment: def comment(user: User, package: Package) -> PackageComment:
pkgbase = package.PackageBase pkgbase = package.PackageBase
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
comment = db.create(PackageComment, comment = db.create(PackageComment,
User=user, User=user,
@ -181,7 +180,7 @@ def comment(user: User, package: Package) -> PackageComment:
def packages(maintainer: User) -> List[Package]: def packages(maintainer: User) -> List[Package]:
""" Yield 55 packages named pkg_0 .. pkg_54. """ """ Yield 55 packages named pkg_0 .. pkg_54. """
packages_ = [] packages_ = []
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
for i in range(55): for i in range(55):
pkgbase = db.create(PackageBase, pkgbase = db.create(PackageBase,
@ -293,7 +292,7 @@ def test_package(client: TestClient, package: Package):
def test_package_comments(client: TestClient, user: User, package: Package): def test_package_comments(client: TestClient, user: User, package: Package):
now = (datetime.utcnow().timestamp()) now = (time.utcnow())
with db.begin(): with db.begin():
comment = db.create(PackageComment, PackageBase=package.PackageBase, comment = db.create(PackageComment, PackageBase=package.PackageBase,
User=user, Comments="Test comment", CommentTS=now) User=user, Comments="Test comment", CommentTS=now)
@ -847,7 +846,7 @@ def test_packages_sort_by_popularity(client: TestClient,
def test_packages_sort_by_voted(client: TestClient, def test_packages_sort_by_voted(client: TestClient,
maintainer: User, maintainer: User,
packages: List[Package]): packages: List[Package]):
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
db.create(PackageVote, PackageBase=packages[0].PackageBase, db.create(PackageVote, PackageBase=packages[0].PackageBase,
User=maintainer, VoteTS=now) User=maintainer, VoteTS=now)
@ -942,7 +941,7 @@ def test_packages_sort_by_maintainer(client: TestClient,
def test_packages_sort_by_last_modified(client: TestClient, def test_packages_sort_by_last_modified(client: TestClient,
packages: List[Package]): packages: List[Package]):
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
# Set the first package's ModifiedTS to be 1000 seconds before now. # Set the first package's ModifiedTS to be 1000 seconds before now.
package = packages[0] package = packages[0]
with db.begin(): with db.begin():
@ -970,7 +969,7 @@ def test_packages_flagged(client: TestClient, maintainer: User,
packages: List[Package]): packages: List[Package]):
package = packages[0] package = packages[0]
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
package.PackageBase.OutOfDateTS = now package.PackageBase.OutOfDateTS = now
@ -1100,7 +1099,7 @@ def test_packages_post(client: TestClient, user: User, package: Package):
def test_packages_post_unflag(client: TestClient, user: User, def test_packages_post_unflag(client: TestClient, user: User,
maintainer: User, package: Package): maintainer: User, package: Package):
# Flag `package` as `user`. # Flag `package` as `user`.
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
package.PackageBase.Flagger = user package.PackageBase.Flagger = user
package.PackageBase.OutOfDateTS = now package.PackageBase.OutOfDateTS = now
@ -1127,7 +1126,7 @@ def test_packages_post_unflag(client: TestClient, user: User,
assert successes[0].text.strip() == expected assert successes[0].text.strip() == expected
# Re-flag `package` as `user`. # Re-flag `package` as `user`.
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
package.PackageBase.Flagger = user package.PackageBase.Flagger = user
package.PackageBase.OutOfDateTS = now package.PackageBase.OutOfDateTS = now
@ -1453,7 +1452,7 @@ def test_account_comments(client: TestClient, user: User, package: Package):
""" This test may seem out of place, but it requires packages, """ This test may seem out of place, but it requires packages,
so its being included in the packages routes test suite to so its being included in the packages routes test suite to
leverage existing fixtures. """ leverage existing fixtures. """
now = (datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
# This comment's CommentTS is `now + 1`, so it is found in rendered # This comment's CommentTS is `now + 1`, so it is found in rendered
# HTML before the rendered_comment, which has a CommentTS of `now`. # HTML before the rendered_comment, which has a CommentTS of `now`.

View file

@ -1,10 +1,8 @@
from datetime import datetime
import pytest import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from aurweb import asgi, config, db from aurweb import asgi, config, db, time
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.models.official_provider import OFFICIAL_BASE, OfficialProvider from aurweb.models.official_provider import OFFICIAL_BASE, OfficialProvider
from aurweb.models.package import Package from aurweb.models.package import Package
@ -77,7 +75,7 @@ def test_updated_packages(maintainer: User, package: Package):
def test_query_voted(maintainer: User, package: Package): def test_query_voted(maintainer: User, package: Package):
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
db.create(PackageVote, User=maintainer, VoteTS=now, db.create(PackageVote, User=maintainer, VoteTS=now,
PackageBase=package.PackageBase) PackageBase=package.PackageBase)

View file

@ -1,6 +1,5 @@
import re import re
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from typing import List from typing import List
from unittest import mock from unittest import mock
@ -10,7 +9,7 @@ import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from sqlalchemy import and_ from sqlalchemy import and_
from aurweb import asgi, db from aurweb import asgi, db, time
from aurweb.models.account_type import USER_ID, AccountType from aurweb.models.account_type import USER_ID, AccountType
from aurweb.models.dependency_type import DependencyType from aurweb.models.dependency_type import DependencyType
from aurweb.models.package import Package from aurweb.models.package import Package
@ -115,7 +114,7 @@ def tu_user():
@pytest.fixture @pytest.fixture
def package(maintainer: User) -> Package: def package(maintainer: User) -> Package:
""" Yield a Package created by user. """ """ Yield a Package created by user. """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgbase = db.create(PackageBase, pkgbase = db.create(PackageBase,
Name="test-package", Name="test-package",
@ -137,7 +136,7 @@ def pkgbase(package: Package) -> PackageBase:
@pytest.fixture @pytest.fixture
def target(maintainer: User) -> PackageBase: def target(maintainer: User) -> PackageBase:
""" Merge target. """ """ Merge target. """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgbase = db.create(PackageBase, Name="target-package", pkgbase = db.create(PackageBase, Name="target-package",
Maintainer=maintainer, Maintainer=maintainer,
@ -165,7 +164,7 @@ def pkgreq(user: User, pkgbase: PackageBase) -> PackageRequest:
@pytest.fixture @pytest.fixture
def comment(user: User, package: Package) -> PackageComment: def comment(user: User, package: Package) -> PackageComment:
pkgbase = package.PackageBase pkgbase = package.PackageBase
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
comment = db.create(PackageComment, comment = db.create(PackageComment,
User=user, User=user,
@ -180,7 +179,7 @@ def comment(user: User, package: Package) -> PackageComment:
def packages(maintainer: User) -> List[Package]: def packages(maintainer: User) -> List[Package]:
""" Yield 55 packages named pkg_0 .. pkg_54. """ """ Yield 55 packages named pkg_0 .. pkg_54. """
packages_ = [] packages_ = []
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
for i in range(55): for i in range(55):
pkgbase = db.create(PackageBase, pkgbase = db.create(PackageBase,
@ -258,7 +257,7 @@ def test_pkgbase_voters(client: TestClient, tu_user: User, package: Package):
pkgbase = package.PackageBase pkgbase = package.PackageBase
endpoint = f"/pkgbase/{pkgbase.Name}/voters" endpoint = f"/pkgbase/{pkgbase.Name}/voters"
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
db.create(PackageVote, User=tu_user, PackageBase=pkgbase, VoteTS=now) db.create(PackageVote, User=tu_user, PackageBase=pkgbase, VoteTS=now)
@ -279,7 +278,7 @@ def test_pkgbase_voters_unauthorized(client: TestClient, user: User,
pkgbase = package.PackageBase pkgbase = package.PackageBase
endpoint = f"/pkgbase/{pkgbase.Name}/voters" endpoint = f"/pkgbase/{pkgbase.Name}/voters"
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
db.create(PackageVote, User=user, PackageBase=pkgbase, VoteTS=now) db.create(PackageVote, User=user, PackageBase=pkgbase, VoteTS=now)
@ -303,7 +302,7 @@ def test_pkgbase_comment_not_found(client: TestClient, maintainer: User,
def test_pkgbase_comment_form_unauthorized(client: TestClient, user: User, def test_pkgbase_comment_form_unauthorized(client: TestClient, user: User,
maintainer: User, package: Package): maintainer: User, package: Package):
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
comment = db.create(PackageComment, PackageBase=package.PackageBase, comment = db.create(PackageComment, PackageBase=package.PackageBase,
User=maintainer, Comments="Test", User=maintainer, Comments="Test",

View file

@ -1,9 +1,8 @@
from datetime import datetime
from typing import List from typing import List
import pytest import pytest
from aurweb import db from aurweb import db, time
from aurweb.models import Package, PackageBase, User from aurweb.models import Package, PackageBase, User
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.scripts import pkgmaint from aurweb.scripts import pkgmaint
@ -26,7 +25,7 @@ def user() -> User:
def packages(user: User) -> List[Package]: def packages(user: User) -> List[Package]:
output = [] output = []
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
for i in range(5): for i in range(5):
pkgbase = db.create(PackageBase, Name=f"pkg_{i}", pkgbase = db.create(PackageBase, Name=f"pkg_{i}",

View file

@ -1,9 +1,8 @@
from datetime import datetime
from unittest import mock from unittest import mock
import pytest import pytest
from aurweb import config, db, logging from aurweb import config, db, logging, time
from aurweb.models import Package, PackageBase, PackageComment, User from aurweb.models import Package, PackageBase, PackageComment, User
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.scripts import rendercomment from aurweb.scripts import rendercomment
@ -39,7 +38,7 @@ def user() -> User:
@pytest.fixture @pytest.fixture
def pkgbase(user: User) -> PackageBase: def pkgbase(user: User) -> PackageBase:
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgbase = db.create(PackageBase, Packager=user, Name="pkgbase_0", pkgbase = db.create(PackageBase, Packager=user, Name="pkgbase_0",
SubmittedTS=now, ModifiedTS=now) SubmittedTS=now, ModifiedTS=now)

View file

@ -1,6 +1,5 @@
import re import re
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from logging import DEBUG from logging import DEBUG
from typing import List from typing import List
@ -10,7 +9,7 @@ import pytest
from fastapi import HTTPException from fastapi import HTTPException
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from aurweb import asgi, config, db, defaults from aurweb import asgi, config, db, defaults, time
from aurweb.models import Package, PackageBase, PackageRequest, User from aurweb.models import Package, PackageBase, PackageRequest, User
from aurweb.models.account_type import TRUSTED_USER_ID, USER_ID from aurweb.models.account_type import TRUSTED_USER_ID, USER_ID
from aurweb.models.package_notification import PackageNotification from aurweb.models.package_notification import PackageNotification
@ -94,7 +93,7 @@ def maintainer() -> User:
def packages(maintainer: User) -> List[Package]: def packages(maintainer: User) -> List[Package]:
""" Yield 55 packages named pkg_0 .. pkg_54. """ """ Yield 55 packages named pkg_0 .. pkg_54. """
packages_ = [] packages_ = []
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
for i in range(55): for i in range(55):
pkgbase = db.create(PackageBase, pkgbase = db.create(PackageBase,
@ -148,7 +147,7 @@ def create_pkgbase(user: User, name: str) -> PackageBase:
:param name: PackageBase.Name :param name: PackageBase.Name
:return: PackageBase instance :return: PackageBase instance
""" """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgbase = db.create(PackageBase, Name=name, pkgbase = db.create(PackageBase, Name=name,
Maintainer=user, Packager=user, Maintainer=user, Packager=user,
@ -185,7 +184,7 @@ def create_request(reqtype_id: int, user: User, pkgbase: PackageBase,
:param comments: PackageRequest.Comments :param comments: PackageRequest.Comments
:return: PackageRequest instance :return: PackageRequest instance
""" """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgreq = db.create(PackageRequest, ReqTypeID=reqtype_id, pkgreq = db.create(PackageRequest, ReqTypeID=reqtype_id,
User=user, PackageBase=pkgbase, User=user, PackageBase=pkgbase,
@ -274,7 +273,7 @@ def test_request_post_deletion_autoaccept(client: TestClient, auser: User,
""" Test the request route for deletion as maintainer. """ """ Test the request route for deletion as maintainer. """
caplog.set_level(DEBUG) caplog.set_level(DEBUG)
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
auto_delete_age = config.getint("options", "auto_delete_age") auto_delete_age = config.getint("options", "auto_delete_age")
with db.begin(): with db.begin():
pkgbase.ModifiedTS = now - auto_delete_age + 100 pkgbase.ModifiedTS = now - auto_delete_age + 100
@ -503,7 +502,7 @@ def test_orphan_request(client: TestClient, user: User, tu_user: User,
pkgbase: PackageBase, pkgreq: PackageRequest): pkgbase: PackageBase, pkgreq: PackageRequest):
""" Test the standard orphan request route. """ """ Test the standard orphan request route. """
idle_time = config.getint("options", "request_idle_time") idle_time = config.getint("options", "request_idle_time")
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgreq.ReqTypeID = ORPHAN_ID pkgreq.ReqTypeID = ORPHAN_ID
# Set the request time so it's seen as due (idle_time has passed). # Set the request time so it's seen as due (idle_time has passed).
@ -532,7 +531,7 @@ def test_request_post_orphan_autogenerated_closure(client: TestClient,
pkgbase: PackageBase, pkgbase: PackageBase,
pkgreq: PackageRequest): pkgreq: PackageRequest):
idle_time = config.getint("options", "request_idle_time") idle_time = config.getint("options", "request_idle_time")
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgreq.ReqTypeID = ORPHAN_ID pkgreq.ReqTypeID = ORPHAN_ID
# Set the request time so it's seen as due (idle_time has passed). # Set the request time so it's seen as due (idle_time has passed).
@ -559,7 +558,7 @@ def test_request_post_orphan_autoaccept(client: TestClient, auser: User,
caplog: pytest.LogCaptureFixture): caplog: pytest.LogCaptureFixture):
""" Test the standard pkgbase request route GET method. """ """ Test the standard pkgbase request route GET method. """
caplog.set_level(DEBUG) caplog.set_level(DEBUG)
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
auto_orphan_age = config.getint("options", "auto_orphan_age") auto_orphan_age = config.getint("options", "auto_orphan_age")
with db.begin(): with db.begin():
pkgbase.OutOfDateTS = now - auto_orphan_age - 100 pkgbase.OutOfDateTS = now - auto_orphan_age - 100

View file

@ -1,6 +1,5 @@
import re import re
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from typing import List from typing import List
from unittest import mock from unittest import mock
@ -14,7 +13,7 @@ from redis.client import Pipeline
import aurweb.models.dependency_type as dt import aurweb.models.dependency_type as dt
import aurweb.models.relation_type as rt import aurweb.models.relation_type as rt
from aurweb import asgi, config, db, rpc, scripts from aurweb import asgi, config, db, rpc, scripts, time
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.models.license import License from aurweb.models.license import License
from aurweb.models.package import Package from aurweb.models.package import Package
@ -112,7 +111,7 @@ def packages(user: User, user2: User, user3: User) -> List[Package]:
PackageBase=output[0].PackageBase, PackageBase=output[0].PackageBase,
Keyword=keyword) Keyword=keyword)
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
for user_ in [user, user2, user3]: for user_ in [user, user2, user3]:
db.create(PackageVote, User=user_, db.create(PackageVote, User=user_,
PackageBase=output[0].PackageBase, VoteTS=now) PackageBase=output[0].PackageBase, VoteTS=now)

View file

@ -1,4 +1,3 @@
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
import lxml.etree import lxml.etree
@ -6,7 +5,7 @@ import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from aurweb import db, logging from aurweb import db, logging, time
from aurweb.asgi import app from aurweb.asgi import app
from aurweb.models.account_type import AccountType from aurweb.models.account_type import AccountType
from aurweb.models.package import Package from aurweb.models.package import Package
@ -40,7 +39,7 @@ def user():
@pytest.fixture @pytest.fixture
def packages(user): def packages(user):
pkgs = [] pkgs = []
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
# Create 101 packages; we limit 100 on RSS feeds. # Create 101 packages; we limit 100 on RSS feeds.
with db.begin(): with db.begin():

View file

@ -1,12 +1,11 @@
""" Test our Session model. """ """ Test our Session model. """
from datetime import datetime
from unittest import mock from unittest import mock
import pytest import pytest
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import db from aurweb import db, time
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.models.session import Session, generate_unique_sid from aurweb.models.session import Session, generate_unique_sid
from aurweb.models.user import User from aurweb.models.user import User
@ -30,7 +29,7 @@ def user() -> User:
def session(user: User) -> Session: def session(user: User) -> Session:
with db.begin(): with db.begin():
session = db.create(Session, User=user, SessionID="testSession", session = db.create(Session, User=user, SessionID="testSession",
LastUpdateTS=datetime.utcnow().timestamp()) LastUpdateTS=time.utcnow())
yield session yield session
@ -48,7 +47,7 @@ def test_session_cs():
with db.begin(): with db.begin():
session_cs = db.create(Session, User=user2, SessionID="TESTSESSION", session_cs = db.create(Session, User=user2, SessionID="TESTSESSION",
LastUpdateTS=datetime.utcnow().timestamp()) LastUpdateTS=time.utcnow())
assert session_cs.SessionID == "TESTSESSION" assert session_cs.SessionID == "TESTSESSION"
assert session_cs.SessionID != "testSession" assert session_cs.SessionID != "testSession"

View file

@ -1,13 +1,12 @@
import re import re
from datetime import datetime
from typing import Any, Dict from typing import Any, Dict
import pytest import pytest
import aurweb.filters # noqa: F401 import aurweb.filters # noqa: F401
from aurweb import config, db, templates from aurweb import config, db, templates, time
from aurweb.filters import as_timezone, number_format from aurweb.filters import as_timezone, number_format
from aurweb.filters import timestamp_to_datetime as to_dt from aurweb.filters import timestamp_to_datetime as to_dt
from aurweb.models import Package, PackageBase, User from aurweb.models import Package, PackageBase, User
@ -59,7 +58,7 @@ def user(db_test) -> User:
@pytest.fixture @pytest.fixture
def pkgbase(user: User) -> PackageBase: def pkgbase(user: User) -> PackageBase:
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
pkgbase = db.create(PackageBase, Name="test-pkg", Maintainer=user, pkgbase = db.create(PackageBase, Name="test-pkg", Maintainer=user,
SubmittedTS=now, ModifiedTS=now) SubmittedTS=now, ModifiedTS=now)

View file

@ -1,6 +1,5 @@
import re import re
from datetime import datetime
from http import HTTPStatus from http import HTTPStatus
from io import StringIO from io import StringIO
from typing import Tuple from typing import Tuple
@ -10,7 +9,7 @@ import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from aurweb import config, db, filters from aurweb import config, db, filters, time
from aurweb.models.account_type import DEVELOPER_ID, AccountType from aurweb.models.account_type import DEVELOPER_ID, AccountType
from aurweb.models.tu_vote import TUVote from aurweb.models.tu_vote import TUVote
from aurweb.models.tu_voteinfo import TUVoteInfo from aurweb.models.tu_voteinfo import TUVoteInfo
@ -111,7 +110,7 @@ def user():
@pytest.fixture @pytest.fixture
def proposal(user, tu_user): def proposal(user, tu_user):
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
agenda = "Test proposal." agenda = "Test proposal."
start = ts - 5 start = ts - 5
end = ts + 1000 end = ts + 1000
@ -165,7 +164,7 @@ def test_tu_empty_index(client, tu_user):
def test_tu_index(client, tu_user): def test_tu_index(client, tu_user):
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
# Create some test votes: (Agenda, Start, End). # Create some test votes: (Agenda, Start, End).
votes = [ votes = [
@ -258,7 +257,7 @@ def test_tu_index(client, tu_user):
def test_tu_index_table_paging(client, tu_user): def test_tu_index_table_paging(client, tu_user):
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
with db.begin(): with db.begin():
for i in range(25): for i in range(25):
@ -366,7 +365,7 @@ def test_tu_index_table_paging(client, tu_user):
def test_tu_index_sorting(client, tu_user): def test_tu_index_sorting(client, tu_user):
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
with db.begin(): with db.begin():
for i in range(2): for i in range(2):
@ -436,7 +435,7 @@ def test_tu_index_sorting(client, tu_user):
def test_tu_index_last_votes(client, tu_user, user): def test_tu_index_last_votes(client, tu_user, user):
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
with db.begin(): with db.begin():
# Create a proposal which has ended. # Create a proposal which has ended.
@ -584,7 +583,7 @@ def test_tu_running_proposal(client: TestClient,
def test_tu_ended_proposal(client, proposal): def test_tu_ended_proposal(client, proposal):
tu_user, user, voteinfo = proposal tu_user, user, voteinfo = proposal
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
with db.begin(): with db.begin():
voteinfo.End = ts - 5 # 5 seconds ago. voteinfo.End = ts - 5 # 5 seconds ago.

View file

@ -1,10 +1,8 @@
from datetime import datetime
import pytest import pytest
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import db from aurweb import db, time
from aurweb.models.account_type import TRUSTED_USER_ID from aurweb.models.account_type import TRUSTED_USER_ID
from aurweb.models.tu_vote import TUVote from aurweb.models.tu_vote import TUVote
from aurweb.models.tu_voteinfo import TUVoteInfo from aurweb.models.tu_voteinfo import TUVoteInfo
@ -27,7 +25,7 @@ def user() -> User:
@pytest.fixture @pytest.fixture
def tu_voteinfo(user: User) -> TUVoteInfo: def tu_voteinfo(user: User) -> TUVoteInfo:
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
with db.begin(): with db.begin():
tu_voteinfo = db.create(TUVoteInfo, Agenda="Blah blah.", tu_voteinfo = db.create(TUVoteInfo, Agenda="Blah blah.",
User=user.Username, User=user.Username,

View file

@ -1,10 +1,8 @@
from datetime import datetime
import pytest import pytest
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import db from aurweb import db, time
from aurweb.db import create, rollback from aurweb.db import create, rollback
from aurweb.models.account_type import TRUSTED_USER_ID from aurweb.models.account_type import TRUSTED_USER_ID
from aurweb.models.tu_voteinfo import TUVoteInfo from aurweb.models.tu_voteinfo import TUVoteInfo
@ -26,7 +24,7 @@ def user() -> User:
def test_tu_voteinfo_creation(user: User): def test_tu_voteinfo_creation(user: User):
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
with db.begin(): with db.begin():
tu_voteinfo = create(TUVoteInfo, tu_voteinfo = create(TUVoteInfo,
Agenda="Blah blah.", Agenda="Blah blah.",
@ -50,7 +48,7 @@ def test_tu_voteinfo_creation(user: User):
def test_tu_voteinfo_is_running(user: User): def test_tu_voteinfo_is_running(user: User):
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
with db.begin(): with db.begin():
tu_voteinfo = create(TUVoteInfo, tu_voteinfo = create(TUVoteInfo,
Agenda="Blah blah.", Agenda="Blah blah.",
@ -66,7 +64,7 @@ def test_tu_voteinfo_is_running(user: User):
def test_tu_voteinfo_total_votes(user: User): def test_tu_voteinfo_total_votes(user: User):
ts = int(datetime.utcnow().timestamp()) ts = time.utcnow()
with db.begin(): with db.begin():
tu_voteinfo = create(TUVoteInfo, tu_voteinfo = create(TUVoteInfo,
Agenda="Blah blah.", Agenda="Blah blah.",

View file

@ -1,9 +1,8 @@
from datetime import datetime
from typing import Tuple from typing import Tuple
import pytest import pytest
from aurweb import config, db from aurweb import config, db, time
from aurweb.models import TUVote, TUVoteInfo, User from aurweb.models import TUVote, TUVoteInfo, User
from aurweb.models.account_type import TRUSTED_USER_ID from aurweb.models.account_type import TRUSTED_USER_ID
from aurweb.scripts import tuvotereminder as reminder from aurweb.scripts import tuvotereminder as reminder
@ -56,7 +55,7 @@ def user3() -> User:
@pytest.fixture @pytest.fixture
def voteinfo(user: User) -> TUVoteInfo: def voteinfo(user: User) -> TUVoteInfo:
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
start = config.getint("tuvotereminder", "range_start") start = config.getint("tuvotereminder", "range_start")
with db.begin(): with db.begin():
voteinfo = db.create(TUVoteInfo, Agenda="Lorem ipsum.", voteinfo = db.create(TUVoteInfo, Agenda="Lorem ipsum.",

View file

@ -1,8 +1,6 @@
from datetime import datetime
import pytest import pytest
from aurweb import db from aurweb import db, time
from aurweb.models import User from aurweb.models import User
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.scripts import usermaint from aurweb.scripts import usermaint
@ -24,7 +22,7 @@ def user() -> User:
def test_usermaint_noop(user: User): def test_usermaint_noop(user: User):
""" Last[SSH]Login isn't expired in this test: usermaint is noop. """ """ Last[SSH]Login isn't expired in this test: usermaint is noop. """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
with db.begin(): with db.begin():
user.LastLoginIPAddress = "127.0.0.1" user.LastLoginIPAddress = "127.0.0.1"
user.LastLogin = now - 10 user.LastLogin = now - 10
@ -45,7 +43,7 @@ def test_usermaint(user: User):
its code path. its code path.
""" """
now = int(datetime.utcnow().timestamp()) now = time.utcnow()
limit_to = now - 86400 * 7 limit_to = now - 86400 * 7
with db.begin(): with db.begin():
user.LastLoginIPAddress = "127.0.0.1" user.LastLoginIPAddress = "127.0.0.1"