pytable/pytable/fields.py
2024-09-02 20:45:46 +02:00

70 lines
2.2 KiB
Python

import peewee as pw
import datetime
import itertools
class DarktableTimestampField(pw.TimestampField):
"""
Darktable not always stores timestamps as UNIX timestamps with origin of
1970-01-01, but sometimes 0001-01-01. This timestamp field lets the user
specifiy what origin to use for the timestamp.
"""
def __init__(self, *args, origin=datetime.datetime(1970, 1, 1), **kwargs) -> None:
kwargs['resolution'] = 10**6
self.epoch_diff = (datetime.datetime(1970, 1, 1) - origin).total_seconds()
super().__init__(*args, **kwargs)
def python_value(self, value):
if value is None or value == -1:
return None
return super().python_value(value - self.epoch_diff * self.resolution)
def db_value(self, value):
if value is None or value == -1:
return -1
if isinstance(value, datetime.datetime):
pass
elif isinstance(value, datetime.date):
value = datetime.datetime(value.year, value.month, value.day)
else:
raise ValueError()
return super().db_value(value) + self.epoch_diff * self.resolution
class ModuleOrderListField(pw.CharField):
def db_value(self, value):
print("db_value")
value = super().db_value(value)
if hasattr(value, "__item__"):
new_value = ",".join([str(v) for v in itertools.chain(*value)])
print(value, new_value)
return new_value
print(value)
return value
def python_value(self, value):
value = super().python_value(value)
if isinstance(value, str):
values = value.split(",")
assert len(values) % 2 == 0
new_value = [
(values[i * 2], int(values[i * 2 + 1]))
for i in range(int(len(values) / 2))]
return new_value
return value
class EnumField(pw.IntegerField):
def __init__(self, enum_type, *args, **kwargs):
super().__init__(*args, **kwargs)
self.enum_type = enum_type
def db_value(self, value):
return value.value
def python_value(self, value):
return self.enum_type(super().python_value(value))