Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e69d04dcd0 | |||
| b2a6384f31 | |||
| 4f89765070 | |||
| 914e5b4e50 | |||
|
de20bad7dd
|
|||
|
4bab5e7e21
|
|||
|
b85a6535fe
|
|||
|
22a09b4177
|
|||
|
c39b15d1a8
|
|||
|
122ac2ab18
|
|||
|
28228beccd
|
|||
| 8a6a0c12ba |
+3
-2
@@ -1,8 +1,9 @@
|
|||||||
result
|
result
|
||||||
result-*
|
result-*
|
||||||
|
**/__pycache__
|
||||||
|
dibbler.egg-info
|
||||||
dist
|
dist
|
||||||
|
|
||||||
test.db
|
test.db
|
||||||
|
|
||||||
.ruff_cache
|
.ruff_cache
|
||||||
|
|||||||
@@ -2,13 +2,31 @@
|
|||||||
|
|
||||||
EDB-system for PVVVV
|
EDB-system for PVVVV
|
||||||
|
|
||||||
|
## Hva er dette?
|
||||||
|
|
||||||
|
Dibbler er et system laget av PVVere for PVVere for å byttelåne både matvarer og godis.
|
||||||
|
Det er designet for en gammeldags VT terminal, og er laget for å være enkelt både å bruke og å hacke på.
|
||||||
|
|
||||||
|
Programmet er skrevet i Python, og bruker en sql database for å lagre data.
|
||||||
|
|
||||||
|
Samlespleiseboden er satt opp slik at folk kjøper inn varer, og får dibblerkreditt, og så kan man bruke
|
||||||
|
denne kreditten til å kjøpe ut andre varer. Det er ikke noen form for authentisering, så hele systemet er basert på tillit.
|
||||||
|
Det er anbefalt å koble en barkodeleser til systemet for å gjøre det enklere å både legge til og kjøpe varer.
|
||||||
|
|
||||||
|
## Kom i gang
|
||||||
|
|
||||||
|
Installer python, og lag og aktiver et venv. Installer så avhengighetene med `pip install`.
|
||||||
|
|
||||||
|
Deretter kan du kjøre programmet med
|
||||||
|
|
||||||
|
```console
|
||||||
|
python -m dibbler -c example-config.ini create-db
|
||||||
|
python -m dibbler -c example-config.ini loop
|
||||||
|
```
|
||||||
|
|
||||||
## Nix
|
## Nix
|
||||||
### Hvordan kjøre
|
|
||||||
|
|
||||||
`nix run github:Prograrmvarverkstedet/dibbler`
|
### Bygge nytt image
|
||||||
|
|
||||||
|
|
||||||
### Bygge nytt image
|
|
||||||
|
|
||||||
For å bygge et image trenger du en builder som takler å bygge for arkitekturen du skal lage et image for.
|
For å bygge et image trenger du en builder som takler å bygge for arkitekturen du skal lage et image for.
|
||||||
|
|
||||||
@@ -16,16 +34,16 @@ For å bygge et image trenger du en builder som takler å bygge for arkitekturen
|
|||||||
|
|
||||||
Flaket exposer en modul som autologger inn med en bruker som automatisk kjører dibbler, og setter opp et minimalistisk miljø.
|
Flaket exposer en modul som autologger inn med en bruker som automatisk kjører dibbler, og setter opp et minimalistisk miljø.
|
||||||
|
|
||||||
Før du bygger imaget burde du endre conf.py lokalt til å inneholde instillingene dine. **NB: Denne kommer til å ligge i nix storen.**
|
Før du bygger imaget burde du kopiere og endre `example-config.ini` lokalt til å inneholde instillingene dine. **NB: Denne kommer til å ligge i nix storen, ikke si noe her som du ikke vil at moren din skal høre.**
|
||||||
|
|
||||||
Du kan også endre hvilken conf.py som blir brukt direkte i pakken eller i modulen.
|
Du kan også endre hvilken config-fil som blir brukt direkte i pakken eller i modulen.
|
||||||
|
|
||||||
Se eksempelet for hvordan skrot er satt opp i flake.nix
|
Se eksempelet for hvordan skrot er satt opp i `flake.nix` og `nix/skrott.nix`
|
||||||
|
|
||||||
### Bygge image for skrot
|
### Bygge image for skrot
|
||||||
Skrot har et image definert i flake.nix:
|
Skrot har et image definert i flake.nix:
|
||||||
|
|
||||||
1. endre conf.py
|
1. endre `example-config.ini`
|
||||||
2. `nix build .#images.skrot`
|
2. `nix build .#images.skrot`
|
||||||
3. ???
|
3. ???
|
||||||
4. non-profit
|
4. non-profit
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
db_url = "postgresql://robertem@127.0.0.1/pvvvv"
|
|
||||||
quit_allowed = True
|
|
||||||
stop_allowed = False
|
|
||||||
show_tracebacks = True
|
|
||||||
input_encoding = "utf8"
|
|
||||||
|
|
||||||
low_credit_warning_limit = -100
|
|
||||||
user_recent_transaction_limit = 100
|
|
||||||
|
|
||||||
# See https://pypi.org/project/brother_ql/ for label types
|
|
||||||
# Set rotate to False for endless labels
|
|
||||||
label_type = "62"
|
|
||||||
label_rotate = False
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{ pkgs ? import <nixos-unstable> { } }:
|
|
||||||
{
|
|
||||||
dibbler = pkgs.callPackage ./nix/dibbler.nix { };
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,7 @@ import os
|
|||||||
|
|
||||||
from PIL import ImageFont
|
from PIL import ImageFont
|
||||||
from barcode.writer import ImageWriter, mm2px
|
from barcode.writer import ImageWriter, mm2px
|
||||||
from brother_ql.devicedependent import label_type_specs
|
from brother_ql.labels import ALL_LABELS
|
||||||
|
|
||||||
|
|
||||||
def px2mm(px, dpi=300):
|
def px2mm(px, dpi=300):
|
||||||
@@ -12,14 +12,15 @@ def px2mm(px, dpi=300):
|
|||||||
class BrotherLabelWriter(ImageWriter):
|
class BrotherLabelWriter(ImageWriter):
|
||||||
def __init__(self, typ="62", max_height=350, rot=False, text=None):
|
def __init__(self, typ="62", max_height=350, rot=False, text=None):
|
||||||
super(BrotherLabelWriter, self).__init__()
|
super(BrotherLabelWriter, self).__init__()
|
||||||
assert typ in label_type_specs
|
label = next([l for l in ALL_LABELS if l.identifier == typ])
|
||||||
|
assert label is not None
|
||||||
self.rot = rot
|
self.rot = rot
|
||||||
if self.rot:
|
if self.rot:
|
||||||
self._h, self._w = label_type_specs[typ]["dots_printable"]
|
self._h, self._w = label.dots_printable
|
||||||
if self._w == 0 or self._w > max_height:
|
if self._w == 0 or self._w > max_height:
|
||||||
self._w = min(max_height, self._h / 2)
|
self._w = min(max_height, self._h / 2)
|
||||||
else:
|
else:
|
||||||
self._w, self._h = label_type_specs[typ]["dots_printable"]
|
self._w, self._h = label.dots_printable
|
||||||
if self._h == 0 or self._h > max_height:
|
if self._h == 0 or self._h > max_height:
|
||||||
self._h = min(max_height, self._w / 2)
|
self._h = min(max_height, self._w / 2)
|
||||||
self._xo = 0.0
|
self._xo = 0.0
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ import os
|
|||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
import barcode
|
import barcode
|
||||||
from brother_ql import BrotherQLRaster, create_label
|
from brother_ql.brother_ql_create import create_label
|
||||||
|
from brother_ql.raster import BrotherQLRaster
|
||||||
from brother_ql.backends import backend_factory
|
from brother_ql.backends import backend_factory
|
||||||
from brother_ql.devicedependent import label_type_specs
|
from brother_ql.labels import ALL_LABELS
|
||||||
from PIL import Image, ImageDraw, ImageFont
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
|
||||||
from .barcode_helpers import BrotherLabelWriter
|
from .barcode_helpers import BrotherLabelWriter
|
||||||
@@ -17,10 +18,11 @@ def print_name_label(
|
|||||||
label_type="62",
|
label_type="62",
|
||||||
printer_type="QL-700",
|
printer_type="QL-700",
|
||||||
):
|
):
|
||||||
|
label = next([l for l in ALL_LABELS if l.identifier == label_type])
|
||||||
if not rotate:
|
if not rotate:
|
||||||
width, height = label_type_specs[label_type]["dots_printable"]
|
width, height = label.dots_printable
|
||||||
else:
|
else:
|
||||||
height, width = label_type_specs[label_type]["dots_printable"]
|
height, width = label.dots_printable
|
||||||
|
|
||||||
font_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "ChopinScript.ttf")
|
font_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "ChopinScript.ttf")
|
||||||
fs = 2000
|
fs = 2000
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ 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():
|
||||||
@@ -40,6 +41,12 @@ def main():
|
|||||||
import dibbler.subcommands.slabbedasker as slabbedasker
|
import dibbler.subcommands.slabbedasker as slabbedasker
|
||||||
|
|
||||||
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__":
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
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()
|
||||||
Generated
+12
-11
@@ -5,31 +5,32 @@
|
|||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1692799911,
|
"lastModified": 1731533236,
|
||||||
"narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=",
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44",
|
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "numtide",
|
"id": "flake-utils",
|
||||||
"repo": "flake-utils",
|
"type": "indirect"
|
||||||
"type": "github"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1693145325,
|
"lastModified": 1742288794,
|
||||||
"narHash": "sha256-Gat9xskErH1zOcLjYMhSDBo0JTBZKfGS0xJlIRnj6Rc=",
|
"narHash": "sha256-Txwa5uO+qpQXrNG4eumPSD+hHzzYi/CdaM80M9XRLCo=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "cddebdb60de376c1bdb7a4e6ee3d98355453fe56",
|
"rev": "b6eaf97c6960d97350c584de1b6dcff03c9daf42",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"id": "nixpkgs",
|
"owner": "NixOS",
|
||||||
"type": "indirect"
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
|
|||||||
@@ -1,77 +1,65 @@
|
|||||||
{
|
{
|
||||||
description = "Dibbler samspleisebod";
|
description = "Dibbler samspleisebod";
|
||||||
|
|
||||||
inputs.flake-utils.url = "github:numtide/flake-utils";
|
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
|
||||||
outputs = { self, nixpkgs, flake-utils }:
|
outputs = { self, nixpkgs, flake-utils }: let
|
||||||
flake-utils.lib.eachDefaultSystem (system: let
|
inherit (nixpkgs) lib;
|
||||||
|
|
||||||
|
systems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
"x86_64-darwin"
|
||||||
|
"aarch64-darwin"
|
||||||
|
];
|
||||||
|
|
||||||
|
forAllSystems = f: lib.genAttrs systems (system: let
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
in {
|
in f system pkgs);
|
||||||
packages = {
|
in {
|
||||||
|
packages = forAllSystems (system: pkgs: {
|
||||||
default = self.packages.${system}.dibbler;
|
default = self.packages.${system}.dibbler;
|
||||||
dibbler = pkgs.callPackage ./nix/dibbler.nix {
|
dibbler = pkgs.callPackage ./nix/dibbler.nix {
|
||||||
python3Packages = pkgs.python311Packages;
|
python3Packages = pkgs.python312Packages;
|
||||||
};
|
};
|
||||||
};
|
skrot = self.nixosConfigurations.skrot.config.system.build.sdImage;
|
||||||
|
});
|
||||||
|
|
||||||
apps = {
|
apps = forAllSystems (system: pkgs: {
|
||||||
default = self.apps.${system}.dibbler;
|
default = self.apps.${system}.dibbler;
|
||||||
dibbler = flake-utils.lib.mkApp {
|
dibbler = flake-utils.lib.mkApp {
|
||||||
drv = self.packages.${system}.dibbler;
|
drv = self.packages.${system}.dibbler;
|
||||||
};
|
};
|
||||||
};
|
});
|
||||||
|
|
||||||
devShells = {
|
overlays = {
|
||||||
default = self.devShells.${system}.dibbler;
|
default = self.overlays.dibbler;
|
||||||
dibbler = pkgs.mkShell {
|
dibbler = final: prev: {
|
||||||
packages = with pkgs; [
|
inherit (self.packages.${prev.system}) dibbler;
|
||||||
python311Packages.black
|
|
||||||
ruff
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
})
|
|
||||||
|
|
||||||
//
|
devShells = forAllSystems (system: pkgs: {
|
||||||
|
default = self.devShells.${system}.dibbler;
|
||||||
{
|
dibbler = pkgs.callPackage ./nix/shell.nix {
|
||||||
# Note: using the module requires that you have applied the
|
python = pkgs.python312;
|
||||||
# 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;
|
||||||
|
|
||||||
images.skrot = self.nixosConfigurations.skrot.config.system.build.sdImage;
|
nixosConfigurations.skrot = nixpkgs.lib.nixosSystem (rec {
|
||||||
|
|
||||||
nixosConfigurations.skrot = nixpkgs.lib.nixosSystem {
|
|
||||||
system = "aarch64-linux";
|
system = "aarch64-linux";
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = [ self.overlays.dibbler ];
|
||||||
|
};
|
||||||
modules = [
|
modules = [
|
||||||
(nixpkgs + "/nixos/modules/installer/sd-card/sd-image-aarch64.nix")
|
(nixpkgs + "/nixos/modules/installer/sd-card/sd-image-aarch64.nix")
|
||||||
self.nixosModules.default
|
self.nixosModules.default
|
||||||
({...}: {
|
./nix/skrott.nix
|
||||||
system.stateVersion = "22.05";
|
|
||||||
|
|
||||||
networking = {
|
|
||||||
hostName = "skrot";
|
|
||||||
domain = "pvv.ntnu.no";
|
|
||||||
nameservers = [ "129.241.0.200" "129.241.0.201" ];
|
|
||||||
defaultGateway = "129.241.210.129";
|
|
||||||
interfaces.eth0 = {
|
|
||||||
useDHCP = false;
|
|
||||||
ipv4.addresses = [{
|
|
||||||
address = "129.241.210.235";
|
|
||||||
prefixLength = 25;
|
|
||||||
}];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
# services.resolved.enable = true;
|
|
||||||
# systemd.network.enable = true;
|
|
||||||
# systemd.network.networks."30-network" = {
|
|
||||||
# matchConfig.Name = "*";
|
|
||||||
# DHCP = "no";
|
|
||||||
# address = [ "129.241.210.235/25" ];
|
|
||||||
# gateway = [ "129.241.210.129" ];
|
|
||||||
# };
|
|
||||||
})
|
|
||||||
];
|
];
|
||||||
};
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+5
-1
@@ -4,11 +4,15 @@
|
|||||||
}:
|
}:
|
||||||
python3Packages.buildPythonApplication {
|
python3Packages.buildPythonApplication {
|
||||||
pname = "dibbler";
|
pname = "dibbler";
|
||||||
version = "unstable-2021-09-07";
|
version = "unstable";
|
||||||
src = lib.cleanSource ../.;
|
src = lib.cleanSource ../.;
|
||||||
|
|
||||||
format = "pyproject";
|
format = "pyproject";
|
||||||
|
|
||||||
|
# brother-ql is breaky breaky
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/285234
|
||||||
|
dontCheckRuntimeDeps = true;
|
||||||
|
|
||||||
nativeBuildInputs = with python3Packages; [ setuptools ];
|
nativeBuildInputs = with python3Packages; [ setuptools ];
|
||||||
propagatedBuildInputs = with python3Packages; [
|
propagatedBuildInputs = with python3Packages; [
|
||||||
brother-ql
|
brother-ql
|
||||||
|
|||||||
+8
-3
@@ -2,15 +2,20 @@
|
|||||||
cfg = config.services.dibbler;
|
cfg = config.services.dibbler;
|
||||||
in {
|
in {
|
||||||
options.services.dibbler = {
|
options.services.dibbler = {
|
||||||
|
enable = lib.mkEnableOption "dibbler, the little kiosk computer";
|
||||||
|
|
||||||
package = lib.mkPackageOption pkgs "dibbler" { };
|
package = lib.mkPackageOption pkgs "dibbler" { };
|
||||||
|
|
||||||
config = lib.mkOption {
|
config = lib.mkOption {
|
||||||
default = ../conf.py;
|
type = lib.types.path;
|
||||||
|
description = "Path to the configuration file.";
|
||||||
|
default = ../example-config.ini;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = let
|
config = let
|
||||||
screen = "${pkgs.screen}/bin/screen";
|
screen = "${pkgs.screen}/bin/screen";
|
||||||
in {
|
in lib.mkIf cfg.enable {
|
||||||
boot = {
|
boot = {
|
||||||
consoleLogLevel = 0;
|
consoleLogLevel = 0;
|
||||||
enableContainers = false;
|
enableContainers = false;
|
||||||
@@ -69,7 +74,7 @@ in {
|
|||||||
console.keyMap = "no";
|
console.keyMap = "no";
|
||||||
programs.command-not-found.enable = false;
|
programs.command-not-found.enable = false;
|
||||||
i18n.supportedLocales = [ "en_US.UTF-8/UTF-8" ];
|
i18n.supportedLocales = [ "en_US.UTF-8/UTF-8" ];
|
||||||
environment.noXlibs = true;
|
# environment.noXlibs = true;
|
||||||
|
|
||||||
documentation = {
|
documentation = {
|
||||||
info.enable = false;
|
info.enable = false;
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
mkShell,
|
||||||
|
python,
|
||||||
|
ruff,
|
||||||
|
uv,
|
||||||
|
}:
|
||||||
|
|
||||||
|
mkShell {
|
||||||
|
packages = [
|
||||||
|
ruff
|
||||||
|
uv
|
||||||
|
(python.withPackages (ps: with ps; [
|
||||||
|
brother-ql
|
||||||
|
matplotlib
|
||||||
|
psycopg2
|
||||||
|
python-barcode
|
||||||
|
sqlalchemy
|
||||||
|
]))
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{...}: {
|
||||||
|
system.stateVersion = "25.05";
|
||||||
|
|
||||||
|
services.dibbler.enable = true;
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostName = "skrot";
|
||||||
|
domain = "pvv.ntnu.no";
|
||||||
|
nameservers = [ "129.241.0.200" "129.241.0.201" ];
|
||||||
|
defaultGateway = "129.241.210.129";
|
||||||
|
interfaces.eth0 = {
|
||||||
|
useDHCP = false;
|
||||||
|
ipv4.addresses = [{
|
||||||
|
address = "129.241.210.235";
|
||||||
|
prefixLength = 25;
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
# services.resolved.enable = true;
|
||||||
|
# systemd.network.enable = true;
|
||||||
|
# systemd.network.networks."30-network" = {
|
||||||
|
# matchConfig.Name = "*";
|
||||||
|
# DHCP = "no";
|
||||||
|
# address = [ "129.241.210.235/25" ];
|
||||||
|
# gateway = [ "129.241.210.129" ];
|
||||||
|
# };
|
||||||
|
}
|
||||||
@@ -8,7 +8,6 @@ authors = []
|
|||||||
description = "EDB-system for PVV"
|
description = "EDB-system for PVV"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
license = {text = "BSD-3-Clause"}
|
|
||||||
classifiers = [
|
classifiers = [
|
||||||
"Programming Language :: Python :: 3",
|
"Programming Language :: Python :: 3",
|
||||||
]
|
]
|
||||||
@@ -32,4 +31,3 @@ line-length = 100
|
|||||||
|
|
||||||
[tool.ruff]
|
[tool.ruff]
|
||||||
line-length = 100
|
line-length = 100
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user