{"id":13579764,"url":"https://github.com/codingforentrepreneurs/eCommerce","last_synced_at":"2025-04-05T23:32:22.494Z","repository":{"id":37612335,"uuid":"105310456","full_name":"codingforentrepreneurs/eCommerce","owner":"codingforentrepreneurs","description":"We're going to take you step-by-step to build a modern, fully open-source, eCommerce web application using Python, Django, Bootstrap, Javascript, and more. ","archived":false,"fork":false,"pushed_at":"2024-06-14T07:05:13.000Z","size":1169,"stargazers_count":1649,"open_issues_count":28,"forks_count":907,"subscribers_count":139,"default_branch":"master","last_synced_at":"2025-04-03T20:08:43.684Z","etag":null,"topics":["ajax","bootstrap","bootstrap4","card","cart-model","custom-queryset","django","django1-11","ecommerce","jquery","jquery-ajax","lookup","mailchimp","python","python3-6","stripe"],"latest_commit_sha":null,"homepage":"http://www.codingforentrepreneurs.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codingforentrepreneurs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-09-29T19:40:58.000Z","updated_at":"2025-04-03T09:22:10.000Z","dependencies_parsed_at":"2023-01-25T01:30:42.465Z","dependency_job_id":"e110ee2f-3ade-478d-aab0-b72830ef943b","html_url":"https://github.com/codingforentrepreneurs/eCommerce","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2FeCommerce","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2FeCommerce/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2FeCommerce/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2FeCommerce/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codingforentrepreneurs","download_url":"https://codeload.github.com/codingforentrepreneurs/eCommerce/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247415793,"owners_count":20935383,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ajax","bootstrap","bootstrap4","card","cart-model","custom-queryset","django","django1-11","ecommerce","jquery","jquery-ajax","lookup","mailchimp","python","python3-6","stripe"],"created_at":"2024-08-01T15:01:42.824Z","updated_at":"2025-04-05T23:32:22.487Z","avatar_url":"https://github.com/codingforentrepreneurs.png","language":"Python","readme":"# eCommerce\n\n[![eCommerce Logo](https://cfe2-static.s3-us-west-2.amazonaws.com/media/courses/ecommerce/images/ecommerce_coding_for_entrepreneurs.jpg)\n](https://www.codingforentrepreneurs.com/courses/ecommerce/)\n\nThis course will teach you step-by-step to build a eCommerce site from scratch. We'll be using open-source software to create each aspect of a fully functioning eCommerce business.\n\nFull Course is here: [https://www.joincfe.com/courses/ecommerce/](https://www.joincfe.com/courses/ecommerce/)\n\nBelow you'll find the related lecture code to any given section and lesson. Enjoy!\n\n\n# Code\n\n### Section - Hello World\n\n[Intial Commit](../../tree/0927b316e9cdd8b0db01263b6b429e698d38d57a/)\n\n\n### Section - Products Component\n\n[1 - Your first app Module](../../tree/ed8ceb52830b762d50bbf44f680255168c6f5530/)\n\n[2 - Understanding CRUD](../../tree/aaa75b9c3ffba674e3661175922b99149fd4bdd9/)\n\n[3 - Product Model](../../tree/a80ded7e6ed9a87da9a8029e4e6fe50c18fd4b79/)\n\n[4 - Django Admin](../../tree/311291431e55a783532ff3cd9319e22d77ff92c0/)\n\n[5 - List View](../../tree/ab27c4cc095ae00d51b71545cf6118813c12828f/)\n\n[6 - Detail View](../../tree/b7343749415fb9a6a6a629859684f13a0afbf787/)\n\n[7 - ImageField \u0026 FileField](../../tree/08a2426622b6536de6ae16637cc9489eeda5e484/)\n\n[8 - Understanding Lookups](../../tree/6a1116a90d9c24ca4366a3764b20de61a83f52ac/)\n\n[9 - Custom Model Managers](../../tree/f146e4775cb274176897f8e06d842150599aa3c5/)\n\n[10 - Featured \u0026 Custom QuerySets](../../tree/8f7cf0ea87b89672f1ca745a251de32598ff5754/)\n\n[11 - SlugField \u0026 Signals](../../tree/dc523d5e9aa18a730edd9819c6202fd3ecc20de7/)\n\n[12 - Products URLs](../../tree/959a578bd51964af2a637e2d75423568a8d7972b/)\n\n\n\n### Section: Templates\n\n[1 Base Template](../../tree/b34bc1692301719be722bb691c1d67df4e98b455/)\n\n[2 - Include Tag](../../tree/12fd4dd9fcd8616b7b71d8c93a60013aa01350d9/)\n\n[3 Pass Arguments with Include](../../tree/f68b6c15804033937d823f6a707df363901fd6a1/)\n\n[4 - Reusable List View Snippets](../../tree/e59e0938d032e68431c60718f27bfa2abbbd36b0/)\n\n[5 - Reverse for URLs](../../tree/4add77ea1751952f79aaf358bcfecac366ad6ac2/)\n\n[6 - Navbar](../../tree/fc97ee8fd094a47aeb47ad7b25cf2d5a04c78fe8/)\n\n[7 - Template Filters](../../tree/670ddd0ec4cec879a424fe05ac594e863b7dea53/)\n\n[8 - ForLoop Counter \u0026 Cycle](../../tree/e47bec09440f7938246c4b9210bd3f131d290dd0/)\n\n\n\n### Section: Bootstrap\n\n1 - Adding Bootstrap (no code)\n\n2 - Container vs Container-Fluid (no code)\n\n[3 - Rows And Columns](../../tree/d0e38edee652c5787dc7bf12e2ec2909fa3121f8/)\n\n[4 - Column Sizing](../../tree/b06f0a6661ac37d71be3fe38580bb561f71d2e42/)\n\n[6 - Desinging for Different Browser Sizes with Breakpoints](../../tree/225b29ccbff4aa3098e58d34a434dda495f7fb53/)\n\n[7 - Spacing with Margin \u0026 Padding](../../tree/e2eb9bc70e33b4870e87554a81bdee9179f0136d/)\n\n[8 - Navbar](../../tree/696987b4e9144296f681fb229e3420219f9a1026/)\n\n[10 - Integrate to Django](../../tree/6aa47a5627c5f57b3fca3cb52738c96609cc3746/)\n\n\n\n### Section: Search Component\n\n[1 - A Basic Search View](../../tree/28aa4043b5ad94a3095ddf3b77fd81a429803ff4/)\n\n[2 - Display the Query to the User](../../tree/e499a814c144497145c689be5626e175b2cd9a6d/)\n\n[3 - Creating the Search Form](../../tree/147efe3fae7b35702050b3f27907c13379a3f85d/)\n\n[4 - Better Lookups with Q](../../tree/54e65447fd0cd9b269c76ac1c9739af9cb1cd7ce/)\n\n[5 - Tag Component](../../tree/883d856330fe86d0ad697fa9cfebf19454b163be/)\n\n[6 - Shell Commands for a Brief Intro to Foreign Keys](../../tree/a85117d052ceaa054f1b025613bbbc46695ea0c0/)\n\n[7 - Search by Related Model](../../tree/908e3e07bc2e3ec5f157f6a06f59ad01395b4a2d/)\n\n\n\n\n### Section: Cart Component\n\n[1 - Cart App](../../tree/ab6ba98698080e5290f0c72e94edc6ebea229a4e/)\n\n[2 - Django Sessions](../../tree/4b2544743e5b3c650231cf10f8f4ba3f85e10382/)\n\n[3 - Cart Model](../../tree/0441dc0e50937eaec64bafa4f9258de70db7efc9/)\n\n[4 - Create A Cart in the View](../../tree/35e8bf075b51d32a7c0fcc1c191700736d64edfc/)\n\n[5 - Cart Model Manager](../../tree/3f9592bd3209ae09d5aa839c87356d7c1c6bc1bd/)\n\n[5 - Cart Model Manager Part 2](../../tree/20368456287ce253d2b51c7f4d2101f52ceb4d35/)\n\n[7 - M2M Changed Signal to Calculate Cart Total](../../tree/c64ba909c1b6af3b5b0502412eef20857cdaa25a/)\n\n[8 - Cart Update View](../../tree/864ef942a2331669d0a1c2385431688888916b22/)\n\n[9 - Add to Cart Form](../../tree/d5cced3c944f39164a36b4ef122ba2369006fc92/)\n\n[10 - Display Cart](../../tree/248c772322547fc7b331fa042627285f67a233a1/)\n\n[11 - Remove Items from the Cart](../../tree/3d7c0fc7fe264eded57ce3244e3ee86d1550a966/)\n\n[12 - Cart Icon \u0026 FontAwesome](../../tree/691d5ae69e2b5a8f569be0ede3efd5c9fc7897d3/)\n\n\n\n### Section: Checkout Process\n\n[1 - The Roadmap for the Checkout Process](../../tree/14bb24d788f96cb5e8593084428de5dcc0bc43b7/)\n\n[2 - The Order Component](../../tree/e3edacb39b6b5df4ee0b98297df42909784f86c3/)\n\n[3 - Generate the Order ID](../../tree/cfcc598dd86ce7ba795641f7520b58cf21c2e4de/)\n\n[4 - Calculate the Order Total](../../tree/00a2b87d1bfc671d62514679881cbccd62bc2494/)\n\n[5 - Checkout View](../../tree/40e7c81aa1dc18b1878c6097e486624b5163bc83/)\n\n[6 - Math with Decimals and Floats in Python](../../tree/3baac51bf5bf9fe1d1432d140fbdb5de0e3a6752/)\n\n[7 - Upgrading Auth to Prep for Checkout](../../tree/182d7a5da10a5799ca7c053849f39cba426a84eb/)\n\n[8 - Billing Profile Model\"](../../tree/3dd97d4cee6c4540410fda0006768bff523e9970/)\n\n[9 - Billing Profile in the Checkout View](../../tree/c0ff6dfdc8991c9a54889a616c327420f1d12939/)\n\n[10 - Guest Checkout Profile](../../tree/e4114e17297c3c437f1cd7e50d7f01e716d1af09/)\n\n[11 - Associate Billing Profile to Order](../../tree/b920068b6d80245344ab424f1e1b33a4e54888e4/)\n\n[12 - Order Manager](../../tree/a0e30cbe85971622c10e8d1bbf930dbaa78695d9/)\n\n[13 - Billing Profile Manager](../../tree/91bf2029c4da79168513dd12fe8ef2f6ac7e18e6/)\n\n[14 - Addresses App](../../tree/159d284645e99feedf94ce5b3693b4a28994c6d8/)\n\n[16 - Associate Addresses to Order](../../tree/3cee508cfe5228a45a919066bbf3bc14c23e824b/)\n\n[17 - Finalize Checkout](../../tree/f38442a8b770d0cea454280fd997a60b712d57ea/)\n\n[18 - Reuse Addresses for Checkout](../../tree/0ba33ba8e29482ed86ea2fe4a956bf7be01e05dd/)\n\n[19 - Checkout Success](../../tree/648e281ed5a8fff4fdf3d9959e0d32ec232a6624/)\n\n\n### Section: Fast Track to Jquery\n[1 - Getting Started](../../tree/bb9938c039d604ab39696ec166210f72edc2521e/)\n\n[2 - A Basic Selector](../../tree/5640cc849c8db492e1d98cc6070b7efb9c6c201c/)\n\n[3 - Selectors Part 2](../../tree/4cd3edb60b092c996de5a5812e007568ac898979/)\n\n[4 - Content Overflow Part 1](../../tree/bcbfb9973673f2d22e1c1af094d7e722237a2652/)\n\n[5 - Data Types, Iteration and Conditionals](../../tree/ec9b8d3277cea37b225ce81e68d00bd46745f5d7/)\n\n[6 - Content Overflow Part 2](../../tree/d4b8fedec4d61d3d6c1f442505c76b43ee613a70/)\n\n[7 - Click Events](../../tree/13c278c521032f6266e411bef97ad996b501379b/)\n\n[8 - Handling form data in jQuery](../../tree/69201626395880675420d187f55744f6a3c267ca/)\n\n\n\n### Section: Products \u0026 Async\n\n1 - Sync vs Async (no code)\n\n[2 - Ajax-ify a Form](../../tree/1d4d7ca41f515f4c12fed183023fde22463d8058/)\n\n[3 - Handle Ajax in Django with JsonResponse](../../tree/d6acdc28e52f47257afb4c4b3dc6e5f398f39e43/)\n\n[4 - Cart Item Count](../../tree/9455685b79a7ba829799d6dc700dce71c930c5d3/)\n\n[5 - Refresh Cart Ajax](../../tree/dba7c5401106c658a4a29729a1d5fb5efa596c2f/)\n\n[6 \u0026 7 - Refresh Cart Ajax Part 2 \u0026 3](../../tree/7f38a87f80d0c9a32e7e10149af1b19e8aa3d362/)\n\n[8 - Finalize Cart Updating with Ajax](../../tree/c16e30dbd9af01fddef5614f3857de4a7fcace3b/)\n\n[8 - Finalize Cart Updating with Ajax](../../tree/2072edc9f0451a8d9c88e0c6c9394310234331a8/)\n\n[9 - Auto Search](../../tree/c433c4a06ab3d0d199e4a46b390cc98a0328bad1/)\n\n[10 - Display Errors with jQuery Confirm](../../tree/ab040383aeed92a5ab457d25320fc1dddf72bc5d/)\n\n[11 - Ajaxify the Contact Form Part 1 \u0026 2](../../tree/cc35747ceba808fd57350eaf59e51f95a7b091c4/)\n\n[13 - Custom eCommerce JS](../../tree/3431064fde1394e586076b23ba76827e03d626ce/)\n\n[14 - Ajax CSRF Security for Django](../../tree/82111856925f0d9a83eb08c0e937a95ca788d641/)\n\n\n## Add Ons\n\n### Custom Django User Model\n\n1 - Before we get started (no code)\n\n[2 - Create the Abstract Base User](../../tree/c698e75c82b6145546c93f8d32fec616dfaf1cac/)\n\n[3 - Create the User Model Manager](../../tree/968ec0525e27c3d95f9fc033833264437f90a47b/)\n\n4 - Change Auth User Model to our Custom Model (no code)\n\n[5 - Reload the Database with Fixtures](../../tree/96261517bc1e4c7b2603232569de479ae4c44a9d/)\n\n[6 - Forms \u0026 Admin for our Custom User](../../tree/464ff60dd57e8babf0096670f6bb5c62bdaa2e2c/)\n\n[7 - Add a Required Field to the User Model](../../tree/c12eebf5e8c5961b18f65f8741880f40f6cfc99b/)\n\n[8 - Update Login \u0026 Register Forms](../../tree/aefcaac8eb1f4f0d7e6f68dde46eb9f82f7e5ff7/)\n\n[9 - Login \u0026 Register Views](../../tree/3cccc2c44b9d81fcc4db4ed9bae77a8e23cf263e/)\n\n\n\n### Custom Analytics\n\n1 - Getting Started (No Code)\n\n[2 - Craft the Object Viewed Model](../../tree/dcea55fce60dcb56dc933fc0485a95a5a44b0c9d/)\n\n[3 - Get Client IP Address](../../tree/007dd5190b872ef32ab8164efd7631f7bef3a409/)\n\n[4 - A Custom Signal](../../tree/540a9e1f29e896c3145ead7231d76960031bb2c9/)\n\n[5 - Object Viewed Mixin](../../tree/73bfc3e04beee52b9ad6cd503d3b7c8d8ebeb71e/)\n\n[6 - Handle the Object Viewed Signal](../../tree/73bfc3e04beee52b9ad6cd503d3b7c8d8ebeb71e/)\n\n[7 - Handling and Ending User Sessions](../../tree/4c08919bb151553b150b94ae51825517bc2cd460/)\n\n### Stripe Integration\n\n[1 - Getting Started](../../tree/249af4dcc7cbc5496aa0ebca17c3a501021cb5e2/)\n\n[2 - Create Stripe Customer](../../tree/0a835b238f834758ba54db1c6d4978f517dccdc6/)\n\n[3 - Payment Method View \u0026 Stripe JS](../../tree/08aab3440a89cea22be0a1053b106b49d8d52f08/)\n\n[4 - Improving Payment Method Form](../../tree/ca4245aabaacc0f3c0f7e6e77902f0312a30686e/)\n\n[5 - Improving Payment Method Form Part 2](../../tree/0ff716c8a8bda2605cf349b19705d46798bb5d1b/)\n\n[6 - Reusable Stripe Module](../../tree/291073b86363a63cb588305e9c258dddc5cad949/)\n\n[7 - Add Card to Customer with Stripe](../../tree/1193c2a22da5e591aca057a4f153fdc3388c23fd/)\n\n[8 - Save Card in Django](../../tree/606f73653342ce361400a8fdddd8f0d917d6552f/)\n\n[9 - Charge the Customer](../../tree/0d4fba2c11c8bf3d4b116c4e619ffb6c41a161de/)\n\n[10 - Putting it All Together](../../tree/252524c4b46a2bad8da4cc000af0234a0227cf11/)\n\n[11 - Guest Card Checkout](../../tree/78924c3cc4ed3f3ed809a69d40a9320f423e5676/)\n\n[12 - Changing Payment Methods](../../tree/90830de29bd3bfcf948527b2fd456f27be37e14c/)\n\n[13 - Improve Card UI - Part 1](../../tree/c1a67d9c6d1c29065d1b09a771e14a7b5a0e8fc2/)\n\n[14 - Improve Card UI - Part 2](../../tree/c1a67d9c6d1c29065d1b09a771e14a7b5a0e8fc2/)\n\n### Mailchimp Integration \n\n[3 - Setup API Keys](../../tree/f540e03ebff55371f40b971d7fed439d5af886bf/)\n\n[4 - Marketing App](../../tree/4de0f03100f566797a6ac3a2de6b7764169aad24/)\n\n[5 - Mailchimp Class Part 1](../../tree/7ac2eb8e4d747fe7cc4e94c2f01ad87da9b01395/)\n\n[6 - Mailchimp Class Part 2](../../tree/26cd4fe4c3b3b1dff4426aae260578a551c5854a/)\n\n[7 - Mailchimp Class Part 3](../../tree/08dfcb3f273e0993c935372b91b5a47e66ac77c1/)\n\n[8 - Django \u0026 Mailchimp](../../tree/128499e857cf64b03a64106eb808b7177d272400/)\n\n[9 - User Email Marketing Preference View](../../tree/73756bab33f261106b9489afe1815f8a6377126e)\n\n[10 - Mailchimp Webhook Handler](../../tree/a6d88a985e21dcd926acf7fb06808459493ff0b9)\n\n\n### Go Live\n\n1 - Local vs Production Environments (no code)\n\n[2 - New Settings Module](../../tree/f776fc8227c5717b7982274d5de2a12676ab835b/)\n\n[3 - Multiple Settings Modules](../../tree/95542fffb0f225e281557d9616fb8caae85f1a06/)\n\n[4 - Prepare for HTTPs](../../tree/b772608670c45d6654a84b6b0dd014bd6cacc104/)\n\n[5 - The gitignore File](../../tree/0dc38fd34caa8c82850cbab6509b7357b53d904e/)\n\n[6 - Requirements File](../../tree/aaad5cda6f3a3170b6b9430d97db11e84ff191c2/)\n\n[7 - Setup Git Version Control](../../tree/f65d67029ebad9a22f6e63ef66170e533a385f2e/)\n\n[8 - Deploy to Heroku](../../tree/a2041155d977f6d0451aa6220fec0f664bc0cb06/)\n\n[9 - AWS S3 for Static Files](../../tree/90044ca398bbe3b06440d937dc7ea0a645ec593b/)\n\n[10 - Add Custom Domain \u0026 HTTPs on Heroku](../../tree/3689bfcd72670fa59ceaa864d58927f2c2fc53d7/)\n\n[11 - Live Environment Variables](../../tree/e3210c4ae568e5e1e48a1d70ad2e9b67cf83aa63/)\n\n[12 - Error Views and Templates](../../tree/764a8acba104c60676d83574baf7c0c0806501ad/)\n\n[13 - Setup Email to Help Solve Server Errors](../../tree/b151d182dc5ae1e380c2959a09a8eb6e2fe2fcc8/)\n\n[14 - Using Heroku Locally](../../tree/6c24c03aaf84a4fb02d9cc855815ab0e581798ff)\n\n\n### Account \u0026 Settings\n\n[1 - User Account Home](../../tree/e56ea8420170c40b420780a48cbf1087a5081525/)\n\n[2 - Naming \u0026 Dropdown](../../tree/dc1dd608ef6407d11b4d5b5e2784220fbe8d1ff4/)\n\n[3 - Account Bootstrap Cards](../../tree/c07ba032b597191f043a4ac9cd75d10ee840afcb/)\n\n[4 - Link Account Bootstrap Cards](../../tree/287fbca8d84c1a9112e6cb3adeba1c8a15693fcc/)\n\n[5 - Password Reset and Change](../../tree/55d62beec3b7374e955df8b9b6e6ddbde5997abc/)\n\n[6 - send_email and get_template](../../tree/e3c86dec0b7b985c8b1d403786d0f7a201f2767b/)\n\n[7 - Email Activation](../../tree/30f9aa0d6605014b52f80b85d139597ef6b0fcf6/)\n\n[8 - Custom QuerySet for Confirmable Activations](../../tree/4fe792b8d5e868a813f8b521cda2660fe61048ed/)\n\n[9 - Email Activation View](../../tree/0904726b55184994ac180bc0c0d55edb2a97feaa/)\n\n[10 - Email Reactivation](../../tree/3b9e78cece5c834043bd41b319a78109badf2253/)\n\n[11 - Improved Login Form \u0026 View](../../tree/359119ff0efdb482ec1e6133877ef251e3a4ebf5/)\n\n[12 - Login Form for Confirmation Emails](../../tree/a7f53f7598259f711f62957a4588dc187895e07d/)\n\n[13 - Upgrading the Guest Checkout Form](../../tree/58cac4150c5c5b724feb2f92e795ded4c162e7df/)\n\n[14 - Edit Account Details](../../tree/c471c3a04f46e7b851197de6a217fa6a68ec67b7/)\n\n[15 - User Product History View](../../tree/e50e38a7f01c9348866a92e8c7e2e772ba229763/)\n\n[16 - Orders \u0026 Order Detail](../../tree/e92f5c4ac8413fc9988510b0889a5a582cbae462/)\n\n[17 - Final Addresses on Order](../../tree/d076db0f36de01abe10e0474ac09606e33800c44/)\n\n[18 - Addresses List View](../../tree/065d6e0fd246aa1510b835d6eb6bf732e104fc8d/)\n\n[19 and 20 - Update \u0026 Create Addresses Part 1 \u0026 2](../../tree/a89b4cd06d42648b7920a301d7c70969838b9732/)\n\n### Selling Digital Items\n\n[1 - Digital Products \u0026 Cart](../../tree/69f842b8e19470eba122a5566a2da5d23880d388/)\n\n[2 - Shipping-less Checkout](../../tree/14cae3f833034abaf0190259851a09a40efdbc65/)\n\n[3 - Product Purchases](../../tree/49bb74466bd5da3464c2cb608d150336ac2eba48/)\n\n[4 - Handling Products Being Purchased](../../tree/3cfa6c4d7ffbbd83b8246fc7984bb0f8bb448ea9/)\n\n[5 - Display of Refunded Items](../../tree/c2d95bcf338b69eec962cff6aa92a409ad204ec3/)\n\n[6 - Library View](../../tree/4d1f98e4c81c9229945a1a3342297b4f52e680d1/)\n\n[7 - Library View for Products Only](../../tree/f1e3b4618699c73034e1ac85f4bf27ba4025879a/)\n\n[8 - Product File Model](../../tree/1e74caa60b3b6f52ced214a5169e111ac8399e2a/)\n\n[9 - Changing File Field Storage to Protected Location](../../tree/a7cfdd8849d8bc22d78f1ce565b653ba32967262/)\n\n[10 - Download Product File Part 1](../../tree/e3463e00d6257726d77dcf3ad72caa77e89ed1db/)\n\n[11 - Download Product File Part 2](../../tree/91cb57960416e4ab5701f0a2cc4e7b158f47985f/)\n\n[12 - Perform the File Download](../../tree/6d92ca188e18eca8d4d4b7e1b017a010300e8c11/)\n\n[13 - Checking Download Permissions](../../tree/fe631500b7a4f69ab48b513cbf5d5be89d5a5e5c/)\n\n[14 - In Library Display Part 1](../../tree/4f1b64f1df2b67d98bf8a0d81dc57947409ad2ea)\n\n[15 - In Library Display Part 2 with Ajax](../../tree/46be780b0f0dd524d6eb4bbea63c9f0b2c4b9b7c)\n\n[16 - AWS S3 File Upload](../../tree/96d664722a95dab2895313ef3731c84093d3596d/)\n\n[17 - Fixing the Upload Path](../../tree/75c4e175bf0c4516a6ee91e2f1a7280f998ba6bd/)\n\n[18 - Creating the AWS Download Class](../../tree/d1d5cb5820d813a87d184b9eb2c34b0ff54d3c76/)\n\n[19 - Using the AWS Download Client](../../tree/a879fcc03d0225e343212b17d4c6dcb43578fdc7/)\n\n[20 - A Custom Filename](../../tree/ed23c9b95d7b84de9447bcfbeacfd35d4cfdcd08/)\n\n\n### Graphs and Sales\n\n[1 - Setup the View](../../tree/2b65b93648d4211e64cc02022a0988a96ac53b9f/)\n\n[2 - Add Context for the Order Data](../../tree/f6e5671c5c9170f3e0fdd3427acb0c49b3f60751/)\n\n[3 - Intuitive Recent Order Total](../../tree/50326ef1c082d7bcdbe9351938043b4af28f68b7/)\n\n[4 - Aggregate \u0026 Annotate](../../tree/0438bd0af6b4559fd1b80b9456a32e5b2262c6d4/)\n\n[5 - Get Data by Custom QuerySet](../../tree/8bdec3c85ec8b3a842816efbc4d80223a6d862dd/)\n\n[6 - Intro to Datetime Module](../../tree/b9f8bb1775c8037326ba3a095a224a88cf6a0775/)\n\n[7 - Filter by Range of Time](../../tree/0a8a304296f926ad0bba4fa66dff566b7e20ecbb/)\n\n[8 - Chart-js Intro](../../tree/bd9c8861e58feb5dc2ce13103a1aa21c29e7638b/)\n\n[9 - Using Ajax to Render Charts](../../tree/a60c2fb9476111de483a5fcda4c7262a10f66392/)\n\n[10 - Display True Data](../../tree/dd8a626fbb6dc43efc0799f652a808f03b7542f8/)\n\n[11 - Cleanup](../../tree/fe478427f789ff2ed9110e8e3739d6e9975fe714/)\n\n[12 - Inline Js to External](../../tree/f827bac20fc98a85ff84232ed3ea4ec4ea877f56/)\n","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodingforentrepreneurs%2FeCommerce","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodingforentrepreneurs%2FeCommerce","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodingforentrepreneurs%2FeCommerce/lists"}