From 5c5625595eef006c56807d59d9e9661a8899b47c Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 5 Feb 2026 12:27:03 +0000 Subject: [PATCH] Autosave: 20260205-122703 --- core/__pycache__/admin.cpython-311.pyc | Bin 6885 -> 7316 bytes core/__pycache__/models.cpython-311.pyc | Bin 36983 -> 39067 bytes core/admin.py | 7 +++++ core/migrations/0024_device.py | 27 ++++++++++++++++++ .../__pycache__/0024_device.cpython-311.pyc | Bin 0 -> 2177 bytes core/models.py | 27 ++++++++++++++++++ 6 files changed, 61 insertions(+) create mode 100644 core/migrations/0024_device.py create mode 100644 core/migrations/__pycache__/0024_device.cpython-311.pyc diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 255213de67ac2e00a8e7a935707b7cdddec80ee1..c5c0f96bc06cbacee968befb2cd15041619e8026 100644 GIT binary patch literal 7316 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%0DFq_-6#w zN;Y-}egpv-A6OwWrVO>(gDlnU>khX$%I;%kqzJQDdoVI|-? zeIk+naax*rt$P=5&o+qu0^5pVSL7L&5~Z(#mdOt~uR;}RUuYWNrm-sj3uYpUYZwFE zpwEcnfA!LCAu}}I7q#twuPW|4qPU8TR#Wi?6O_x1;ExE(d*`*UXXf6 zy-GpvP7Q^pTB_eyi5zv|LGMwLJxI;!G+onsn3<+#x{gAL1HDd9F#4_$?^_c#0I=0Y zY}gsJ0aEccEYi$qtsiJN=L1{%&mn=g;b>8!lQVcgskwV?L!`aFN)~Wxr&=WCT{CJ{ z{4>FOw5akAF&U`}HpT#t=rhtV-bGdT5Dnvn!F~$z)yid2Y<#KPyR9qeinzJM6ErT; z@|bscif(uskO5=?69D|@kfS5u@{BFustA|@lmI6HC^HuaTj(_!W zcvWP%u}e=!bQI?9qs@?R^B!y}5W+dl(Fe+=Om;w`@VUN2k5Alh1muRk0}*+Y$wH4J zC~J}2@^W*@OqQu2{T6ZP&)FN^)7$U(*R+<=$N7O=ahza`9VsgZ!+*!>1XGWd{~wrB z)KYi$+ok>NAv@V)Cy!N?T|HJtVSlSPbN(eJUIShx6m>C_&ju{XLpIxEv&Sl9A0I2D zu%GIcR$gM_H2^Ggp?o@E$sDqU9$Pq86YTwCWfb;5>P@e{#Kda=SV(tYJ{PbIShNm{ zq7YiN4vW?YEm}VgEecr}yAF$@;Iq&KEV|xjfoNz^;gBu$*b@8_C6J`gW_u?q@JpX% zIh0SUtOx_5u>Ytxdl4Zi!T^6Z8(#ItaP=(JTi6&84ty2HZPeK^0DjyCJ?_N~@^Ky~ zD^-{}1fj>tN}A~V3R0oRCk`29)*>=-0|Zfk*=w+511uY0ITgx>EV)BQqo?5U2Mj)r z!+oPSw+^>IV2IuW2C~!rWnuh^hm7K}{C2iyYrVxwQMQ%-vXE^c8@8lwaTun=meg%a z>J}sgEeP2LGW3>Yi^DKYZ%MXWlFi$|jM0LSZSs(j15U%zx@3#P{Z4QG0xYddwz_0H q(_a>_9hA-;veh12#a6zEOp3xYqqlSgTlpfk@HY_)u$JZk diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 125d3366e9871805d9f878dfba41731aad77c906..d3ebbacdfe0f317f517e2bd689fc66b3866dc57e 100644 GIT binary patch delta 5098 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 v`8UWcOzGusuLJ4vEXzXa*^t727dnod~0Q} literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 48f0c54..886a0a8 100644 --- a/core/models.py +++ b/core/models.py @@ -375,6 +375,33 @@ class SystemSetting(models.Model): def __str__(self): return self.business_name + +class Device(models.Model): + DEVICE_TYPES = [ + ('printer', _('Printer')), + ('scanner', _('Scanner')), + ('scale', _('Weight Scale')), + ('display', _('Customer Display')), + ('other', _('Other')), + ] + CONNECTION_TYPES = [ + ('network', _('Network (IP)')), + ('usb', _('USB')), + ('bluetooth', _('Bluetooth')), + ] + + name = models.CharField(_("Device Name"), max_length=100) + device_type = models.CharField(_("Device Type"), max_length=20, choices=DEVICE_TYPES) + connection_type = models.CharField(_("Connection Type"), max_length=20, choices=CONNECTION_TYPES, default='network') + ip_address = models.GenericIPAddressField(_("IP Address"), blank=True, null=True) + port = models.PositiveIntegerField(_("Port"), blank=True, null=True) + is_active = models.BooleanField(_("Active"), default=True) + config_json = models.JSONField(_("Configuration"), blank=True, null=True, help_text=_("Additional driver configuration in JSON format")) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"{self.name} ({self.get_device_type_display()})" + class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile") image = models.ImageField(_("Profile Picture"), upload_to="profile_pics/", blank=True, null=True)