From 1650fb977cf0206610a98c4d079c0fb125cfad20 Mon Sep 17 00:00:00 2001 From: Shadrack Date: Tue, 4 Mar 2025 11:18:41 +0300 Subject: [PATCH] completed code challenge --- Pipfile | 2 +- Pipfile.lock | 190 +++++++++++++++++++------ lib/__pycache__/models.cpython-313.pyc | Bin 0 -> 6439 bytes lib/debug.py | 56 +++++++- lib/freebies.db | Bin 20480 -> 32768 bytes lib/models.py | 92 +++++++++++- lib/seed.py | 62 +++++++- lib/your_database.db | 0 8 files changed, 348 insertions(+), 54 deletions(-) create mode 100644 lib/__pycache__/models.cpython-313.pyc create mode 100644 lib/your_database.db 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..f9e1c0743 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:0398361acebb42975deb747a824b5188817d32b5c8f8aba767d51ad0cc7bb08d", + "sha256:0561832b04c6071bac3aad45b0d3bb6d2c4f46a8409f0a7a9c9fa6673b41bc03", + "sha256:07258341402a718f166618470cde0c34e4cec85a39767dce4e24f61ba5e667ea", + "sha256:0a826f21848632add58bef4f755a33d45105d25656a0c849f2dc2df1c71f6f50", + "sha256:1052723e6cd95312f6a6eff9a279fd41bbae67633415373fdac3c430eca3425d", + "sha256:12d5b06a1f3aeccf295a5843c86835033797fea292c60e72b07bcb5d820e6dd3", + "sha256:12f5c9ed53334c3ce719155424dc5407aaa4f6cadeb09c5b627e06abb93933a1", + "sha256:2a0ef3f98175d77180ffdc623d38e9f1736e8d86b6ba70bff182a7e68bed7727", + "sha256:2f2951dc4b4f990a4b394d6b382accb33141d4d3bd3ef4e2b27287135d6bdd68", + "sha256:3868acb639c136d98107c9096303d2d8e5da2880f7706f9f8c06a7f961961149", + "sha256:386b7d136919bb66ced64d2228b92d66140de5fefb3c7df6bd79069a269a7b06", + "sha256:3d3043375dd5bbcb2282894cbb12e6c559654c67b5fffb462fda815a55bf93f7", + "sha256:3e35d5565b35b66905b79ca4ae85840a8d40d31e0b3e2990f2e7692071b179ca", + "sha256:402c2316d95ed90d3d3c25ad0390afa52f4d2c56b348f212aa9c8d072a40eee5", + "sha256:40310db77a55512a18827488e592965d3dec6a3f1e3d8af3f8243134029daca3", + "sha256:40e9cdbd18c1f84631312b64993f7d755d85a3930252f6276a77432a2b25a2f3", + "sha256:49aa2cdd1e88adb1617c672a09bf4ebf2f05c9448c6dbeba096a3aeeb9d4d443", + "sha256:57dd41ba32430cbcc812041d4de8d2ca4651aeefad2626921ae2a23deb8cd6ff", + "sha256:5dba1cdb8f319084f5b00d41207b2079822aa8d6a4667c0f369fce85e34b0c86", + "sha256:5e1d9e429028ce04f187a9f522818386c8b076723cdbe9345708384f49ebcec6", + "sha256:63178c675d4c80def39f1febd625a6333f44c0ba269edd8a468b156394b27753", + "sha256:6493bc0eacdbb2c0f0d260d8988e943fee06089cd239bd7f3d0c45d1657a70e2", + "sha256:64aa8934200e222f72fcfd82ee71c0130a9c07d5725af6fe6e919017d095b297", + "sha256:665255e7aae5f38237b3a6eae49d2358d83a59f39ac21036413fab5d1e810578", + "sha256:6db316d6e340f862ec059dc12e395d71f39746a20503b124edc255973977b728", + "sha256:70065dfabf023b155a9c2a18f573e47e6ca709b9e8619b2e04c54d5bcf193178", + "sha256:8455aa60da49cb112df62b4721bd8ad3654a3a02b9452c783e651637a1f21fa2", + "sha256:8b0ac78898c50e2574e9f938d2e5caa8fe187d7a5b69b65faa1ea4648925b096", + "sha256:8bf312ed8ac096d674c6aa9131b249093c1b37c35db6a967daa4c84746bc1bc9", + "sha256:92f99f2623ff16bd4aaf786ccde759c1f676d39c7bf2855eb0b540e1ac4530c8", + "sha256:9c8bcad7fc12f0cc5896d8e10fdf703c45bd487294a986903fe032c72201596b", + "sha256:9cd136184dd5f58892f24001cdce986f5d7e96059d004118d5410671579834a4", + "sha256:9eb4fa13c8c7a2404b6a8e3772c17a55b1ba18bc711e25e4d6c0c9f5f541b02a", + "sha256:a2bc4e49e8329f3283d99840c136ff2cd1a29e49b5624a46a290f04dff48e079", + "sha256:a5645cd45f56895cfe3ca3459aed9ff2d3f9aaa29ff7edf557fa7a23515a3725", + "sha256:a9afbc3909d0274d6ac8ec891e30210563b2c8bdd52ebbda14146354e7a69373", + "sha256:aa498d1392216fae47eaf10c593e06c34476ced9549657fca713d0d1ba5f7248", + "sha256:afd776cf1ebfc7f9aa42a09cf19feadb40a26366802d86c1fba080d8e5e74bdd", + "sha256:b335a7c958bc945e10c522c069cd6e5804f4ff20f9a744dd38e748eb602cbbda", + "sha256:b3c4817dff8cef5697f5afe5fec6bc1783994d55a68391be24cb7d80d2dbc3a6", + "sha256:b79ee64d01d05a5476d5cceb3c27b5535e6bb84ee0f872ba60d9a8cd4d0e6579", + "sha256:b87a90f14c68c925817423b0424381f0e16d80fc9a1a1046ef202ab25b19a444", + "sha256:bf89e0e4a30714b357f5d46b6f20e0099d38b30d45fa68ea48589faf5f12f62d", + "sha256:c058b84c3b24812c859300f3b5abf300daa34df20d4d4f42e9652a4d1c48c8a4", + "sha256:c09a6ea87658695e527104cf857c70f79f14e9484605e205217aae0ec27b45fc", + "sha256:c57b8e0841f3fce7b703530ed70c7c36269c6d180ea2e02e36b34cb7288c50c7", + "sha256:c9cea5b756173bb86e2235f2f871b406a9b9d722417ae31e5391ccaef5348f2c", + "sha256:cb39ed598aaf102251483f3e4675c5dd6b289c8142210ef76ba24aae0a8f8aba", + "sha256:e036549ad14f2b414c725349cce0772ea34a7ab008e9cd67f9084e4f371d1f32", + "sha256:e185ea07a99ce8b8edfc788c586c538c4b1351007e614ceb708fd01b095ef33e", + "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb", + "sha256:eae27ad7580529a427cfdd52c87abb2dfb15ce2b7a3e0fc29fbb63e2ed6f8120", + "sha256:ecef029b69843b82048c5b347d8e6049356aa24ed644006c9a9d7098c3bd3bfd", + "sha256:ee3bee874cb1fadee2ff2b79fc9fc808aa638670f28b2145074538d4a6a5028e", + "sha256:f0d3de936b192980209d7b5149e3c98977c3810d401482d05fb6d668d53c1c63", + "sha256:f53c0d6a859b2db58332e0e6a921582a02c1677cc93d4cbb36fdf49709b327b2", + "sha256:f9d57f1b3061b3e21476b0ad5f0397b112b94ace21d1f439f2db472e568178ae" ], "index": "pypi", - "version": "==1.4.46" + "markers": "python_version >= '3.7'", + "version": "==2.0.38" }, "stack-data": { "hashes": [ @@ -304,6 +400,14 @@ "markers": "python_version >= '3.7'", "version": "==5.8.1" }, + "typing-extensions": { + "hashes": [ + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" + ], + "markers": "python_version >= '3.8'", + "version": "==4.12.2" + }, "wcwidth": { "hashes": [ "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e", diff --git a/lib/__pycache__/models.cpython-313.pyc b/lib/__pycache__/models.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f44b857848c9e1cd5802fdd8a2238fb2b95b8ad0 GIT binary patch literal 6439 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 delta 68 zcmZo@U}{*vI6+#Fm4Sf)gkgYrqK>f$D}!FVEHD2L1{OXk27X@toqY9tn-v3=^KO>n Pd!@LUCE*YMq67f|h^h`z diff --git a/lib/models.py b/lib/models.py index 2681bee5a..bd0be9a3b 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,29 +1,113 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref +from sqlalchemy.orm import relationship, sessionmaker from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import create_engine +# Name convention for foreign keys convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", } metadata = MetaData(naming_convention=convention) +# Basing class for declarative models Base = declarative_base(metadata=metadata) +# Database URL and session setup +DATABASE_URL = 'sqlite:///freebies.db' # SQLite database URL +engine = create_engine(DATABASE_URL, echo=True) # echo=True to log SQL queries +Session = sessionmaker(bind=engine) +session = Session() + + +# Company Model class Company(Base): __tablename__ = 'companies' id = Column(Integer(), primary_key=True) - name = Column(String()) - founding_year = Column(Integer()) + name = Column(String(), nullable=False) + founding_year = Column(Integer(), nullable=False) + + # Relationships + freebies = relationship('Freebie', backref='company', cascade="all, delete-orphan") + devs = relationship('Dev', secondary='dev_freebies', backref='companies') def __repr__(self): + return f'' + @classmethod + def oldest_company(cls): + + return session.query(cls).order_by(cls.founding_year).first() + + def give_freebie(self, dev, item_name, value): + + freebie = Freebie(dev_id=dev.id, company_id=self.id, item_name=item_name, value=value) + session.add(freebie) + session.commit() + + +# Dev Model class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) - name= Column(String()) + name = Column(String(), nullable=False) + + # Relationships + freebies = relationship('Freebie', backref='dev', cascade="all, delete-orphan") def __repr__(self): + return f'' + + 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.dev_id == self.id: + freebie.dev_id = dev.id + session.commit() + + +# Freebie Model +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer(), primary_key=True) + item_name = Column(String(), nullable=False) + value = Column(Integer(), nullable=False) + dev_id = Column(Integer(), ForeignKey('devs.id'), nullable=False) + company_id = Column(Integer(), ForeignKey('companies.id'), nullable=False) + + def __repr__(self): + + return f'' + + def print_details(self): + + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" + + +# Association Table for Many-to-Many Relationship (Dev <-> Company) +class DevFreebies(Base): + __tablename__ = 'dev_freebies' + + dev_id = Column(Integer(), ForeignKey('devs.id'), primary_key=True) + company_id = Column(Integer(), ForeignKey('companies.id'), primary_key=True) + + # Relationships (optional, if you want to access directly) + dev = relationship('Dev', backref='dev_freebies') + company = relationship('Company', backref='dev_freebies') + + +# Initialize the database (create tables) +def initialize_db(): + + Base.metadata.create_all(engine) + + +if __name__ == "__main__": + initialize_db() diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..b607f4377 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,61 @@ -#!/usr/bin/env python3 +from models import Company, Dev, Freebie, session, initialize_db -# Script goes here! +def create_companies(): + + companies = [ + Company(name="TechCorp", founding_year=1999), + Company(name="DevGoods", founding_year=2005), + Company(name="WebSolutions", founding_year=2010) + ] + return companies + + +def create_devs(): + + devs = [ + Dev(name="Alice"), + Dev(name="Bob"), + Dev(name="Charlie") + ] + return devs + + +def seed_freebies(companies, devs): + + # Company1 gives freebies to Alice and Bob + companies[0].give_freebie(devs[0], "T-Shirt", 10) + companies[0].give_freebie(devs[1], "Mug", 5) + + # Company2 gives freebies to Alice and Charlie + companies[1].give_freebie(devs[0], "Laptop Bag", 25) + companies[1].give_freebie(devs[2], "T-Shirt", 10) + + # Company3 gives freebies to Bob and Charlie + companies[2].give_freebie(devs[1], "Notebook", 15) + companies[2].give_freebie(devs[2], "Laptop", 100) + + +def seed(): + + # Initializing database (create tables if they don't exist already) + initialize_db() + + # Creating and add companies and developers + companies = create_companies() + devs = create_devs() + + # Adding companies and devs to session + session.add_all(companies + devs) + session.commit() + + # Assigning freebies + seed_freebies(companies, devs) + + # Commiting session to save changes to the database + session.commit() + + print("Database seeded successfully!") + + +if __name__ == "__main__": + seed() diff --git a/lib/your_database.db b/lib/your_database.db new file mode 100644 index 000000000..e69de29bb