feat: switch all timezone naive datetimes to timezone aware

This commit is contained in:
Iain Learmonth 2024-12-06 16:08:48 +00:00
parent 41fc0a73a5
commit e22abb383c
30 changed files with 322 additions and 226 deletions

View file

@ -3,28 +3,28 @@ import logging
from datetime import datetime, timedelta, timezone
from typing import Optional
from flask import Blueprint, render_template, request, url_for, redirect
from flask import Blueprint, redirect, render_template, request, url_for
from flask.typing import ResponseReturnValue
from markupsafe import Markup
from sqlalchemy import desc, or_, func
from sqlalchemy import desc, func, or_
from app.alarms import alarms_for
from app.models.activity import Activity
from app.models.alarms import Alarm, AlarmState
from app.models.base import Group
from app.models.bridges import Bridge
from app.models.mirrors import Origin, Proxy
from app.models.base import Group
from app.models.onions import Eotk
from app.portal.country import bp as country
from app.portal.cloud import bp as cloud
from app.portal.automation import bp as automation
from app.portal.bridgeconf import bp as bridgeconf
from app.portal.bridge import bp as bridge
from app.portal.bridgeconf import bp as bridgeconf
from app.portal.cloud import bp as cloud
from app.portal.country import bp as country
from app.portal.eotk import bp as eotk
from app.portal.group import bp as group
from app.portal.list import bp as list_
from app.portal.origin import bp as origin
from app.portal.onion import bp as onion
from app.portal.origin import bp as origin
from app.portal.pool import bp as pool
from app.portal.proxy import bp as proxy
from app.portal.smart_proxy import bp as smart_proxy
@ -57,7 +57,7 @@ def calculate_bridge_expiry(b: Bridge) -> str:
logging.warning("Bridge expiry requested by template for a bridge %s that was not expiring.", b.id)
return "Not expiring"
expiry = b.deprecated + timedelta(hours=b.conf.expiry_hours)
countdown = expiry - datetime.utcnow()
countdown = expiry - datetime.now(tz=timezone.utc)
if countdown.days == 0:
return f"{countdown.seconds // 3600} hours"
return f"{countdown.days} days"
@ -66,7 +66,7 @@ def calculate_bridge_expiry(b: Bridge) -> str:
@portal.app_template_filter("mirror_expiry")
def calculate_mirror_expiry(s: datetime) -> str:
expiry = s + timedelta(days=3)
countdown = expiry - datetime.utcnow()
countdown = expiry - datetime.now(tz=timezone.utc)
if countdown.days == 0:
return f"{countdown.seconds // 3600} hours"
return f"{countdown.days} days"

View file

@ -1,16 +1,16 @@
from datetime import datetime
from datetime import datetime, timezone
from typing import Optional
from flask import render_template, flash, Response, Blueprint, current_app
from flask import Blueprint, Response, current_app, flash, render_template
from flask.typing import ResponseReturnValue
from flask_wtf import FlaskForm
from sqlalchemy import exc, desc
from wtforms import SubmitField, BooleanField
from sqlalchemy import desc, exc
from wtforms import BooleanField, SubmitField
from app.extensions import db
from app.models.automation import Automation, AutomationLogs
from app.models.tfstate import TerraformState
from app.portal.util import view_lifecycle, response_404
from app.portal.util import response_404, view_lifecycle
bp = Blueprint("automation", __name__)
@ -54,7 +54,7 @@ def automation_edit(automation_id: int) -> ResponseReturnValue:
form = EditAutomationForm(enabled=automation.enabled)
if form.validate_on_submit():
automation.enabled = form.enabled.data
automation.updated = datetime.utcnow()
automation.updated = datetime.now(tz=timezone.utc)
try:
db.session.commit()
flash("Saved changes to bridge configuration.", "success")

View file

@ -1,11 +1,12 @@
from datetime import datetime
from typing import Optional, List
from datetime import datetime, timezone
from typing import List, Optional
from flask import render_template, url_for, flash, redirect, Response, Blueprint
from flask import (Blueprint, Response, flash, redirect, render_template,
url_for)
from flask.typing import ResponseReturnValue
from flask_wtf import FlaskForm
from sqlalchemy import exc
from wtforms import SelectField, StringField, IntegerField, SubmitField
from wtforms import IntegerField, SelectField, StringField, SubmitField
from wtforms.validators import DataRequired, NumberRange
from app.extensions import db
@ -99,8 +100,8 @@ def bridgeconf_new(group_id: Optional[int] = None) -> ResponseReturnValue:
bridgeconf.max_number = form.max_number.data
bridgeconf.expiry_hours = form.expiry_hours.data
bridgeconf.provider_allocation = ProviderAllocation[form.provider_allocation.data]
bridgeconf.created = datetime.utcnow()
bridgeconf.updated = datetime.utcnow()
bridgeconf.added = datetime.now(tz=timezone.utc)
bridgeconf.updated = datetime.now(tz=timezone.utc)
try:
db.session.add(bridgeconf)
db.session.commit()
@ -137,7 +138,7 @@ def bridgeconf_edit(bridgeconf_id: int) -> ResponseReturnValue:
bridgeconf.max_number = form.max_number.data
bridgeconf.expiry_hours = form.expiry_hours.data
bridgeconf.provider_allocation = ProviderAllocation[form.provider_allocation.data]
bridgeconf.updated = datetime.utcnow()
bridgeconf.updated = datetime.now(tz=timezone.utc)
try:
db.session.commit()
flash("Saved changes to bridge configuration.", "success")

View file

@ -1,10 +1,10 @@
from datetime import datetime
from datetime import datetime, timezone
import sqlalchemy
from flask import Blueprint, render_template, Response, flash
from flask import Blueprint, Response, flash, render_template
from flask.typing import ResponseReturnValue
from flask_wtf import FlaskForm
from wtforms import IntegerField, BooleanField, SubmitField
from wtforms import BooleanField, IntegerField, SubmitField
from app.extensions import db
from app.models.mirrors import Country
@ -63,7 +63,7 @@ def country_edit(country_id: int) -> ResponseReturnValue:
country.risk_level_override = form.risk_level_override_number.data
else:
country.risk_level_override = None
country.updated = datetime.utcnow()
country.updated = datetime.now(tz=timezone.utc)
try:
db.session.commit()
flash("Saved changes to country.", "success")

View file

@ -1,10 +1,11 @@
from datetime import datetime
from datetime import datetime, timezone
from flask import render_template, url_for, flash, redirect, Response, Blueprint
import sqlalchemy
from flask import (Blueprint, Response, flash, redirect, render_template,
url_for)
from flask.typing import ResponseReturnValue
from flask_wtf import FlaskForm
import sqlalchemy
from wtforms import StringField, BooleanField, SubmitField
from wtforms import BooleanField, StringField, SubmitField
from wtforms.validators import DataRequired
from app.extensions import db
@ -72,7 +73,7 @@ def group_edit(group_id: int) -> ResponseReturnValue:
if form.validate_on_submit():
group.description = form.description.data
group.eotk = form.eotk.data
group.updated = datetime.utcnow()
group.updated = datetime.now(tz=timezone.utc)
try:
db.session.commit()
flash("Saved changes to group.", "success")

View file

@ -1,8 +1,9 @@
import json
from datetime import datetime
from typing import Optional, Any
from datetime import datetime, timezone
from typing import Any, Optional
from flask import render_template, url_for, flash, redirect, Blueprint, Response
from flask import (Blueprint, Response, flash, redirect, render_template,
url_for)
from flask.typing import ResponseReturnValue
from flask_wtf import FlaskForm
from sqlalchemy import exc
@ -103,8 +104,8 @@ def list_new(group_id: Optional[int] = None) -> ResponseReturnValue:
list_.branch = form.branch.data
list_.role = form.role.data
list_.filename = form.filename.data
list_.created = datetime.utcnow()
list_.updated = datetime.utcnow()
list_.added = datetime.now(tz=timezone.utc)
list_.updated = datetime.now(tz=timezone.utc)
try:
db.session.add(list_)
db.session.commit()
@ -176,7 +177,7 @@ def list_edit(list_id: int) -> ResponseReturnValue:
list_.branch = form.branch.data
list_.role = form.role.data
list_.filename = form.filename.data
list_.updated = datetime.utcnow()
list_.updated = datetime.now(tz=timezone.utc)
try:
db.session.commit()
flash("Saved changes to group.", "success")

View file

@ -1,20 +1,22 @@
import urllib.parse
from datetime import datetime
from typing import Optional, List
from datetime import datetime, timezone
from typing import List, Optional
import requests
import sqlalchemy
from flask import flash, redirect, url_for, render_template, Response, Blueprint
from flask import (Blueprint, Response, flash, redirect, render_template,
url_for)
from flask.typing import ResponseReturnValue
from flask_wtf import FlaskForm
from sqlalchemy import exc
from wtforms import StringField, SelectField, SubmitField, BooleanField, IntegerField
from wtforms import (BooleanField, IntegerField, SelectField, StringField,
SubmitField)
from wtforms.validators import DataRequired
from app.extensions import db
from app.models.base import Group
from app.models.mirrors import Origin, Country
from app.portal.util import response_404, view_lifecycle, LifecycleForm
from app.models.mirrors import Country, Origin
from app.portal.util import LifecycleForm, response_404, view_lifecycle
bp = Blueprint("origin", __name__)
@ -64,8 +66,8 @@ def origin_new(group_id: Optional[int] = None) -> ResponseReturnValue:
origin.auto_rotation = form.auto_rotate.data
origin.smart = form.smart_proxy.data
origin.assets = form.asset_domain.data
origin.created = datetime.utcnow()
origin.updated = datetime.utcnow()
origin.added = datetime.now(tz=timezone.utc)
origin.updated = datetime.now(tz=timezone.utc)
try:
db.session.add(origin)
db.session.commit()
@ -106,7 +108,7 @@ def origin_edit(origin_id: int) -> ResponseReturnValue:
origin.risk_level_override = form.risk_level_override_number.data
else:
origin.risk_level_override = None
origin.updated = datetime.utcnow()
origin.updated = datetime.now(tz=timezone.utc)
try:
db.session.commit()
flash(f"Saved changes for origin {origin.domain_name}.", "success")

View file

@ -1,22 +1,22 @@
# mypy: ignore-errors
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
from flask import Blueprint, render_template
from flask.typing import ResponseReturnValue
from sqlalchemy import func, and_, desc
from sqlalchemy import and_, desc, func
from sqlalchemy.orm import aliased
from app.extensions import db
from app.models import Deprecation
from app.models.mirrors import Proxy, Origin, Country
from app.models.mirrors import Country, Origin, Proxy
report = Blueprint("report", __name__)
def generate_subqueries():
DeprecationAlias = aliased(Deprecation)
now = datetime.utcnow()
now = datetime.now(tz=timezone.utc)
deprecations_24hr_subquery = (
db.session.query(
DeprecationAlias.resource_id,
@ -98,7 +98,7 @@ def report_blocks() -> ResponseReturnValue:
Proxy.deprecated,
Proxy.deprecation_reason
).join(Origin, Origin.id == Proxy.origin_id
).filter(and_(Proxy.deprecated > datetime.utcnow() - timedelta(days=1),
).filter(and_(Proxy.deprecated > datetime.now(tz=timezone.utc) - timedelta(days=1),
Proxy.deprecation_reason.like('block_%'))).all()
return render_template("report_blocks.html.j2",

View file

@ -1,16 +1,16 @@
from datetime import datetime
from datetime import datetime, timezone
from typing import Optional
from flask import render_template, flash, Response, Blueprint
from flask import Blueprint, Response, flash, render_template
from flask.typing import ResponseReturnValue
from flask_wtf import FlaskForm
from sqlalchemy import exc
from wtforms import SubmitField, BooleanField
from wtforms import BooleanField, SubmitField
from app.extensions import db
from app.models.automation import Automation
from app.models.tfstate import TerraformState
from app.portal.util import view_lifecycle, response_404
from app.portal.util import response_404, view_lifecycle
bp = Blueprint("storage", __name__)
@ -39,7 +39,7 @@ def storage_edit(storage_key: str) -> ResponseReturnValue:
if form.validate_on_submit():
if form.force_unlock.data:
storage.lock = None
storage.updated = datetime.utcnow()
storage.updated = datetime.now(tz=timezone.utc)
try:
db.session.commit()
flash("Storage has been force unlocked.", "success")

View file

@ -1,11 +1,12 @@
from datetime import datetime
from datetime import datetime, timezone
from typing import Optional
from flask import Blueprint, flash, Response, render_template, redirect, url_for
from flask import (Blueprint, Response, flash, redirect, render_template,
url_for)
from flask.typing import ResponseReturnValue
from flask_wtf import FlaskForm
from sqlalchemy import exc
from wtforms import StringField, SelectField, SubmitField
from wtforms import SelectField, StringField, SubmitField
from wtforms.validators import DataRequired
from app.extensions import db
@ -70,7 +71,7 @@ def webhook_edit(webhook_id: int) -> ResponseReturnValue:
webhook.description = form.description.data
webhook.format = form.description.data
webhook.url = form.description.data
webhook.updated = datetime.utcnow()
webhook.updated = datetime.now(tz=timezone.utc)
try:
db.session.commit()
flash("Saved changes to webhook.", "success")