From 6755c617e84fd10ca58b89591f0e72dc82c1dea4 Mon Sep 17 00:00:00 2001 From: MassiveAtoms Date: Sun, 24 May 2020 15:48:06 -0300 Subject: [PATCH] works --- db.sqlite3 | Bin 204800 -> 208896 bytes markt/__pycache__/admin.cpython-38.pyc | Bin 1676 -> 1676 bytes markt/__pycache__/models.cpython-38.pyc | Bin 6454 -> 6573 bytes markt/admin.py | 1 + markt/migrations/0004_auto_20200524_1506.py | 23 ++++++++++++++++ .../0005_remove_order_factuur_id.py | 17 ++++++++++++ markt/migrations/0006_order_factuur_id.py | 20 ++++++++++++++ .../0007_remove_order_factuur_id.py | 17 ++++++++++++ markt/migrations/0008_auto_20200524_1522.py | 25 ++++++++++++++++++ .../migrations/0009_remove_factuur_orders.py | 17 ++++++++++++ markt/migrations/0010_auto_20200524_1530.py | 22 +++++++++++++++ .../0004_auto_20200524_1506.cpython-38.pyc | Bin 0 -> 668 bytes ...005_remove_order_factuur_id.cpython-38.pyc | Bin 0 -> 566 bytes .../0006_order_factuur_id.cpython-38.pyc | Bin 0 -> 768 bytes ...007_remove_order_factuur_id.cpython-38.pyc | Bin 0 -> 564 bytes .../0008_auto_20200524_1522.cpython-38.pyc | Bin 0 -> 903 bytes .../0009_remove_factuur_orders.cpython-38.pyc | Bin 558 -> 562 bytes .../0010_auto_20200524_1530.cpython-38.pyc | Bin 0 -> 718 bytes markt/models.py | 25 ++++++++++++++---- 19 files changed, 162 insertions(+), 5 deletions(-) create mode 100644 markt/migrations/0004_auto_20200524_1506.py create mode 100644 markt/migrations/0005_remove_order_factuur_id.py create mode 100644 markt/migrations/0006_order_factuur_id.py create mode 100644 markt/migrations/0007_remove_order_factuur_id.py create mode 100644 markt/migrations/0008_auto_20200524_1522.py create mode 100644 markt/migrations/0009_remove_factuur_orders.py create mode 100644 markt/migrations/0010_auto_20200524_1530.py create mode 100644 markt/migrations/__pycache__/0004_auto_20200524_1506.cpython-38.pyc create mode 100644 markt/migrations/__pycache__/0005_remove_order_factuur_id.cpython-38.pyc create mode 100644 markt/migrations/__pycache__/0006_order_factuur_id.cpython-38.pyc create mode 100644 markt/migrations/__pycache__/0007_remove_order_factuur_id.cpython-38.pyc create mode 100644 markt/migrations/__pycache__/0008_auto_20200524_1522.cpython-38.pyc create mode 100644 markt/migrations/__pycache__/0010_auto_20200524_1530.cpython-38.pyc diff --git a/db.sqlite3 b/db.sqlite3 index df2e02a08474c1e6fa17585f3f9be9e61b22c957..cd19cc0215cf9e5af43a9c952f950193188acf3e 100644 GIT binary patch delta 3804 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 delta 1422 zcmaJ=e@q)?7{2$t>s{}9*S8&v8+5Q*_k+SlyUhSDTLKXl(FHc$7P2jtE0lr!DAq#e zG985|izYuEb3Gi7DL9CEK3+h;uhxD0&(mQFZtfP z_xqlE-skRp-rh;QcT|7V;|>afu!XOsYhY;ORtSF5aEgpFzPGZ#;4xd98CG2W|PcUs4^NqBrO`y+Du9$Mib|D2FiVZn)~qS&=9DVW-s?@9vI;>S9fi z*o&y<4zCK7f-zhd$n|_AXliC(Um>nhpNw|LJFHk+Tyu+_;r_re$o@1aSES@1-lY$q zchc`TFX+;wK>M6y+MKpYwb=v83ELmG)6%3Z?p!T84HUNOEso2nq6T;!*;of0C~=&J zJhQkM`Xg~G+#bnP2(>KLdMLHCp)jmshb+ip^I;e%4@aZz-rBmo-r9Y;cBKV;Zf@8B zef|fynxnA}%UX~gT1=EQPc}5Onoc;Hy4D0!GGaX&Z-Z(j8jD$0(>nG}2bLBt)bEKd zZ2G)~zVvSh)l`LAn|%I+xm_{$`601`&32%lmZR6EDe{@U6IU8OZ(Xg|w|LG%o#-jT zdDHKQfxrV&m+CC%@hyn$VI{3t4P7kWiV^me1v1zFTPu3>M4(j3e0F}^O0DjM>CFWO zB?Y=mf6;C3gFk74exaY}3rf-j`j*b|{tppLo`F3aI4aOR`kQ9x7EN>LRk}i#=@Na< zfukJwF0s*bP*q^)Qv!WWeN;iBbKIG5ZgYypMdK~wIm4w-aqoSjqu*dJkAs<-zX+%&@a1^K9q zwgKr!eNZYB1>6Cr!82Uxx+NwYjqF+{Ze#Tp?hzC2FpEZUJM%=bfSn1WgI$i|Mk!HY zDXcP#=fu9p8rbCXSjdVS@fG%38xE$*ns7JZONUsb8B3s;oovRZj`ti?%xV)7`K_Hz zkt3Nw3N4LW#z3L+$mU>KWJ_u0tmuhnsw?+aduwW|s_VVJ|HCi1DT7E`av7=5-*@PM zVwz?aylQ5=mBD4gdN$XL$CO3<+hJJ8`rELa%~`OCy?+?XQ=f%_zzhkiOn-mNeuc;I zenoDOc^d>Fb-x9#05jTQK-2pL+4S^zo>o%dH9{UZ__@P8$Y-IZH8t3dHz9Sh9ZrCj z?jX<|f$nf8+#tijn+3dcs5Yp<4|~y-t#O1%GmAD93VHfy(%p5HiX>45F&!{%o`-Pj zIc_aqKECYS89$SAIsWVjNlpK0D=n#PQ?jtJ8mQDyQT)}7+49E>6$%z}ymhl&)? delta 114 zcmeC-?cwDO<>lpK0D}E%PQ?jsJ8mQF-zn)}7)k9E>8YKn$XhFaUOx6runC diff --git a/markt/__pycache__/models.cpython-38.pyc b/markt/__pycache__/models.cpython-38.pyc index 89787cf7d99f9f791d2ef216fca6f86b09e7225e..fe50b7b5fce125ca4c71741dafd0d7be2d421ba8 100644 GIT binary patch delta 1113 zcmY*YOK%fb6uxI(9*@TpdvI)%@Gz*fb$N)l(ojfvqzRh@2};!w)EaTk!$};tV}lwT zq2d4%6%;r~u;{|>re%=@Lh1(8MOCq2gDO>Bc-?I`{DJnINl?_ey5Ah1Ip>?}?>qC$ z?xj867wNPk=<CpB@H~_{LLk5fAp=h8g_5?+Kj2Gnw_oyN`H_ z7PX3K2Cw9{p6!ajsp_?q1X|`jEpVkJ6N@59OIs%C?u`rS$kd{cskRpM-4W+Ox-z|J z2bnv<5JC2&D0@9~O3A7^rA%U0+ZlEc;DKxtzQO0&`>=qc{w??xU;7(w81#sDAMNNo zK}*y`4G6Uy#TAZ3P3PZ5v7onf3DZIiH4LeB%;jfYXv598&RD4&5}K%RkLXxk0iuy; z*e%i4YE}zc+I^s7>XQoSZ8zoz$5d(lQmtN^4MSDBzEHYUFI}CRQz{H)IjMG1k=nyB z!myX1=bR2_n$!F?z?Lx%V_H7b71|M>iYG9m*_s#6AWr3q4qL@nbe9I9?ADUfjEBIw zr(-74$*(QTPlk|h zqr|Ny7+AKR9yMpxDEfs@c9r#2{nat9h_(2?&K=4}Hh};i>xI)UQw4VXw-k1)P4E-G zD{P13SSo%1qc~RF_8EU}%XYKI^0)&K^>OVHK@l6o>$O-Up%>Jj6!Tbfd+msK$A2@ zlX<;}*vWYN0XlJ8n};4eRrU@p;a=H$XhKUrL9~tTPg{Bz;2Q4v)?f_B`~?`tpZ?97 z0l{k?@`gZk?T~%vZ6FSC7Y_^$7G4a#glYU5T!&kDCsaqg9mE^+P$;wWtAFe8n_j!H zsh3#7my*+d3#fbENQr>uwX`Bj7*?63(>HjPSw72OWR|}mB|?krK3DieKj{(eoAotptvDFgcaY<@lE5D6_el8ArW0lbp>=0WDI)uJ8nK+z2nj z95$LS;3;mK#};H-5+g{%?j^{xG)n`a6d`+3ShRIo7M@Nfu}NXEO{K(uW!0=F&k9mn z$wOXR209*$GG+#}wPOVQJ9{0gzUhv9;si!$Zz9mB$MFDe$0hV9lM{*K;+IQGPv zVFMq=T3`s*V-3)c`?2PpVG-m;x^N_xxNcE!LWdM6n5-nCKI(15>k;k0Mcx#FtjWXLLGsIRl6zOL=l!}?1p6Qc(5I$u3_6X zXW#_ffg^a!iYrt?@a)cr5zq3c_v`oGms}kl76|0)_aE=)7@?oR*q0QHGr0B%07pEL zNF`OGaD@}}7IDnU7sQE3I`WxRgr}Ein*D-YG{wG9ZDW{gb#MJhX)dH)h0wm_V4T6V z3jl$tgrf@cq)93w(k=@P#Hbtd6i#-F`RI1%AOG)faFz2M2AKHC`K~jJktt@@&Oa>6 z@)^BmD>n>=YQu%Ge!R7PemN|ic1*qt6-&wbwNLv&$|-?8!tAtXN`Nn5cHIieeHJS& zpkYp9m{MO*3h9FspdV2BabPl(1dEG}=(*@ut*{2zM!uL!C(I%|W=M1_q-HKUe4#gD zOW!wSjvyT2&c1$8Us;&GK4;dppTyj0W$QP>uASc0YLKp#ZQnp=x-l9)fl^@BoiIY( z)F1TVA|v${cU0LL7&@VBaGK7_Sy`UWPUzFq^7--R#)KbX1lK+W$O-H1!kSvA)sAd>J>5+r{9&Meemn@Se|K-gEXUkYEEf56EA}9=8Ml literal 0 HcmV?d00001 diff --git a/markt/migrations/__pycache__/0005_remove_order_factuur_id.cpython-38.pyc b/markt/migrations/__pycache__/0005_remove_order_factuur_id.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8515866dba264f6865c3ba345a1737269d4d19c GIT binary patch literal 566 zcmY*V%}(4f5VoCU*$qE}Q}4ayvI?u+9uPtx5ETbFwBiy)SYc<_W{KlqCkW2;+SjPW z8}u1?1YbGz6?!P0ghgFO@+W`ena}gh`TBauD1QEWx=1)<&n;OFpU6HP`;h<`@Pa9x zaLzt65a4}h;31!j2QLxee`Qhdo9bA^U8wSz$?9B}cG{+vhYs-~#(A}?q3ldO!U zWhq58ouff@pMKL#-T6!x__hF>lJAM6A{s$gX%55c-gq=akB;3S=zHSD4}31T q`0KxPZ)cI`1~AXcnI6JrXQ|8oAO7{WMeVM?`?{CCR@Jul*SvpGk(;dm literal 0 HcmV?d00001 diff --git a/markt/migrations/__pycache__/0006_order_factuur_id.cpython-38.pyc b/markt/migrations/__pycache__/0006_order_factuur_id.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a06ff5aaba4d58bbee7862e76aea586fb31e6764 GIT binary patch literal 768 zcmZWn&2H2%5O$oO&4#X2aj1kS50Fc=7dTW1wQ5;}Pz!?g5=B_)&U8td#HpQBTCQ;I zgYXEv0*~M;r@jJ0D&y=fRKk`={>C29eBbzNGKmsBi+Say-YW(!cwZTK=#>5!H}!#kV6lHoF)ZdLs*8onyFxbF1hoXL^vT?w z-5()=eOh{t46@V#mU3_wPU@mp(u?3?P>v`^SdPn}jLHY#LvZ852*MkW?rp)CvPNcn zyh%s7{W@2dUAjA+PM->ewY)|l6`&Fq`Mm3UB?>V9;4#r`?RtH5>rfS+CqrB%YX13^#=^kq{Kw zS4jIUA+Gwove6a+w%7nR^8&S^?l2P`0L<*G%C#_>NrlCtd4o$6K$$lSX*isla43!R zHlug%-=4laJT;MQaovM&Og*OP!Th>9+{@0WJe?iqS{K)N(8*e7N2o75*=9A7Evlkf zP+6i?lKNQJ1hW!J%w_gT_T3;-wzeDTbw-Lm`%mhmT`K#hMzr)pGNH@wJl}IT%^ipT z_U?xBI56WCp#;tc?kmQR{yLM@M@lwS)sE$4-~PvLwc91137@Z2eqn{v_S&`+x_RHVgXnTGPFjJ3paIuN?&0=!yH_wOB~yLWM+=; z+w^w5wVE7RG&b2wtmLP=MB1kWm#mdc0gI(JjcI`^(6|Q{{ zo`E;u5mwwd^$|cIn6(q=TKjpw*`1wlX7;4t4-6XfFJIq%vkc?ACO3yeWS6EK5r6?^ zZWLx@7FJ}Lnp?RYIWG*b!TDr>gJ$M_v?CX+w?^n*laCQvDk##0NUD^VQh5aj%;nKs z@7)|-BD*x@i~xhh9NhFGDpDn1PzN?)hU%A`Q$H0YkCn1kA0 z3X~`)?#8*Z4z0Xntwhc)x7t7rr7-Sko|NZwO`YeWM@m9l^yw!C8ioW%;ZXUkiN=@; z7^CQQj)TwuB=U*Sr5kR|1UD+^AQ z-=s&~RGrsvj%UyJXDZmsD-?~d8XhL)YQ{CThJY_|-Tu#pxT}R~_$l|F#3z)$j1Lnj z(+k|Icp>8hl;;&+#syU~&C_y0n%PotdO}4(G|rH^wTj>Kx@w9OuW{2`8BDzw+(eDNp literal 0 HcmV?d00001 diff --git a/markt/migrations/__pycache__/0009_remove_factuur_orders.cpython-38.pyc b/markt/migrations/__pycache__/0009_remove_factuur_orders.cpython-38.pyc index 306b726fa67ba44c46903fbfbb76e721728aec33..d714d54263ce6df7aaedb4ac5cdfa953aefd4d7d 100644 GIT binary patch delta 50 zcmZ3-vWbN^l$V!_0SKP&ITaT%k$1g>xPgIzMSNmuNq)SMfsuiMsgX&%p{bG4#tU(b E0Ak+`WdHyG delta 46 zcmdnQvW|r}l$V!_0SK(to{9^Z$h%%d*ucQRB0eoKxumqTC_cX^CAFw{(N^T;ZAr z;URbd9$~MXcm)tYvzt_Oto?RoXLf$R^~LsfOi=c|etY+r5%S#`cO^jM2$y++00d}7 zYMRlSWsH)S1Q_to1h}Mg{)uNCg100Ie_$+0n2qalri->zjj_F2fvn8bx$epUjU!y< z5J8fR0?8QA8O^v1=AkP9!HS{YgAjVMKaZe~Uj%~{hj_(jEE~WO%Wm1hl- zw{|B@(`Q1OMd=X-YZ+!EoE{%E3SkQ>Us5dFw?;ozrvagbja z96FyA#*{bmxK*{uPo%kS)grIEsx7OsnPDelp%p$`U89-LB~rJ{->a_mGv^z;CEDa^ zx|@okYn2$M<22nL?}^?0r|D?1)b8i$;W7^qBF_E>VL%yWe}cg8^xp5_mybG20y}_t h(ah8cF8$noK=1rN##-CKY&JSvGx*%`U>s2o_&*pP$qfJi literal 0 HcmV?d00001 diff --git a/markt/models.py b/markt/models.py index 4f23799..f8086ce 100644 --- a/markt/models.py +++ b/markt/models.py @@ -16,6 +16,7 @@ class Houtsoort(models.Model): def __str__(self): """String for representing the Model object.""" return self.Houtsoort_naam + class Meta: db_table = "Houtsoort" verbose_name_plural = "Houtsoorten" @@ -33,6 +34,7 @@ class Formaat(models.Model): def __str__(self): """String for representing the Model object.""" return self.Formaat + " " + str(self.Lengte) + "m" + class Meta: db_table = "Formaat" verbose_name_plural = "Formaten" @@ -60,6 +62,7 @@ class Houtmarkt(models.Model): def __str__(self): """String for representing the Model object.""" return self.Houtmarkt_naam + class Meta: db_table = "Houtmarkt" verbose_name_plural = "Houtmarkten" @@ -79,7 +82,8 @@ class Voorraad(models.Model): def __str__(self): """String for representing the Model object.""" - return str(self.Format_ID) + " " + self.Hout_ID.Houtsoort_naam + return str(self.Format_ID) + " " + self.Hout_ID.Houtsoort_naam + class Meta: db_table = "Voorraad" verbose_name_plural = "Voorraad" @@ -100,17 +104,20 @@ class Klant(models.Model): def __str__(self): """String for representing the Model object.""" return self.Klant_naam + class Meta: db_table = "Klant" verbose_name_plural = "Klanten" + class Order(models.Model): - Order_ID = models.AutoField(primary_key=True) + Order_ID = models.AutoField(primary_key=True) Voorraad_ID = models.ForeignKey("Voorraad", on_delete=models.PROTECT) - Factuur_ID = models.ForeignKey("Factuur", on_delete=models.PROTECT) + # Factuur_ID = models.ForeignKey("Factuur", on_delete=models.PROTECT) Amount = models.IntegerField() - + Prijs = models.FloatField(null=True, blank=True) + def get_absolute_url(self): """Returns the url to access a particular instance of the model.""" return reverse('model-detail-view', args=[str(self.Order_ID)]) @@ -118,12 +125,17 @@ class Order(models.Model): def __str__(self): """String for representing the Model object.""" return "{} {}".format(self.Amount, self.Voorraad_ID) + class Meta: db_table = "Order" verbose_name_plural = "Orders" def save(self, *args, **kwargs): self.Prijs = self.Voorraad_ID.Prijs * self.Amount + new_amount = self.Voorraad_ID.Voorraad_Amount - self.Amount + if new_amount < 0: + raise ValueError("Er zijn maar {} in voorraad".format(self.Voorraad_ID.Voorraad_Amount)) + self.Voorraad_ID.Voorraad_Amount -= self.Amount self.Voorraad_ID.save() return super(Order, self).save(*args, **kwargs) @@ -132,7 +144,7 @@ class Order(models.Model): class Factuur(models.Model): Factuur_ID = models.AutoField(primary_key=True) Klant_ID = models.ForeignKey("Klant", on_delete=models.PROTECT) - Orders = models.ManyToManyField("Order") + Orders = models.ManyToManyField("Order", null=True, blank=True) Korting_percent = models.FloatField() Subtotal = models.FloatField(null=True, blank=True) total = models.FloatField(null=True, blank=True) @@ -144,11 +156,14 @@ class Factuur(models.Model): def __str__(self): """String for representing the Model object.""" return str(self.Factuur_ID) + def save(self, *args, **kwargs): + super(Factuur, self).save(*args, **kwargs) self.Subtotal = sum([i.Prijs for i in self.Orders.all()]) self.total = self.Subtotal * (1 - self.Korting_percent/100) return super(Factuur, self).save(*args, **kwargs) + class Meta: db_table = "Factuur" verbose_name_plural = "Facturen"