Fix DateTimeField defaults for PostgreSQL compatibility

Paperdex and GauntletRun models used int timestamps as defaults which
worked in SQLite but fail in PostgreSQL. Changed to datetime.now.
This commit is contained in:
Cal Corum 2026-01-31 15:56:33 -06:00
parent ab1a25aabc
commit 8c039dedf8
2 changed files with 89 additions and 63 deletions

View File

@ -69,7 +69,15 @@ CARDSETS = {
}, },
"hall-of-fame": {"primary": [x for x in range(1, 30)], "human": ranked_cardsets}, "hall-of-fame": {"primary": [x for x in range(1, 30)], "human": ranked_cardsets},
"flashback": { "flashback": {
"primary": [13, 14, 5, 1, 3, 4, 8], # 2018 + Promos, 2019, 2021, 2022 + Promos, Mario "primary": [
13,
14,
5,
1,
3,
4,
8,
], # 2018 + Promos, 2019, 2021, 2022 + Promos, Mario
"secondary": [24], # 2025 "secondary": [24], # 2025
"human": [13, 14, 5, 1, 3, 4, 8], # 2018 + Promos, 2019, 2021, 2022 + Promos "human": [13, 14, 5, 1, 3, 4, 8], # 2018 + Promos, 2019, 2021, 2022 + Promos
}, },
@ -642,7 +650,7 @@ class Award(BaseModel):
class Paperdex(BaseModel): class Paperdex(BaseModel):
team = ForeignKeyField(Team) team = ForeignKeyField(Team)
player = ForeignKeyField(Player) player = ForeignKeyField(Player)
created = DateTimeField(default=int(datetime.timestamp(datetime.now()) * 1000)) created = DateTimeField(default=datetime.now)
class Meta: class Meta:
database = db database = db
@ -711,7 +719,7 @@ class GauntletRun(BaseModel):
wins = IntegerField(default=0) wins = IntegerField(default=0)
losses = IntegerField(default=0) losses = IntegerField(default=0)
gsheet = CharField(null=True) gsheet = CharField(null=True)
created = DateTimeField(default=int(datetime.timestamp(datetime.now()) * 1000)) created = DateTimeField(default=datetime.now)
ended = DateTimeField(null=True) # NULL means run not yet ended ended = DateTimeField(null=True) # NULL means run not yet ended
class Meta: class Meta:

View File

@ -10,20 +10,16 @@ from peewee import ModelSelect
from playhouse.shortcuts import model_to_dict from playhouse.shortcuts import model_to_dict
db = SqliteDatabase( db = SqliteDatabase(
'storage/pd_master.db', "storage/pd_master.db",
pragmas={ pragmas={"journal_mode": "wal", "cache_size": -1 * 64000, "synchronous": 0},
'journal_mode': 'wal',
'cache_size': -1 * 64000,
'synchronous': 0
}
) )
date = f'{datetime.now().year}-{datetime.now().month}-{datetime.now().day}' date = f"{datetime.now().year}-{datetime.now().month}-{datetime.now().day}"
log_level = logging.INFO if os.environ.get('LOG_LEVEL') == 'INFO' else 'WARN' log_level = logging.INFO if os.environ.get("LOG_LEVEL") == "INFO" else "WARN"
logging.basicConfig( logging.basicConfig(
filename=f'logs/database/{date}.log', filename=f"logs/database/{date}.log",
format='%(asctime)s - database - %(levelname)s - %(message)s', format="%(asctime)s - database - %(levelname)s - %(message)s",
level=log_level level=log_level,
) )
@ -39,7 +35,7 @@ def model_to_csv(this_obj, exclude=None) -> List:
def query_to_csv(all_items: ModelSelect, exclude=None): def query_to_csv(all_items: ModelSelect, exclude=None):
if all_items.count() == 0: if all_items.count() == 0:
data_list = [['No data found']] data_list = [["No data found"]]
else: else:
data_list = [model_csv_headers(all_items[0], exclude=exclude)] data_list = [model_csv_headers(all_items[0], exclude=exclude)]
for x in all_items: for x in all_items:
@ -50,29 +46,29 @@ def query_to_csv(all_items: ModelSelect, exclude=None):
def complex_data_to_csv(complex_data: List): def complex_data_to_csv(complex_data: List):
if len(complex_data) == 0: if len(complex_data) == 0:
data_list = [['No data found']] data_list = [["No data found"]]
else: else:
data_list = [[x for x in complex_data[0].keys()]] data_list = [[x for x in complex_data[0].keys()]]
for line in complex_data: for line in complex_data:
logging.debug(f'line: {line}') logging.debug(f"line: {line}")
this_row = [] this_row = []
for key in line: for key in line:
logging.debug(f'key: {key}') logging.debug(f"key: {key}")
if line[key] is None: if line[key] is None:
this_row.append('') this_row.append("")
elif isinstance(line[key], dict): elif isinstance(line[key], dict):
if 'name' in line[key]: if "name" in line[key]:
this_row.append(line[key]['name']) this_row.append(line[key]["name"])
elif 'abbrev' in line[key]: elif "abbrev" in line[key]:
this_row.append(line[key]['abbrev']) this_row.append(line[key]["abbrev"])
else: else:
this_row.append(line[key]['id']) this_row.append(line[key]["id"])
elif isinstance(line[key], int) and line[key] > 100000000: elif isinstance(line[key], int) and line[key] > 100000000:
this_row.append(f"'{line[key]}") this_row.append(f"'{line[key]}")
elif isinstance(line[key], str) and ',' in line[key]: elif isinstance(line[key], str) and "," in line[key]:
this_row.append(line[key].replace(",", "-_-")) this_row.append(line[key].replace(",", "-_-"))
else: else:
@ -186,7 +182,7 @@ class Player(BaseModel):
mlbplayer = ForeignKeyField(MlbPlayer, null=True) mlbplayer = ForeignKeyField(MlbPlayer, null=True)
def __str__(self): def __str__(self):
return f'{self.cardset} {self.p_name} ({self.rarity.name})' return f"{self.cardset} {self.p_name} ({self.rarity.name})"
# def __eq__(self, other): # def __eq__(self, other):
# if self.cardset.id == other.cardset.id and self.name == other.name: # if self.cardset.id == other.cardset.id and self.name == other.name:
@ -207,21 +203,21 @@ class Player(BaseModel):
def get_all_pos(self): def get_all_pos(self):
all_pos = [] all_pos = []
if self.pos_1 and self.pos_1 != 'CP': if self.pos_1 and self.pos_1 != "CP":
all_pos.append(self.pos_1) all_pos.append(self.pos_1)
if self.pos_2 and self.pos_2 != 'CP': if self.pos_2 and self.pos_2 != "CP":
all_pos.append(self.pos_2) all_pos.append(self.pos_2)
if self.pos_3 and self.pos_3 != 'CP': if self.pos_3 and self.pos_3 != "CP":
all_pos.append(self.pos_3) all_pos.append(self.pos_3)
if self.pos_4 and self.pos_4 != 'CP': if self.pos_4 and self.pos_4 != "CP":
all_pos.append(self.pos_4) all_pos.append(self.pos_4)
if self.pos_5 and self.pos_5 != 'CP': if self.pos_5 and self.pos_5 != "CP":
all_pos.append(self.pos_5) all_pos.append(self.pos_5)
if self.pos_6 and self.pos_6 != 'CP': if self.pos_6 and self.pos_6 != "CP":
all_pos.append(self.pos_6) all_pos.append(self.pos_6)
if self.pos_7 and self.pos_7 != 'CP': if self.pos_7 and self.pos_7 != "CP":
all_pos.append(self.pos_7) all_pos.append(self.pos_7)
if self.pos_8 and self.pos_8 != 'CP': if self.pos_8 and self.pos_8 != "CP":
all_pos.append(self.pos_8) all_pos.append(self.pos_8)
return all_pos return all_pos
@ -235,19 +231,19 @@ class Player(BaseModel):
# 'mvp': 2500, # 'mvp': 2500,
# 'hof': 999999999 # 'hof': 999999999
# } # }
logging.info(f'{self.p_name} cost changing from: {self.cost}') logging.info(f"{self.p_name} cost changing from: {self.cost}")
self.cost = max(math.floor(self.cost * .95), 1) self.cost = max(math.floor(self.cost * 0.95), 1)
# if self.quantity != 999: # if self.quantity != 999:
# self.quantity += 1 # self.quantity += 1
logging.info(f'{self.p_name} cost now: {self.cost}') logging.info(f"{self.p_name} cost now: {self.cost}")
self.save() self.save()
def change_on_buy(self): def change_on_buy(self):
logging.info(f'{self.p_name} cost changing from: {self.cost}') logging.info(f"{self.p_name} cost changing from: {self.cost}")
self.cost = math.ceil(self.cost * 1.1) self.cost = math.ceil(self.cost * 1.1)
# if self.quantity != 999: # if self.quantity != 999:
# self.quantity -= 1 # self.quantity -= 1
logging.info(f'{self.p_name} cost now: {self.cost}') logging.info(f"{self.p_name} cost now: {self.cost}")
self.save() self.save()
@ -274,7 +270,7 @@ class Team(BaseModel):
is_ai = IntegerField(null=True) is_ai = IntegerField(null=True)
def __str__(self): def __str__(self):
return f'S{self.season} {self.lname}' return f"S{self.season} {self.lname}"
@staticmethod @staticmethod
def get_by_owner(gmid, season=None): def get_by_owner(gmid, season=None):
@ -300,8 +296,8 @@ class Team(BaseModel):
return Team.get_or_none(Team.season == season, Team.abbrev == abbrev.upper()) return Team.get_or_none(Team.season == season, Team.abbrev == abbrev.upper())
def team_hash(self): def team_hash(self):
hash_string = f'{self.sname[-1]}{self.gmid / 6950123:.0f}{self.sname[-2]}{self.gmid / 42069123:.0f}' hash_string = f"{self.sname[-1]}{self.gmid / 6950123:.0f}{self.sname[-2]}{self.gmid / 42069123:.0f}"
logging.info(f'string: {hash_string}') logging.info(f"string: {hash_string}")
return hash_string return hash_string
@ -338,9 +334,9 @@ class Card(BaseModel):
def __str__(self): def __str__(self):
if self.player: if self.player:
return f'{self.player} - {self.team.sname}' return f"{self.player} - {self.team.sname}"
else: else:
return f'Blank - {self.team.sname}' return f"Blank - {self.team.sname}"
@staticmethod @staticmethod
def select_season(season): def select_season(season):
@ -382,7 +378,7 @@ class Roster(BaseModel):
card_26 = ForeignKeyField(Card) card_26 = ForeignKeyField(Card)
def __str__(self): def __str__(self):
return f'{self.team} Roster' return f"{self.team} Roster"
# def get_cards(self, team): # def get_cards(self, team):
# all_cards = Card.select().where(Card.roster == self) # all_cards = Card.select().where(Card.roster == self)
@ -499,7 +495,7 @@ class Award(BaseModel):
class Paperdex(BaseModel): class Paperdex(BaseModel):
team = ForeignKeyField(Team) team = ForeignKeyField(Team)
player = ForeignKeyField(Player) player = ForeignKeyField(Player)
created = DateTimeField(default=int(datetime.timestamp(datetime.now())*1000)) created = DateTimeField(default=datetime.now)
# def add_to_paperdex(self, team, cards: list): # def add_to_paperdex(self, team, cards: list):
# for x in players: # for x in players:
@ -548,14 +544,25 @@ class GauntletRun(BaseModel):
wins = IntegerField(default=0) wins = IntegerField(default=0)
losses = IntegerField(default=0) losses = IntegerField(default=0)
gsheet = CharField(null=True) gsheet = CharField(null=True)
created = DateTimeField(default=int(datetime.timestamp(datetime.now())*1000)) created = DateTimeField(default=datetime.now)
ended = DateTimeField(default=0) ended = DateTimeField(null=True)
db.create_tables([ db.create_tables(
Roster, BattingStat, PitchingStat, Result, Award, Paperdex, Reward, GameRewards, Notification, GauntletReward, [
GauntletRun Roster,
]) BattingStat,
PitchingStat,
Result,
Award,
Paperdex,
Reward,
GameRewards,
Notification,
GauntletReward,
GauntletRun,
]
)
class BattingCard(BaseModel): class BattingCard(BaseModel):
@ -569,16 +576,18 @@ class BattingCard(BaseModel):
hit_and_run = CharField() hit_and_run = CharField()
running = IntegerField() running = IntegerField()
offense_col = IntegerField() offense_col = IntegerField()
hand = CharField(default='R') hand = CharField(default="R")
bc_index = ModelIndex(BattingCard, (BattingCard.player, BattingCard.variant), unique=True) bc_index = ModelIndex(
BattingCard, (BattingCard.player, BattingCard.variant), unique=True
)
BattingCard.add_index(bc_index) BattingCard.add_index(bc_index)
class BattingCardRatings(BaseModel): class BattingCardRatings(BaseModel):
battingcard = ForeignKeyField(BattingCard) battingcard = ForeignKeyField(BattingCard)
vs_hand = CharField(default='R') vs_hand = CharField(default="R")
pull_rate = FloatField() pull_rate = FloatField()
center_rate = FloatField() center_rate = FloatField()
slap_rate = FloatField() slap_rate = FloatField()
@ -610,7 +619,9 @@ class BattingCardRatings(BaseModel):
bcr_index = ModelIndex( bcr_index = ModelIndex(
BattingCardRatings, (BattingCardRatings.battingcard, BattingCardRatings.vs_hand), unique=True BattingCardRatings,
(BattingCardRatings.battingcard, BattingCardRatings.vs_hand),
unique=True,
) )
BattingCardRatings.add_index(bcr_index) BattingCardRatings.add_index(bcr_index)
@ -626,16 +637,18 @@ class PitchingCard(BaseModel):
closer_rating = IntegerField(null=True) closer_rating = IntegerField(null=True)
batting = CharField(null=True) batting = CharField(null=True)
offense_col = IntegerField() offense_col = IntegerField()
hand = CharField(default='R') hand = CharField(default="R")
pc_index = ModelIndex(PitchingCard, (PitchingCard.player, PitchingCard.variant), unique=True) pc_index = ModelIndex(
PitchingCard, (PitchingCard.player, PitchingCard.variant), unique=True
)
PitchingCard.add_index(pc_index) PitchingCard.add_index(pc_index)
class PitchingCardRatings(BaseModel): class PitchingCardRatings(BaseModel):
pitchingcard = ForeignKeyField(PitchingCard) pitchingcard = ForeignKeyField(PitchingCard)
vs_hand = CharField(default='R') vs_hand = CharField(default="R")
homerun = FloatField() homerun = FloatField()
bp_homerun = FloatField() bp_homerun = FloatField()
triple = FloatField() triple = FloatField()
@ -669,7 +682,9 @@ class PitchingCardRatings(BaseModel):
pcr_index = ModelIndex( pcr_index = ModelIndex(
PitchingCardRatings, (PitchingCardRatings.pitchingcard, PitchingCardRatings.vs_hand), unique=True PitchingCardRatings,
(PitchingCardRatings.pitchingcard, PitchingCardRatings.vs_hand),
unique=True,
) )
PitchingCardRatings.add_index(pcr_index) PitchingCardRatings.add_index(pcr_index)
@ -687,12 +702,16 @@ class CardPosition(BaseModel):
pos_index = ModelIndex( pos_index = ModelIndex(
CardPosition, (CardPosition.player, CardPosition.variant, CardPosition.position), unique=True CardPosition,
(CardPosition.player, CardPosition.variant, CardPosition.position),
unique=True,
) )
CardPosition.add_index(pos_index) CardPosition.add_index(pos_index)
db.create_tables([BattingCard, BattingCardRatings, PitchingCard, PitchingCardRatings, CardPosition]) db.create_tables(
[BattingCard, BattingCardRatings, PitchingCard, PitchingCardRatings, CardPosition]
)
db.close() db.close()
@ -870,4 +889,3 @@ db.close()
# #
# #
# scout_db.close() # scout_db.close()