Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
f5557a1d99
|
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,9 +1,8 @@
|
|||||||
result
|
result
|
||||||
result-*
|
result-*
|
||||||
**/__pycache__
|
|
||||||
dibbler.egg-info
|
|
||||||
dist
|
dist
|
||||||
|
|
||||||
test.db
|
test.db
|
||||||
|
|
||||||
.ruff_cache
|
.ruff_cache
|
@@ -76,8 +76,12 @@ class Database:
|
|||||||
personDatoVerdi = defaultdict(list) # dict->array
|
personDatoVerdi = defaultdict(list) # dict->array
|
||||||
personUkedagVerdi = defaultdict(list)
|
personUkedagVerdi = defaultdict(list)
|
||||||
# for global
|
# for global
|
||||||
personPosTransactions = {} # personPosTransactions[trygvrad] == 100 #trygvrad har lagt 100kr i boksen
|
personPosTransactions = (
|
||||||
personNegTransactions = {} # personNegTransactions[trygvrad» == 70 #trygvrad har tatt 70kr fra boksen
|
{}
|
||||||
|
) # personPosTransactions[trygvrad] == 100 #trygvrad har lagt 100kr i boksen
|
||||||
|
personNegTransactions = (
|
||||||
|
{}
|
||||||
|
) # personNegTransactions[trygvrad» == 70 #trygvrad har tatt 70kr fra boksen
|
||||||
globalVareAntall = {} # globalVareAntall[Oreo] == 3
|
globalVareAntall = {} # globalVareAntall[Oreo] == 3
|
||||||
globalVareVerdi = {} # globalVareVerdi[Oreo] == 30 #[kr]
|
globalVareVerdi = {} # globalVareVerdi[Oreo] == 30 #[kr]
|
||||||
globalPersonAntall = {} # globalPersonAntall[trygvrad] == 3
|
globalPersonAntall = {} # globalPersonAntall[trygvrad] == 3
|
||||||
|
@@ -20,7 +20,6 @@ subparsers = parser.add_subparsers(
|
|||||||
subparsers.add_parser("loop", help="Run the dibbler loop")
|
subparsers.add_parser("loop", help="Run the dibbler loop")
|
||||||
subparsers.add_parser("create-db", help="Create the database")
|
subparsers.add_parser("create-db", help="Create the database")
|
||||||
subparsers.add_parser("slabbedasker", help="Find out who is slabbedasker")
|
subparsers.add_parser("slabbedasker", help="Find out who is slabbedasker")
|
||||||
subparsers.add_parser("seed-data", help="Fill with mock data")
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
@@ -42,11 +41,6 @@ def main():
|
|||||||
|
|
||||||
slabbedasker.main()
|
slabbedasker.main()
|
||||||
|
|
||||||
elif args.subcommand == "seed-data":
|
|
||||||
import dibbler.subcommands.seed_test_data as seed_test_data
|
|
||||||
|
|
||||||
seed_test_data.main()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
@@ -180,7 +180,7 @@ When finished, write an empty line to confirm the purchase.\n"""
|
|||||||
print(f"User {t.user.name}'s credit is now {t.user.credit:d} kr")
|
print(f"User {t.user.name}'s credit is now {t.user.credit:d} kr")
|
||||||
if t.user.credit < config.getint("limits", "low_credit_warning_limit"):
|
if t.user.credit < config.getint("limits", "low_credit_warning_limit"):
|
||||||
print(
|
print(
|
||||||
f"USER {t.user.name} HAS LOWER CREDIT THAN {config.getint('limits', 'low_credit_warning_limit'):d},",
|
f'USER {t.user.name} HAS LOWER CREDIT THAN {config.getint("limits", "low_credit_warning_limit"):d},',
|
||||||
"AND SHOULD CONSIDER PUTTING SOME MONEY IN THE BOX.",
|
"AND SHOULD CONSIDER PUTTING SOME MONEY IN THE BOX.",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
__all__ = [
|
__all__ = [
|
||||||
"Base",
|
'Base',
|
||||||
"Product",
|
'Product',
|
||||||
"Purchase",
|
'Purchase',
|
||||||
"PurchaseEntry",
|
'PurchaseEntry',
|
||||||
"Transaction",
|
'Transaction',
|
||||||
"User",
|
'User',
|
||||||
"UserProducts",
|
'UserProducts',
|
||||||
]
|
]
|
||||||
|
|
||||||
from .Base import Base
|
from .Base import Base
|
||||||
|
@@ -1,48 +0,0 @@
|
|||||||
import json
|
|
||||||
from dibbler.db import Session
|
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from dibbler.models.Product import Product
|
|
||||||
|
|
||||||
from dibbler.models.User import User
|
|
||||||
|
|
||||||
JSON_FILE = Path(__file__).parent.parent.parent / "mock_data.json"
|
|
||||||
|
|
||||||
|
|
||||||
def clear_db(session):
|
|
||||||
session.query(Product).delete()
|
|
||||||
session.query(User).delete()
|
|
||||||
session.commit()
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
session = Session()
|
|
||||||
clear_db(session)
|
|
||||||
product_items = []
|
|
||||||
user_items = []
|
|
||||||
|
|
||||||
with open(JSON_FILE) as f:
|
|
||||||
json_obj = json.load(f)
|
|
||||||
|
|
||||||
for product in json_obj["products"]:
|
|
||||||
product_item = Product(
|
|
||||||
bar_code=product["bar_code"],
|
|
||||||
name=product["name"],
|
|
||||||
price=product["price"],
|
|
||||||
stock=product["stock"],
|
|
||||||
)
|
|
||||||
product_items.append(product_item)
|
|
||||||
|
|
||||||
for user in json_obj["users"]:
|
|
||||||
user_item = User(
|
|
||||||
name=user["name"],
|
|
||||||
card=user["card"],
|
|
||||||
rfid=user["rfid"],
|
|
||||||
credit=user["credit"],
|
|
||||||
)
|
|
||||||
user_items.append(user_item)
|
|
||||||
|
|
||||||
session.add_all(product_items)
|
|
||||||
session.add_all(user_items)
|
|
||||||
session.commit()
|
|
@@ -5,8 +5,8 @@ show_tracebacks = true
|
|||||||
input_encoding = 'utf8'
|
input_encoding = 'utf8'
|
||||||
|
|
||||||
[database]
|
[database]
|
||||||
# url = "postgresql://robertem@127.0.0.1/pvvvv"
|
; url = postgresql://robertem@127.0.0.1/pvvvv
|
||||||
url = "sqlite:///test.db"
|
url = sqlite:///test.db
|
||||||
|
|
||||||
[limits]
|
[limits]
|
||||||
low_credit_warning_limit = -100
|
low_credit_warning_limit = -100
|
||||||
|
6
flake.lock
generated
6
flake.lock
generated
@@ -19,11 +19,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1749143949,
|
"lastModified": 1742288794,
|
||||||
"narHash": "sha256-QuUtALJpVrPnPeozlUG/y+oIMSLdptHxb3GK6cpSVhA=",
|
"narHash": "sha256-Txwa5uO+qpQXrNG4eumPSD+hHzzYi/CdaM80M9XRLCo=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "d3d2d80a2191a73d1e86456a751b83aa13085d7d",
|
"rev": "b6eaf97c6960d97350c584de1b6dcff03c9daf42",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@@ -5,14 +5,14 @@
|
|||||||
|
|
||||||
outputs = { self, nixpkgs, flake-utils }: let
|
outputs = { self, nixpkgs, flake-utils }: let
|
||||||
inherit (nixpkgs) lib;
|
inherit (nixpkgs) lib;
|
||||||
|
|
||||||
systems = [
|
systems = [
|
||||||
"x86_64-linux"
|
"x86_64-linux"
|
||||||
"aarch64-linux"
|
"aarch64-linux"
|
||||||
"x86_64-darwin"
|
"x86_64-darwin"
|
||||||
"aarch64-darwin"
|
"aarch64-darwin"
|
||||||
];
|
];
|
||||||
|
|
||||||
forAllSystems = f: lib.genAttrs systems (system: let
|
forAllSystems = f: lib.genAttrs systems (system: let
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
in f system pkgs);
|
in f system pkgs);
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
python = pkgs.python312;
|
python = pkgs.python312;
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
# Note: using the module requires that you have applied the overlay first
|
# Note: using the module requires that you have applied the overlay first
|
||||||
nixosModules.default = import ./nix/module.nix;
|
nixosModules.default = import ./nix/module.nix;
|
||||||
|
|
||||||
|
@@ -1,76 +0,0 @@
|
|||||||
{
|
|
||||||
"products": [
|
|
||||||
{
|
|
||||||
"product_id": 1,
|
|
||||||
"bar_code": "1234567890123",
|
|
||||||
"name": "Wireless Mouse",
|
|
||||||
"price": 2999,
|
|
||||||
"stock": 150,
|
|
||||||
"hidden": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"product_id": 2,
|
|
||||||
"bar_code": "9876543210987",
|
|
||||||
"name": "Mechanical Keyboard",
|
|
||||||
"price": 5999,
|
|
||||||
"stock": 75,
|
|
||||||
"hidden": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"product_id": 3,
|
|
||||||
"bar_code": "1112223334445",
|
|
||||||
"name": "Gaming Monitor",
|
|
||||||
"price": 19999,
|
|
||||||
"stock": 20,
|
|
||||||
"hidden": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"product_id": 4,
|
|
||||||
"bar_code": "5556667778889",
|
|
||||||
"name": "USB-C Docking Station",
|
|
||||||
"price": 8999,
|
|
||||||
"stock": 50,
|
|
||||||
"hidden": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"product_id": 5,
|
|
||||||
"bar_code": "4445556667771",
|
|
||||||
"name": "Noise Cancelling Headphones",
|
|
||||||
"price": 12999,
|
|
||||||
"stock": 30,
|
|
||||||
"hidden": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"users": [
|
|
||||||
{
|
|
||||||
"name": "Albert",
|
|
||||||
"credit": 42069,
|
|
||||||
"card": "NTU12345678",
|
|
||||||
"rfid": "a1b2c3d4e5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "lorem",
|
|
||||||
"credit": 2000,
|
|
||||||
"card": "9876543210",
|
|
||||||
"rfid": "f6e7d8c9b0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ibsum",
|
|
||||||
"credit": 1000,
|
|
||||||
"card": "11122233",
|
|
||||||
"rfid": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "dave",
|
|
||||||
"credit": 7500,
|
|
||||||
"card": "NTU56789012",
|
|
||||||
"rfid": "1234abcd5678"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "eve",
|
|
||||||
"credit": 3000,
|
|
||||||
"card": null,
|
|
||||||
"rfid": "deadbeef1234"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@@ -1,31 +1,21 @@
|
|||||||
{ config, pkgs, lib, ... }: let
|
{ config, pkgs, lib, ... }: let
|
||||||
cfg = config.services.dibbler;
|
cfg = config.services.dibbler;
|
||||||
|
|
||||||
format = pkgs.formats.ini { };
|
|
||||||
in {
|
in {
|
||||||
options.services.dibbler = {
|
options.services.dibbler = {
|
||||||
enable = lib.mkEnableOption "dibbler, the little kiosk computer";
|
enable = lib.mkEnableOption "dibbler, the little kiosk computer";
|
||||||
|
|
||||||
package = lib.mkPackageOption pkgs "dibbler" { };
|
package = lib.mkPackageOption pkgs "dibbler" { };
|
||||||
|
|
||||||
settings = lib.mkOption {
|
config = lib.mkOption {
|
||||||
description = "Configuration for dibbler";
|
type = lib.types.path;
|
||||||
default = { };
|
description = "Path to the configuration file.";
|
||||||
type = lib.types.submodule {
|
default = ../example-config.ini;
|
||||||
freeformType = format.type;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = let
|
config = let
|
||||||
screen = "${pkgs.screen}/bin/screen";
|
screen = "${pkgs.screen}/bin/screen";
|
||||||
in lib.mkIf cfg.enable {
|
in lib.mkIf cfg.enable {
|
||||||
services.dibbler.settings = lib.pipe ../example-config.ini [
|
|
||||||
builtins.readFile
|
|
||||||
builtins.fromTOML
|
|
||||||
(lib.mapAttrsRecursive (_: lib.mkDefault))
|
|
||||||
];
|
|
||||||
|
|
||||||
boot = {
|
boot = {
|
||||||
consoleLogLevel = 0;
|
consoleLogLevel = 0;
|
||||||
enableContainers = false;
|
enableContainers = false;
|
||||||
@@ -38,7 +28,7 @@ in {
|
|||||||
group = "dibbler";
|
group = "dibbler";
|
||||||
extraGroups = [ "lp" ];
|
extraGroups = [ "lp" ];
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
shell = (pkgs.writeShellScriptBin "login-shell" "${screen} -x dibbler") // {shellPath = "/bin/login-shell";};
|
shell = ((pkgs.writeShellScriptBin "login-shell" "${screen} -x dibbler") // {shellPath = "/bin/login-shell";});
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -47,9 +37,7 @@ in {
|
|||||||
wantedBy = [ "default.target" ];
|
wantedBy = [ "default.target" ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStartPre = "-${screen} -X -S dibbler kill";
|
ExecStartPre = "-${screen} -X -S dibbler kill";
|
||||||
ExecStart = let
|
ExecStart = "${screen} -dmS dibbler -O -l ${cfg.package}/bin/dibbler --config ${cfg.config} loop";
|
||||||
config = format.generate "dibbler-config.ini" cfg.settings;
|
|
||||||
in "${screen} -dmS dibbler -O -l ${cfg.package}/bin/dibbler --config ${config} loop";
|
|
||||||
ExecStartPost = "${screen} -X -S dibbler width 42 80";
|
ExecStartPost = "${screen} -X -S dibbler width 42 80";
|
||||||
User = "dibbler";
|
User = "dibbler";
|
||||||
Group = "dibbler";
|
Group = "dibbler";
|
||||||
@@ -72,6 +60,30 @@ in {
|
|||||||
serviceConfig.Restart = "always"; # restart when session is closed
|
serviceConfig.Restart = "always"; # restart when session is closed
|
||||||
};
|
};
|
||||||
|
|
||||||
services.getty.autologinUser = lib.mkForce "dibbler";
|
services = {
|
||||||
|
openssh = {
|
||||||
|
enable = true;
|
||||||
|
permitRootLogin = "yes";
|
||||||
|
};
|
||||||
|
|
||||||
|
getty.autologinUser = lib.mkForce "dibbler";
|
||||||
|
udisks2.enable = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.logRefusedConnections = false;
|
||||||
|
console.keyMap = "no";
|
||||||
|
programs.command-not-found.enable = false;
|
||||||
|
i18n.supportedLocales = [ "en_US.UTF-8/UTF-8" ];
|
||||||
|
# environment.noXlibs = true;
|
||||||
|
|
||||||
|
documentation = {
|
||||||
|
info.enable = false;
|
||||||
|
man.enable = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
security = {
|
||||||
|
polkit.enable = lib.mkForce false;
|
||||||
|
audit.enable = false;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -2,13 +2,11 @@
|
|||||||
mkShell,
|
mkShell,
|
||||||
python,
|
python,
|
||||||
ruff,
|
ruff,
|
||||||
uv,
|
|
||||||
}:
|
}:
|
||||||
|
|
||||||
mkShell {
|
mkShell {
|
||||||
packages = [
|
packages = [
|
||||||
ruff
|
ruff
|
||||||
uv
|
|
||||||
(python.withPackages (ps: with ps; [
|
(python.withPackages (ps: with ps; [
|
||||||
brother-ql
|
brother-ql
|
||||||
matplotlib
|
matplotlib
|
||||||
|
Reference in New Issue
Block a user