Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Datetime Autoconversion for Timestamptz Columns #959

Open
wants to merge 21 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
8cfa0c7
Added column tz autoconversion to Table __init__ method
aabmets Mar 17, 2024
95d8e4d
Added tz ability to Timestamptz
aabmets Mar 18, 2024
7dd76d8
Added tz ability to TimestamptzNow
aabmets Mar 18, 2024
06e0625
Added timezone awareness to TimestamptzOffset and TimestamptzCustom
aabmets Mar 19, 2024
c589d44
Added zoneinfo fallback dependency for missing zone data
aabmets Mar 19, 2024
fc708fc
Added backports.zoneinfo
aabmets Mar 19, 2024
705629a
Un-privatized tz attribute from default timestamptz classes
aabmets Mar 19, 2024
a25e814
Added python version constraint to backports.zoneinfo
aabmets Mar 19, 2024
86004b0
Merge branch 'piccolo-orm:master' into timestamptz-autoconversion
aabmets Mar 20, 2024
6611a97
Updated Timestamptz docstring and fixed a bug in TimestamptzCustom.fr…
aabmets Mar 20, 2024
aa9f077
Fixed bug in TimestamptzCustom.from_datetime
aabmets Mar 20, 2024
6fcb93f
Fixed linter and test issues (hopefully)
aabmets Mar 26, 2024
59a531e
Added backport.zoneinfo import with try-except clause, fixed imports …
aabmets Mar 28, 2024
7a3c584
Fixed linting errors across codebase and fixed timestamptz test error…
aabmets Mar 28, 2024
41a6d0c
Fixed zoneinfo module import for autogenerated migrations files
aabmets Mar 28, 2024
ad0d1d1
I swear to god if this commit doesn't fix the linting and test errors
aabmets Mar 28, 2024
c816d8e
Added more ZoneInfo import ignore rules for MyPy
aabmets Mar 28, 2024
cbf6d41
Added pragma no cover to ZoneInfo import except clauses
aabmets Mar 28, 2024
db53939
Removed ZoneInfo import from table.py
aabmets Mar 29, 2024
c251fb1
Merge branch 'master' into pr/959
dantownsend Apr 5, 2024
64cb95e
add missing `continue`
dantownsend Apr 5, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 9 additions & 9 deletions piccolo/apps/migrations/auto/migration_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -737,9 +737,9 @@ async def _run_rename_columns(self, backwards: bool = False):
async def _run_add_tables(self, backwards: bool = False):
table_classes: t.List[t.Type[Table]] = []
for add_table in self.add_tables:
add_columns: t.List[
AddColumnClass
] = self.add_columns.for_table_class_name(add_table.class_name)
add_columns: t.List[AddColumnClass] = (
self.add_columns.for_table_class_name(add_table.class_name)
)
_Table: t.Type[Table] = create_table_class(
class_name=add_table.class_name,
class_kwargs={
Expand Down Expand Up @@ -792,9 +792,9 @@ async def _run_add_columns(self, backwards: bool = False):
if table_class_name in [i.class_name for i in self.add_tables]:
continue # No need to add columns to new tables

add_columns: t.List[
AddColumnClass
] = self.add_columns.for_table_class_name(table_class_name)
add_columns: t.List[AddColumnClass] = (
self.add_columns.for_table_class_name(table_class_name)
)

###############################################################
# Define the table, with the columns, so the metaclass
Expand Down Expand Up @@ -838,9 +838,9 @@ async def _run_add_columns(self, backwards: bool = False):
else:
primary_key = existing_table._meta.primary_key

table_class_members[
primary_key._meta.name
] = primary_key
table_class_members[primary_key._meta.name] = (
primary_key
)

break

Expand Down
41 changes: 36 additions & 5 deletions piccolo/apps/migrations/auto/serialisation.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,30 @@
from dataclasses import dataclass, field
from enum import Enum

from piccolo.columns import Column
from piccolo.columns import Column, Timestamptz
from piccolo.columns.defaults.base import Default
from piccolo.columns.defaults.timestamptz import (
TimestamptzCustom,
TimestamptzNow,
TimestamptzOffset,
)
from piccolo.columns.reference import LazyTableReference
from piccolo.table import Table
from piccolo.utils.repr import repr_class_instance

try:
from zoneinfo import ZoneInfo # type: ignore
except ImportError: # pragma: no cover
from backports.zoneinfo import ZoneInfo # type: ignore # noqa: F401

from .serialisation_legacy import deserialise_legacy_params

###############################################################################


class CanConflictWithGlobalNames(abc.ABC):
@abc.abstractmethod
def warn_if_is_conflicting_with_global_name(self):
...
def warn_if_is_conflicting_with_global_name(self): ...


class UniqueGlobalNamesMeta(type):
Expand Down Expand Up @@ -237,8 +246,7 @@ def warn_if_is_conflicting_with_global_name(self):

class Definition(CanConflictWithGlobalNames, abc.ABC):
@abc.abstractmethod
def __repr__(self):
...
def __repr__(self): ...

###########################################################################
# To allow sorting:
Expand Down Expand Up @@ -548,8 +556,31 @@ def serialise_params(params: t.Dict[str, t.Any]) -> SerialisedParams:
expect_conflict_with_global_name=UniqueGlobalNames.DEFAULT,
)
)
# ZoneInfo for Timestamptz* instances
in_group = (
Timestamptz,
TimestamptzNow,
TimestamptzCustom,
TimestamptzOffset,
)
if isinstance(value, in_group):
extra_imports.append(
Import(
module=ZoneInfo.__module__,
target=None,
)
)
continue

# ZoneInfo instances
if isinstance(value, ZoneInfo):
extra_imports.append(
Import(
module=value.__class__.__module__,
target=None,
)
)

# Dates and times
if isinstance(
value, (datetime.time, datetime.datetime, datetime.date)
Expand Down
6 changes: 3 additions & 3 deletions piccolo/apps/migrations/commands/backwards.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ def __init__(
super().__init__()

async def run_migrations_backwards(self, app_config: AppConfig):
migration_modules: t.Dict[
str, MigrationModule
] = self.get_migration_modules(app_config.migrations_folder_path)
migration_modules: t.Dict[str, MigrationModule] = (
self.get_migration_modules(app_config.migrations_folder_path)
)

ran_migration_ids = await Migration.get_migrations_which_ran(
app_name=self.app_name
Expand Down
6 changes: 3 additions & 3 deletions piccolo/apps/migrations/commands/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,9 @@ async def get_migration_managers(

migrations_folder = app_config.migrations_folder_path

migration_modules: t.Dict[
str, MigrationModule
] = self.get_migration_modules(migrations_folder)
migration_modules: t.Dict[str, MigrationModule] = (
self.get_migration_modules(migrations_folder)
)

migration_ids = sorted(migration_modules.keys())

Expand Down
6 changes: 3 additions & 3 deletions piccolo/apps/migrations/commands/forwards.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ async def run_migrations(self, app_config: AppConfig) -> MigrationResult:
app_name=app_config.app_name
)

migration_modules: t.Dict[
str, MigrationModule
] = self.get_migration_modules(app_config.migrations_folder_path)
migration_modules: t.Dict[str, MigrationModule] = (
self.get_migration_modules(app_config.migrations_folder_path)
)

ids = self.get_migration_ids(migration_modules)
n = len(ids)
Expand Down
1 change: 1 addition & 0 deletions piccolo/apps/playground/commands/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
Populates a database with an example schema and data, and launches a shell
for interacting with the data using Piccolo.
"""

import datetime
import sys
import typing as t
Expand Down
1 change: 1 addition & 0 deletions piccolo/apps/user/tables.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
A User model, used for authentication.
"""

from __future__ import annotations

import datetime
Expand Down
8 changes: 5 additions & 3 deletions piccolo/columns/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -887,9 +887,11 @@ def get_sql_value(self, value: t.Any) -> t.Any:
return (
"'{"
+ ", ".join(
f'"{i}"'
if isinstance(i, str)
else str(self.get_sql_value(i))
(
f'"{i}"'
if isinstance(i, str)
else str(self.get_sql_value(i))
)
for i in value
)
) + "}'"
Expand Down