4 Commits

Author SHA1 Message Date
9a3bd413d6 Version Bump v11.2.0 2023-08-08 13:07:00 +05:30
2fa346e084 Fix: Fingerprints should have the right constraint
Fix: Client list was not working
2023-08-08 13:06:42 +05:30
ecd3e45632 Version Bump v11.1.9 2023-08-07 12:48:02 +05:30
48ec2df10d Fix: Fingerprint was ignoring the time aspect which is obviously very important 2023-08-07 12:47:57 +05:30
9 changed files with 40 additions and 13 deletions

View File

@ -0,0 +1,24 @@
"""FP
Revision ID: 48af31eb6f3f
Revises: 12262aadbc08
Create Date: 2023-08-07 13:01:05.401492
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = '48af31eb6f3f'
down_revision = '12262aadbc08'
branch_labels = None
depends_on = None
def upgrade():
op.create_unique_constraint(op.f('uq_fingerprints_date'), 'fingerprints', ['date', 'employee_id'])
def downgrade():
op.drop_constraint(op.f('uq_fingerprints_date'), 'fingerprints', type_='unique')

View File

@ -1 +1 @@
__version__ = "11.1.8"
__version__ = "11.2.0"

View File

@ -3,7 +3,7 @@ import uuid
from datetime import datetime
from typing import TYPE_CHECKING
from sqlalchemy import DateTime, ForeignKey, Uuid
from sqlalchemy import DateTime, ForeignKey, UniqueConstraint, Uuid
from sqlalchemy.orm import Mapped, mapped_column, relationship
from ..db.base_class import reg
@ -16,6 +16,7 @@ if TYPE_CHECKING:
@reg.mapped_as_dataclass(unsafe_hash=True)
class Fingerprint:
__tablename__ = "fingerprints"
__table_args__ = (UniqueConstraint("date", "employee_id"),)
id: Mapped[uuid.UUID] = mapped_column(Uuid, primary_key=True, insert_default=uuid.uuid4)
employee_id: Mapped[uuid.UUID] = mapped_column(Uuid, ForeignKey("employees.id"), nullable=False)

View File

@ -44,11 +44,13 @@ class ClientList(Client):
@field_validator("last_date", mode="before")
@classmethod
def parse_last_date(cls, value: datetime | str) -> datetime | None:
def parse_last_date(cls, value: datetime | str | None) -> datetime | None:
if value is None or value == "":
return None
if isinstance(value, datetime):
return value
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("last_date")
def serialize_last_date(self, value: datetime, info: FieldSerializationInfo) -> str:
return value.strftime("%d-%b-%Y %H:%M")
def serialize_last_date(self, value: datetime | None, info: FieldSerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y %H:%M")

View File

@ -20,11 +20,11 @@ class Fingerprint(BaseModel):
@field_validator("date_", mode="before")
@classmethod
def parse_date(cls, value: date | str) -> date:
if isinstance(value, date):
def parse_date(cls, value: datetime | str) -> datetime:
if isinstance(value, datetime):
return value
return datetime.strptime(value, "%d-%b-%Y").date()
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("date_")
def serialize_date(self, value: date, info: FieldSerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
return value.strftime("%d-%b-%Y %H:%M")

View File

@ -1,6 +1,6 @@
[tool.poetry]
name = "brewman"
version = "11.1.8"
version = "11.2.0"
description = "Accounting plus inventory management for a restaurant."
authors = ["tanshu <git@tanshu.com>"]

View File

@ -1,6 +1,6 @@
{
"name": "overlord",
"version": "11.1.8",
"version": "11.2.0",
"scripts": {
"ng": "ng",
"start": "ng serve",

View File

@ -2,5 +2,5 @@ export const environment = {
production: true,
// eslint-disable-next-line @typescript-eslint/naming-convention
ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry
version: '11.1.8',
version: '11.2.0',
};

View File

@ -6,7 +6,7 @@ export const environment = {
production: false,
// eslint-disable-next-line @typescript-eslint/naming-convention
ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry
version: '11.1.8',
version: '11.2.0',
};
/*