From 123a013711b855723686aff347e86ab73de27266 Mon Sep 17 00:00:00 2001 From: Njuguna Date: Mon, 26 May 2025 02:01:24 +0300 Subject: [PATCH 1/5] Initial Commit --- Pipfile | 2 +- Pipfile.lock | 190 +++++++++++++++++++++++++++++++++++----------- lib/debug.py | 3 +- lib/models.py | 49 +++++++++++- lib/mydatabase.py | 15 ++++ 5 files changed, 212 insertions(+), 47 deletions(-) create mode 100644 lib/mydatabase.py diff --git a/Pipfile b/Pipfile index 63c79cd98..5bda56b8b 100644 --- a/Pipfile +++ b/Pipfile @@ -8,7 +8,7 @@ alembic = "1.8.1" importlib-metadata = "6.0.0" importlib-resources = "5.10.0" ipdb = "0.13.9" -sqlalchemy = "1.4.42" +sqlalchemy = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 3923f4a97..0f559e3c7 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "fa62c636b7ae5acb4993fc7b007a651c55b562aa29962a9a8585ec314b352ae6" + "sha256": "7fa3316bc11173caf22a4489dce1c5b998e8410b8a3a2cffd1d3590de64e857f" }, "pipfile-spec": 6, "requires": { @@ -61,6 +61,85 @@ ], "version": "==1.2.0" }, + "greenlet": { + "hashes": [ + "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", + "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7", + "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", + "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", + "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", + "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", + "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", + "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", + "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", + "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa", + "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", + "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", + "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", + "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22", + "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9", + "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", + "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba", + "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3", + "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", + "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", + "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291", + "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", + "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", + "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", + "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", + "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef", + "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c", + "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", + "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c", + "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", + "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", + "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8", + "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d", + "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", + "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145", + "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", + "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", + "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e", + "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", + "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1", + "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef", + "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", + "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", + "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", + "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437", + "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd", + "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981", + "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", + "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", + "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798", + "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", + "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", + "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", + "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", + "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af", + "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", + "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", + "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42", + "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e", + "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81", + "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", + "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", + "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc", + "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de", + "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111", + "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", + "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", + "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", + "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", + "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", + "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803", + "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", + "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.1" + }, "importlib-metadata": { "hashes": [ "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad", @@ -236,50 +315,67 @@ }, "sqlalchemy": { "hashes": [ - "sha256:07e48cbcdda6b8bc7a59d6728bd3f5f574ffe03f2c9fb384239f3789c2d95c2e", - "sha256:18cafdb27834fa03569d29f571df7115812a0e59fd6a3a03ccb0d33678ec8420", - "sha256:1b1e5e96e2789d89f023d080bee432e2fef64d95857969e70d3cadec80bd26f0", - "sha256:315676344e3558f1f80d02535f410e80ea4e8fddba31ec78fe390eff5fb8f466", - "sha256:31de1e2c45e67a5ec1ecca6ec26aefc299dd5151e355eb5199cd9516b57340be", - "sha256:3d94682732d1a0def5672471ba42a29ff5e21bb0aae0afa00bb10796fc1e28dd", - "sha256:3ec187acf85984263299a3f15c34a6c0671f83565d86d10f43ace49881a82718", - "sha256:4847f4b1d822754e35707db913396a29d874ee77b9c3c3ef3f04d5a9a6209618", - "sha256:4d112b0f3c1bc5ff70554a97344625ef621c1bfe02a73c5d97cac91f8cd7a41e", - "sha256:51e1ba2884c6a2b8e19109dc08c71c49530006c1084156ecadfaadf5f9b8b053", - "sha256:535377e9b10aff5a045e3d9ada8a62d02058b422c0504ebdcf07930599890eb0", - "sha256:5dbf17ac9a61e7a3f1c7ca47237aac93cabd7f08ad92ac5b96d6f8dea4287fc1", - "sha256:5f752676fc126edc1c4af0ec2e4d2adca48ddfae5de46bb40adbd3f903eb2120", - "sha256:64cb0ad8a190bc22d2112001cfecdec45baffdf41871de777239da6a28ed74b6", - "sha256:6913b8247d8a292ef8315162a51931e2b40ce91681f1b6f18f697045200c4a30", - "sha256:69fac0a7054d86b997af12dc23f581cf0b25fb1c7d1fed43257dee3af32d3d6d", - "sha256:7001f16a9a8e06488c3c7154827c48455d1c1507d7228d43e781afbc8ceccf6d", - "sha256:7b81b1030c42b003fc10ddd17825571603117f848814a344d305262d370e7c34", - "sha256:7f8267682eb41a0584cf66d8a697fef64b53281d01c93a503e1344197f2e01fe", - "sha256:887865924c3d6e9a473dc82b70977395301533b3030d0f020c38fd9eba5419f2", - "sha256:9167d4227b56591a4cc5524f1b79ccd7ea994f36e4c648ab42ca995d28ebbb96", - "sha256:939f9a018d2ad04036746e15d119c0428b1e557470361aa798e6e7d7f5875be0", - "sha256:955162ad1a931fe416eded6bb144ba891ccbf9b2e49dc7ded39274dd9c5affc5", - "sha256:984ee13543a346324319a1fb72b698e521506f6f22dc37d7752a329e9cd00a32", - "sha256:9883f5fae4fd8e3f875adc2add69f8b945625811689a6c65866a35ee9c0aea23", - "sha256:a1ad90c97029cc3ab4ffd57443a20fac21d2ec3c89532b084b073b3feb5abff3", - "sha256:a3714e5b33226131ac0da60d18995a102a17dddd42368b7bdd206737297823ad", - "sha256:ae067ab639fa499f67ded52f5bc8e084f045d10b5ac7bb928ae4ca2b6c0429a5", - "sha256:b33ffbdbbf5446cf36cd4cc530c9d9905d3c2fe56ed09e25c22c850cdb9fac92", - "sha256:b6e4cb5c63f705c9d546a054c60d326cbde7421421e2d2565ce3e2eee4e1a01f", - "sha256:b7f4b6aa6e87991ec7ce0e769689a977776db6704947e562102431474799a857", - "sha256:c04144a24103135ea0315d459431ac196fe96f55d3213bfd6d39d0247775c854", - "sha256:c522e496f9b9b70296a7675272ec21937ccfc15da664b74b9f58d98a641ce1b6", - "sha256:c5a99282848b6cae0056b85da17392a26b2d39178394fc25700bcf967e06e97a", - "sha256:c7a46639ba058d320c9f53a81db38119a74b8a7a1884df44d09fbe807d028aaf", - "sha256:d4b1cc7835b39835c75cf7c20c926b42e97d074147c902a9ebb7cf2c840dc4e2", - "sha256:d4d164df3d83d204c69f840da30b292ac7dc54285096c6171245b8d7807185aa", - "sha256:d61e9ecc849d8d44d7f80894ecff4abe347136e9d926560b818f6243409f3c86", - "sha256:d68e1762997bfebf9e5cf2a9fd0bcf9ca2fdd8136ce7b24bbd3bbfa4328f3e4a", - "sha256:e3c1808008124850115a3f7e793a975cfa5c8a26ceeeb9ff9cbb4485cac556df", - "sha256:f8cb80fe8d14307e4124f6fad64dfd87ab749c9d275f82b8b4ec84c84ecebdbe" + "sha256:023b3ee6169969beea3bb72312e44d8b7c27c75b347942d943cf49397b7edeb5", + "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582", + "sha256:05132c906066142103b83d9c250b60508af556982a385d96c4eaa9fb9720ac2b", + "sha256:087b6b52de812741c27231b5a3586384d60c353fbd0e2f81405a814b5591dc8b", + "sha256:0b3dbf1e7e9bc95f4bac5e2fb6d3fb2f083254c3fdd20a1789af965caf2d2348", + "sha256:118c16cd3f1b00c76d69343e38602006c9cfb9998fa4f798606d28d63f23beda", + "sha256:1936af879e3db023601196a1684d28e12f19ccf93af01bf3280a3262c4b6b4e5", + "sha256:1e3f196a0c59b0cae9a0cd332eb1a4bda4696e863f4f1cf84ab0347992c548c2", + "sha256:23a8825495d8b195c4aa9ff1c430c28f2c821e8c5e2d98089228af887e5d7e29", + "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8", + "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f", + "sha256:34ea30ab3ec98355235972dadc497bb659cc75f8292b760394824fab9cf39826", + "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504", + "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae", + "sha256:4d44522480e0bf34c3d63167b8cfa7289c1c54264c2950cc5fc26e7850967e45", + "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", + "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", + "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", + "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1", + "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0", + "sha256:5e22575d169529ac3e0a120cf050ec9daa94b6a9597993d1702884f6954a7d71", + "sha256:60c578c45c949f909a4026b7807044e7e564adf793537fc762b2489d522f3d11", + "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e", + "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f", + "sha256:6854175807af57bdb6425e47adbce7d20a4d79bbfd6f6d6519cd10bb7109a7f8", + "sha256:6ab60a5089a8f02009f127806f777fca82581c49e127f08413a66056bd9166dd", + "sha256:725875a63abf7c399d4548e686debb65cdc2549e1825437096a0af1f7e374814", + "sha256:7492967c3386df69f80cf67efd665c0f667cee67032090fe01d7d74b0e19bb08", + "sha256:81965cc20848ab06583506ef54e37cf15c83c7e619df2ad16807c03100745dea", + "sha256:81c24e0c0fde47a9723c81d5806569cddef103aebbf79dbc9fcbb617153dea30", + "sha256:81eedafa609917040d39aa9332e25881a8e7a0862495fcdf2023a9667209deda", + "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9", + "sha256:8280856dd7c6a68ab3a164b4a4b1c51f7691f6d04af4d4ca23d6ecf2261b7923", + "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", + "sha256:8b4af17bda11e907c51d10686eda89049f9ce5669b08fbe71a29747f1e876036", + "sha256:90144d3b0c8b139408da50196c5cad2a6909b51b23df1f0538411cd23ffa45d3", + "sha256:906e6b0d7d452e9a98e5ab8507c0da791856b2380fdee61b765632bb8698026f", + "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6", + "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04", + "sha256:9a420a91913092d1e20c86a2f5f1fc85c1a8924dbcaf5e0586df8aceb09c9cc2", + "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560", + "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70", + "sha256:a373a400f3e9bac95ba2a06372c4fd1412a7cee53c37fc6c05f829bf672b8769", + "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", + "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6", + "sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b", + "sha256:b2ac41acfc8d965fb0c464eb8f44995770239668956dc4cdf502d1b1ffe0d747", + "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078", + "sha256:b50eab9994d64f4a823ff99a0ed28a6903224ddbe7fef56a6dd865eec9243440", + "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", + "sha256:c0b0e5e1b5d9f3586601048dd68f392dc0cc99a59bb5faf18aab057ce00d00b2", + "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", + "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", + "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", + "sha256:dd5ec3aa6ae6e4d5b5de9357d2133c07be1aff6405b136dad753a16afb6717dd", + "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", + "sha256:ff8e80c4c4932c10493ff97028decfdb622de69cae87e0f127a7ebe32b4069c6" ], "index": "pypi", - "version": "==1.4.46" + "markers": "python_version >= '3.7'", + "version": "==2.0.41" }, "stack-data": { "hashes": [ @@ -304,6 +400,14 @@ "markers": "python_version >= '3.7'", "version": "==5.8.1" }, + "typing-extensions": { + "hashes": [ + "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", + "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef" + ], + "markers": "python_version >= '3.8'", + "version": "==4.13.2" + }, "wcwidth": { "hashes": [ "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e", diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..58d98fcd3 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,10 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine - +from mydatabase import Base, engine from models import Company, Dev if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') + Base.metadata.create_all(engine) import ipdb; ipdb.set_trace() diff --git a/lib/models.py b/lib/models.py index 2681bee5a..e0539e63f 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,7 +1,7 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base - +from mydatabase import Base, session convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", } @@ -16,14 +16,59 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship("Freebie", back_populates="company") def __repr__(self): return f'' + + @property + def devs(self): + return list({freebie.dev for freebie in self.freebies}) + + + def give_freebie(self, dev, item_name, value): + from models import Freebie # to avoid circular import + new_freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self) + return new_freebie + + @classmethod + def oldest_company(cls): + return session.query(cls).order_by(cls.founding_year.asc()).first() + class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) name= Column(String()) - + + freebies = relationship("Freebie", back_populates="dev") def __repr__(self): return f'' + + + @property + def companies(self): + return list({freebie.company for freebie in self.freebies}) + + def received_one(self, item_name): + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, dev, freebie): + if freebie in self.freebies: + freebie.dev = dev + + +class Freebie(Base): + __tablename__ ="freebies" + + id=Column(Integer(), primary_key=True) + item_name=Column(String()) + value=Column(Integer()) + dev_id = Column(Integer, ForeignKey('devs.id')) + company_id = Column(Integer, ForeignKey('companies.id')) + + dev = relationship("Dev", back_populates="freebies") + company = relationship("Company", back_populates="freebies") + + def print_details(self): + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" diff --git a/lib/mydatabase.py b/lib/mydatabase.py new file mode 100644 index 000000000..4e55317eb --- /dev/null +++ b/lib/mydatabase.py @@ -0,0 +1,15 @@ +from sqlalchemy import create_engine, MetaData +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +convention = { + "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", +} +metadata = MetaData(naming_convention=convention) + +Base = declarative_base(metadata=metadata) + +engine = create_engine("sqlite:///freebies.db", echo=True) # echo=True shows SQL queries +Session = sessionmaker(bind=engine) + +session = Session() From f154e3f07f8c4a1046d68429d2d65af421f4bd3a Mon Sep 17 00:00:00 2001 From: Njuguna Date: Mon, 26 May 2025 02:46:43 +0300 Subject: [PATCH 2/5] adding info to database --- lib/freebies.db => freebies.db | Bin 20480 -> 16384 bytes lib/__pycache__/debug.cpython-38.pyc | Bin 0 -> 441 bytes lib/__pycache__/models.cpython-38.pyc | Bin 0 -> 3475 bytes lib/__pycache__/mydatabase.cpython-38.pyc | Bin 0 -> 350 bytes lib/debug.py | 74 ++++++++++++++++++++-- lib/models.py | 8 +-- lib/mydatabase.py | 17 ++--- lib/seed.py | 27 ++++++++ 8 files changed, 104 insertions(+), 22 deletions(-) rename lib/freebies.db => freebies.db (75%) create mode 100644 lib/__pycache__/debug.cpython-38.pyc create mode 100644 lib/__pycache__/models.cpython-38.pyc create mode 100644 lib/__pycache__/mydatabase.cpython-38.pyc diff --git a/lib/freebies.db b/freebies.db similarity index 75% rename from lib/freebies.db rename to freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..6f2f8bb91335dbea32304a9a220d5f869fee8afe 100644 GIT binary patch literal 16384 zcmeI&&u-H&90zdQsaBB@xe`njLeqRfY9-*p3y?)#DU=k_0NMdXY3q)NwyCmg(vC&q zak%poyuo(kiVz3R*saoki0xeQwdC0OL%*67)xFt-B60qJ#0x)L`BWMmGni^4`o9J!f%Jdf75C`6gr%% zQ8bQ6O1yOg@0lBz;CVbeQ$@N7^woK^T);$n>1YyD8Sh*{1J%Psd4&8He=ZQW(U z+S2lN2m1}uc>UhwZ=N%&p$~wH8)Z0`gE6;s|N>ks%BLddss}^TD?X1 zn)kR_bda8n`^oqux=?Yp`YQk4jrlfb{5#>l^aTw95P$##AOHafKmY;|fB*y_0D<)o&hmKB3A>tq%F00m}tad~;h##FFWa(-?>VqRuyF`U6Nc?y3{eWNBL zySTPCV-qJ>Sz=CVZc=7)d|7Hyab|uV8kfmA$kj2#RUyRD$;VXzO;SOFixa9XKCd)a zAvVYBMrq=B1=o6c^@XmZZifmX_p$`SED(i8n+OUS8EF^H5f8qooDLzIfRns(cqhwQyq%;$YWG=WGU_f61DG}pmR^>!i0y2g{ L04lA#Oo|Cio~JJa`@#)LqYrc^DYa7r#x$*x zY!5p1Y;eI0*bvmNQGh(UY-PvPVErpN;{Tv(6t{6%O4g{dT&FWTHxGh|Z4Gi*wpwZr zooylq&U#j%n|3Sdz^S2ZIS8XiP6?e7ZGPw5=r4%#R!l-!+MwxpWyc2kve#@2Z$zKC zMhBnkyly4r>i)1hD8_P(2cqpHs6OA~l)S5PcDBm9p|4w&b*t=715^!U&J4HBMN{P* fs>5#C4K_Z-YzF~nF0Gj(OzDCy{KN~rn8xHAefxPz literal 0 HcmV?d00001 diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34c26ef84dace44c315374d495cf032df7e9ae25 GIT binary patch literal 3475 zcmc&%%WoS+7~k1l+w1isPJsfYfO!-!C~+aYM59oVst6&%p@7gzXtmiHCvNuP%xqF@ zrKeN^A@#x)RcbFt`IqL(i907Q@cU-%#EF8G8zb#_9^ZWPJ%8W$+g8iB(Ej>;Wqa&d z)*m#PZ!RV`@u^?Xaf`FWN?E{CJFrtHa8fsL(@Icbv}Y&Pv=-D-FYwIVN$RN|_-5=T zjkFmwF|P3HkOeJK5iMSO$b$Cg7Wa7lfyL{hdFTWSnESkedBe;*m^XO~^Ol(}^7b98 zx9}(Av3eEl-_E5NZe?GJv97M?$zGc2+80?NwuIExJB1u(TiW|d6w$4yhH$`T6)VZD42%5+uW|2z6*OVqI`%@Na$ksPLx9EUrwYwflaVsj{Tt)v-)piPDgNBL+E))XpcbE?qT z!MBc2wb5~QVBNKTgAR`z-0Eyh>Z{XxyMMDauye_#^s7WNII`pwocjCg{&t>abk{b> zfAH_K19sQ?)!udQlp6M!cDUF-vbDW@UDu|<8|BOH1)SCORV50t{Mxg`kK&|i+1BLc znc!fdmRFNJjuN%Dd`u0tZZcGb_NI)Ld=6*NvUlnDGsM{##GW+g`NnkJtW`0f&p5V= z0hxjj;l9hP1NXo_a1P*V1gd+#a!`R`+zm<5&|`9ueq3E279utIqAUARvM1z=*pOr- zBxkksRY_cx&(oIKe}hJEQb&A(Mkels|6#7?7A5d>lj2B`$QEm|4x2nZ(`}w8Hi{Dw z8jVS3qaz(ZV2|OwC+sl=vHjS2LSy#{oO{GJfIyX9D1q3@B^NT>9P8E~-^(~<`&dL$ zJCTZYWiXVgfQC+-C|y%RDPX`^SG4nl3snFmOisRx+hJQMsh$wu!IMKxtl7-~NZ zVZc2=RH&O_xVsl6)16jWB2qb(6r7T@)b^0e3e70CRzYrDmv|rWIhtI7|Uz4 z)}yrskW#5sAnmw(kCw?&a~%b)Y@ws_qAsKJm}|G0&wRVdJjZ6f>s4%KXku)iY9!fB zeCm627lOk2F#!5g07UgT2Ef)70NW+}1q)N~bATvDt8e52ZZfe|#@kbvo=WKpU|MAr z?7EUtNs`9rWt%bSJJ_6|PZMYU7vwQ1Cto5tPkd+G_6pYCB@xLD25Gt^WEqsG59dIQ ze3kf|gD#Tbzfa6ej@gseDOTrZ9tEc&UWN6OHDCsAy^Fx@%IqM(wo`)b&(@CpoyDwO zn=L`oMaI15B69~GASZl`$i_4%L}xFF$r7_hVGDCZBbNrsQ180jL0_f6LciIDVkHnAiQva7mnwc{TTbF8hPm^K9!-n z5L%cAm3cT}M2{zwaXg*qL4{ex%;*7CMeNn^sA^;EO~(r*sstV0Kz(bLm_ag^7&57G zs>VY;X`UnuFqSlvgeoQC5uD5#jmdJxvlNx&*SieQB~x+e*@P8`RvuAJ#q-JQ=Jzty zjk=R+cOdh$+jC3YGAM4MjwT{6Iu;`iFO3XQd?+9=+pLX%Xxhf^RQ-Iln?y;x zEz+^1OXp(Jgku$Jx_v^loXfNn0{?d`ePwP({8%i{{RxnDBJk5O$3F-9Lm;V`X(%&$ t!)p&EFrsba)zZl%_<0&>Z?!DWYvgc~!dLMmA!TgK{>OEEyK|-U?7y@z-QEBI literal 0 HcmV?d00001 diff --git a/lib/__pycache__/mydatabase.cpython-38.pyc b/lib/__pycache__/mydatabase.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc217cf90d622bb68d4325e8f3f7d174c1760d0a GIT binary patch literal 350 zcmYjMy-ve05VrFNs+y{=ks&csHiQsD%q)c^OXbAZCSb?LaVmwCnT?l#k;n1M#49jy zfdTGx-`#z>-`g}@5R{j~e#^eHRI6)9ZP)QW6D4pX#1}dyVN`Q(`M5ys| zSVa&%kt!C+hGa*d*hMnx)5ZdKu!Vl#^?<}$KqI;3t~g?IAx4+V+v8< zWPy*MX|+#wqZ=(;XNg~66_-s5YO(>&_Nzal&{o-SCX?SiKDxxouf)zj{=nCUwORq| z@5cSubIz{d08$$Ty}sYa!5yFPF3jYQ U&y*IUgma2}h6G_rm%%Fd1^|#^m;e9( literal 0 HcmV?d00001 diff --git a/lib/debug.py b/lib/debug.py index 58d98fcd3..8ff086812 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,10 +1,76 @@ #!/usr/bin/env python3 -from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker from mydatabase import Base, engine -from models import Company, Dev +from models import Company, Dev, Freebie + +Session = sessionmaker(bind=engine) +session = Session() + +def create_data(): + # Create Companies + google = Company(name="Google", founding_year=1998) + apple = Company(name="Apple", founding_year=1976) + + # Create Devs + alice = Dev(name="Alice") + bob = Dev(name="Bob") + + # Add to session + session.add_all([google, apple, alice, bob]) + session.commit() + + # Create Freebies + freebie1 = Freebie(item_name="Sticker", value=5, dev=alice, company=google) + freebie2 = Freebie(item_name="T-Shirt", value=20, dev=bob, company=apple) + + session.add_all([freebie1, freebie2]) + session.commit() + +def read_data(): + companies = session.query(Company).all() + print("\nCompanies:") + for c in companies: + print(f" - {c.name} (Founded {c.founding_year})") + + devs = session.query(Dev).all() + print("\nDevs:") + for d in devs: + print(f" - {d.name}") + + freebies = session.query(Freebie).all() + print("\nFreebies:") + for f in freebies: + print(f" - {f.print_details()}") + +def update_data(): + alice = session.query(Dev).filter_by(name="Alice").first() + if alice: + alice.name = "Alice Cooper" + session.commit() + print(f"\nUpdated Dev name to {alice.name}") + +def delete_data(): + freebie = session.query(Freebie).filter_by(item_name="Sticker").first() + if freebie: + session.delete(freebie) + session.commit() + print(f"\nDeleted Freebie: {freebie.item_name}") if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') + # Create tables (if they don't exist) Base.metadata.create_all(engine) - import ipdb; ipdb.set_trace() + + # Clear existing data (optional - to keep script idempotent) + session.query(Freebie).delete() + session.query(Dev).delete() + session.query(Company).delete() + session.commit() + + # Run CRUD operations + create_data() + read_data() + update_data() + read_data() + delete_data() + read_data() diff --git a/lib/models.py b/lib/models.py index e0539e63f..a7e5eebc5 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,14 +1,12 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base -from mydatabase import Base, session +from mydatabase import Base convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", } metadata = MetaData(naming_convention=convention) -Base = declarative_base(metadata=metadata) - class Company(Base): __tablename__ = 'companies' @@ -26,12 +24,12 @@ def devs(self): def give_freebie(self, dev, item_name, value): - from models import Freebie # to avoid circular import + from models import Freebie new_freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self) return new_freebie @classmethod - def oldest_company(cls): + def oldest_company(cls, session): return session.query(cls).order_by(cls.founding_year.asc()).first() diff --git a/lib/mydatabase.py b/lib/mydatabase.py index 4e55317eb..919b0f89b 100644 --- a/lib/mydatabase.py +++ b/lib/mydatabase.py @@ -1,15 +1,6 @@ -from sqlalchemy import create_engine, MetaData -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker +from sqlalchemy import create_engine +from sqlalchemy.orm import declarative_base -convention = { - "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", -} -metadata = MetaData(naming_convention=convention) +engine = create_engine('sqlite:///app.db', echo=True, future=True) -Base = declarative_base(metadata=metadata) - -engine = create_engine("sqlite:///freebies.db", echo=True) # echo=True shows SQL queries -Session = sessionmaker(bind=engine) - -session = Session() +Base = declarative_base() diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..eb1d0849d 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,30 @@ #!/usr/bin/env python3 # Script goes here! +# seed.py +from mydatabase import session, Base, engine +from models import Company, Dev, Freebie + +# Drop and recreate tables +Base.metadata.drop_all(engine) +Base.metadata.create_all(engine) + +# Create companies +google = Company(name="Google", founding_year=1998) +apple = Company(name="Apple", founding_year=1976) + +# Create devs +alice = Dev(name="Alice") +bob = Dev(name="Bob") + +# Add to session and commit +session.add_all([google, apple, alice, bob]) +session.commit() + +# Create freebies +freebie1 = google.give_freebie(alice, "Tote Bag", 10) +freebie2 = apple.give_freebie(bob, "Sticker", 2) +freebie3 = google.give_freebie(bob, "Water Bottle", 5) + +session.add_all([freebie1, freebie2, freebie3]) +session.commit() From e099a5562b1f90def5d8527de70134b86561999e Mon Sep 17 00:00:00 2001 From: Joshua Gichuhi <164097287+Njugunaaa@users.noreply.github.com> Date: Tue, 27 May 2025 03:27:08 +0300 Subject: [PATCH 3/5] Update debug.py --- lib/debug.py | 73 +++------------------------------------------------- 1 file changed, 3 insertions(+), 70 deletions(-) diff --git a/lib/debug.py b/lib/debug.py index 8ff086812..31a6489a7 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,76 +1,9 @@ -#!/usr/bin/env python3 - +from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker -from mydatabase import Base, engine from models import Company, Dev, Freebie +engine = create_engine("sqlite:///freebies.db") Session = sessionmaker(bind=engine) session = Session() -def create_data(): - # Create Companies - google = Company(name="Google", founding_year=1998) - apple = Company(name="Apple", founding_year=1976) - - # Create Devs - alice = Dev(name="Alice") - bob = Dev(name="Bob") - - # Add to session - session.add_all([google, apple, alice, bob]) - session.commit() - - # Create Freebies - freebie1 = Freebie(item_name="Sticker", value=5, dev=alice, company=google) - freebie2 = Freebie(item_name="T-Shirt", value=20, dev=bob, company=apple) - - session.add_all([freebie1, freebie2]) - session.commit() - -def read_data(): - companies = session.query(Company).all() - print("\nCompanies:") - for c in companies: - print(f" - {c.name} (Founded {c.founding_year})") - - devs = session.query(Dev).all() - print("\nDevs:") - for d in devs: - print(f" - {d.name}") - - freebies = session.query(Freebie).all() - print("\nFreebies:") - for f in freebies: - print(f" - {f.print_details()}") - -def update_data(): - alice = session.query(Dev).filter_by(name="Alice").first() - if alice: - alice.name = "Alice Cooper" - session.commit() - print(f"\nUpdated Dev name to {alice.name}") - -def delete_data(): - freebie = session.query(Freebie).filter_by(item_name="Sticker").first() - if freebie: - session.delete(freebie) - session.commit() - print(f"\nDeleted Freebie: {freebie.item_name}") - -if __name__ == '__main__': - # Create tables (if they don't exist) - Base.metadata.create_all(engine) - - # Clear existing data (optional - to keep script idempotent) - session.query(Freebie).delete() - session.query(Dev).delete() - session.query(Company).delete() - session.commit() - - # Run CRUD operations - create_data() - read_data() - update_data() - read_data() - delete_data() - read_data() +import ipdb; ipdb.set_trace() From 1457f70fa0f3e96102be84617a812a3cbdb293ca Mon Sep 17 00:00:00 2001 From: Joshua Gichuhi <164097287+Njugunaaa@users.noreply.github.com> Date: Tue, 27 May 2025 03:28:53 +0300 Subject: [PATCH 4/5] Update models.py --- lib/models.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/models.py b/lib/models.py index a7e5eebc5..93b4602ee 100644 --- a/lib/models.py +++ b/lib/models.py @@ -14,7 +14,7 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) - freebies = relationship("Freebie", back_populates="company") + freebies = relationship("Freebie", backref="company") def __repr__(self): return f'' @@ -39,7 +39,7 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) - freebies = relationship("Freebie", back_populates="dev") + freebies = relationship("Freebie", backref="dev") def __repr__(self): return f'' @@ -65,8 +65,8 @@ class Freebie(Base): dev_id = Column(Integer, ForeignKey('devs.id')) company_id = Column(Integer, ForeignKey('companies.id')) - dev = relationship("Dev", back_populates="freebies") - company = relationship("Company", back_populates="freebies") + dev = relationship("Dev", backref="freebies") + company = relationship("Company", backref="freebies") def print_details(self): return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" From 880953906653691cfc488c7f64c7d316e68fd5fd Mon Sep 17 00:00:00 2001 From: Joshua Gichuhi <164097287+Njugunaaa@users.noreply.github.com> Date: Tue, 27 May 2025 03:38:19 +0300 Subject: [PATCH 5/5] Update seed.py --- lib/seed.py | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/lib/seed.py b/lib/seed.py index eb1d0849d..8dd5e40b6 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,30 +1,20 @@ -#!/usr/bin/env python3 - -# Script goes here! -# seed.py -from mydatabase import session, Base, engine +from sqlalchemy.orm import sessionmaker from models import Company, Dev, Freebie +from sqlalchemy import create_engine -# Drop and recreate tables -Base.metadata.drop_all(engine) -Base.metadata.create_all(engine) - -# Create companies -google = Company(name="Google", founding_year=1998) -apple = Company(name="Apple", founding_year=1976) +engine = create_engine("sqlite:///freebies.db") +Session = sessionmaker(bind=engine) +session = Session() -# Create devs -alice = Dev(name="Alice") -bob = Dev(name="Bob") +company1 = Company(name="Google", founding_year=1998) +company2 = Company(name="Apple", founding_year=1976) -# Add to session and commit -session.add_all([google, apple, alice, bob]) -session.commit() +dev1 = Dev(name="Njuguna") +dev2 = Dev(name="Kimani") -# Create freebies -freebie1 = google.give_freebie(alice, "Tote Bag", 10) -freebie2 = apple.give_freebie(bob, "Sticker", 2) -freebie3 = google.give_freebie(bob, "Water Bottle", 5) +freebie1 = Freebie(item_name="Sticker", value=1, company=c1, dev=d1) +freebie2 = Freebie(item_name="T-Shirt", value=10, company=c2, dev=d1) +freebie3 = Freebie(item_name="Mug", value=5, company=c1, dev=d2) -session.add_all([freebie1, freebie2, freebie3]) +session.add_all([company1, company2, dev1, dev2, freebie1 , freebie2, freebie3]) session.commit()