{"id":18869339,"url":"https://github.com/codersales/portfolio_project_5_v4","last_synced_at":"2026-02-28T11:02:02.415Z","repository":{"id":50521538,"uuid":"518992399","full_name":"CoderSales/portfolio_project_5_v4","owner":"CoderSales","description":null,"archived":false,"fork":false,"pushed_at":"2026-02-13T20:12:08.000Z","size":11790,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-14T03:28:26.610Z","etag":null,"topics":["bootstrap","code","django","ecommerce","ecommerce-website","not-jupyter","portfolio-project","python","web-development"],"latest_commit_sha":null,"homepage":"","language":"HTML","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/CoderSales.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-07-28T20:56:43.000Z","updated_at":"2026-02-13T20:12:10.000Z","dependencies_parsed_at":"2025-04-11T11:22:17.423Z","dependency_job_id":"68ad6aba-de84-416b-91d1-82bde496235c","html_url":"https://github.com/CoderSales/portfolio_project_5_v4","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":"Code-Institute-Org/gitpod-full-template","purl":"pkg:github/CoderSales/portfolio_project_5_v4","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderSales%2Fportfolio_project_5_v4","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderSales%2Fportfolio_project_5_v4/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderSales%2Fportfolio_project_5_v4/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderSales%2Fportfolio_project_5_v4/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CoderSales","download_url":"https://codeload.github.com/CoderSales/portfolio_project_5_v4/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderSales%2Fportfolio_project_5_v4/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29931048,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T09:58:13.507Z","status":"ssl_error","status_checked_at":"2026-02-28T09:57:57.047Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["bootstrap","code","django","ecommerce","ecommerce-website","not-jupyter","portfolio-project","python","web-development"],"created_at":"2024-11-08T05:16:30.430Z","updated_at":"2026-02-28T11:02:02.378Z","avatar_url":"https://github.com/CoderSales.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Introduction\nPortfolio_Project_5_v4 is an E-commerce website built using the Python/Django Framework to sell Musical Instruments.\n\n-[am I responsive](https://ui.dev/amiresponsive)\n- ![Responsiveness of site across devices](/media/README_images/am_I_responsive_compressed.png)\n\n\n\n\n# References\n- [contact form in Django](https://ordinarycoders.com/blog/article/build-a-django-contact-form-with-email-backend)\n\n# Tutorials\n- [Contact Pages in Django - Python Django Dentist Website #6](https://www.youtube.com/watch?v=w4ilq6Zk-08\u0026ab_channel=Codemy.com)\n- [How To Send Email With Django - Python Django Dentist Website #7](https://youtu.be/xNqnHmXIuzU?t=41)\n\n# Git commit messages\n- [How to write multiline git commit messages](https://youtu.be/MOfBw3eGC08?t=167)\n\n-[Property Shark](https://www.propertyshark.com/cre/commercial-property/us/ny/brooklyn/kings-plaza-1/)\n\n- [Google Maps](https://www.google.com/maps/place/733+Third+Avenue/@40.7528964,-73.9722049,17z/data=!4m5!3m4!1s0x89c25902bb24e511:0xdcddc05af1f5f54f!8m2!3d40.7528964!4d-73.9722049)\n\n- [responsive Google Maps](https://blog.duda.co/responsive-google-maps-for-your-website)\n\n- [footer](https://www.foolishdeveloper.com/2021/09/responsive-footer-design.html)\n\n# Django Docs:\n-[template inheritance](https://docs.djangoproject.com/en/dev/topics/templates/#template-inheritance)\n\n# Technologies used:\n- [find unclosed html tags](https://www.aliciaramirez.com/closing-tags-checker/)\n- [black.vercel.app Black v22.6.0 - The uncompromising Python code formatter.](https://black.vercel.app/?version=stable\u0026state=_Td6WFoAAATm1rRGAgAhARYAAAB0L-Wj4APbAX1dAD2IimZxl1N_Wm_NXb2Os8irB1MDqzQDcQtisNWJvDnFDNHhUDbG_J14txUsT_cq67-JL-tIMEdhLUx59fJBtgkYugEKAX3fOkFkoE5PXN-eW11nCGaaeFErI_10l0QEGyiGAmQZEAXwS7GaFy9Ul0MuTyjpaD9_cwI-B2i9qCx0mQpryLQQUQy-O7AaS37gGmhJaS8twO7U5fJF4bYV0sSM6xF5F9-bbL5Nci0D_qsaC6Kbabxx0K4c6hSv3oSNXwg0zTQYktluZUAWNOQz5EwSwx91rifAwvg4bBYdvcPvvRU_EsRbHdhaf5rDwGdV7xoGxUQsWqCUZ0JPE1yUaLaIh1NuxrdCR304ii3WZizFGhEhe6RlSh6KFVFa2lmgRjR3lcR6D6N4fqrtsjf9mH8IhpQrlVANQncrzK6qmIzNtYxg7Px6N6pSGuIArkin51B6QzlqQcSDQhA1T4y8931h-Ia913xyu7dO7rz6znJl-C_lCyZk6TuzdlCCAAAAAABFZlemHWB38wABmQPcBwAAIvlR17HEZ_sCAAAAAARZWg==)\n- [heroku](https://www.heroku.com/)\n- [AWS S3](https://aws.amazon.com/)\n- [GitPod](https://www.gitpod.io/)\n- [GitHub](https://github.com/)\n- [Visual Studio Code](https://code.visualstudio.com/)\n- [Code Institute](https://codeinstitute.net/global/)\n- [Bootstrap](https://getbootstrap.com/)\n\n\n# Django and Packages\n- [Django](https://www.djangoproject.com/)\n- [Django allauth](https://django-allauth.readthedocs.io/en/latest/installation.html)\n- [Django countries](https://pypi.org/project/django-countries/)\n- [dj-database-url](https://pypi.org/project/dj-database-url/)\n- [django-crispy-forms](https://django-crispy-forms.readthedocs.io/en/latest/)\n- [django-storages](https://django-storages.readthedocs.io/en/latest/)\n- [gunicorn](https://gunicorn.org/)\n- [Pillow](https://pillow.readthedocs.io/en/stable/)\n\n# Other technologies\n- [stripe](https://stripe.com/)\n\n# Repositories\n- [Code-Institute-Solutions / boutique_ado_v1](https://github.com/Code-Institute-Solutions/boutique_ado_v1)\n\n# Bootstrap\n## Footer\n- [Header and footer](https://getbootstrap.com/docs/4.4/components/card/#header-and-footer)\n- [Bootstrap grid examples](https://getbootstrap.com/docs/3.4/examples/grid/) \n- [Bootstrap: Force columns to stack up vertically on mobile (responsive design)](https://stackoverflow.com/questions/29825427/bootstrap-force-columns-to-stack-up-vertically-on-mobile-responsive-design)\n\n# How do urls work\n[urls - Django Documentation](https://docs.djangoproject.com/en/4.0/topics/http/urls/)\n\n# Bug \n## Error:\n- [ModuleNotFoundError: No module named 'contact.urls'](https://www.google.com/search?q=ModuleNotFoundError%3A+No+module+named+%27contact.urls%27\u0026oq=ModuleNotFoundError%3A+No+module+named+%27contact.urls%27\u0026aqs=chrome..69i57j69i58.10334j0j7\u0026sourceid=chrome\u0026ie=UTF-8)\n## Reference\n- [Stackoverflow - No module named urls](https://stackoverflow.com/questions/2353416/no-module-named-urls)\n\n# import settings to views.py in contact app\n- [How to pass a variable from settings.py to a view?](https://stackoverflow.com/questions/3984648/how-to-pass-a-variable-from-settings-py-to-a-view)\n- [Using settings in Python code](https://docs.djangoproject.com/en/dev/topics/settings/#using-settings-in-python-code)\n\n# Media References\n(Note: image links are also in products/fixtures/products.json)\n- [clarinet-hd-compressed.png](https://cdn.pixabay.com/photo/2016/11/29/17/14/clarinet-1870572_960_720.png)\n- [flute-hd-compressed.png](https://cdn.pixabay.com/photo/2015/08/18/12/43/flute-893911_960_720.jpg)\n- [guitar-hd-compressed.png](https://images.unsplash.com/photo-1514649923863-ceaf75b7ec00?ixlib=rb-1.2.1\u0026ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8\u0026auto=format\u0026fit=crop\u0026w=1887\u0026q=80)\n- [harmonica-c-major-hd-compressed.png](https://cdn.pixabay.com/photo/2015/02/18/20/23/harmonica-641425_960_720.jpg)\n- [saxophone-hd-compressed.png](https://cdn.pixabay.com/photo/2016/07/24/16/28/saxophone-1538743_960_720.png)\n- [trombone-hd-compressed.png](https://toppng.com/show_download/121237/trombone-png/large)\n- [alt link to trombone image with embeddable script](https://toppng.com/trombone-png-PNG-free-PNG-Images_121237)\n- [trumpet-hd-compressed.png](https://images.unsplash.com/photo-1573871669414-010dbf73ca84?ixlib=rb-1.2.1\u0026ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8\u0026auto=format\u0026fit=crop\u0026w=1887\u0026q=80)\n- [tuba-bb-hd-compressed.png](https://flyclipart.com/john-packer-bb-tuba-tuba-png-439710)\n- [violin-hd-compressed.png](https://images.unsplash.com/photo-1612225330812-01a9c6b355ec?ixlib=rb-1.2.1\u0026ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8\u0026auto=format\u0026fit=crop\u0026w=870\u0026q=80)\n\n# Ignoring Errors with Flake8\n- Used in portfolio_project_5_v4/urls.py on last line, as the command ```# noqa: F811,E501``` [Ignoring Errors with Flake8](https://flake8.pycqa.org/en/3.1.1/user/ignoring-errors.html)\n# Note on dependabot security update\nAs per the LMS Tutorial which mentioned incorporating dependabot \nsecurity updates, one of the options given was\nto simply merge the pull request from the \ndependabot which only added 3 characters to the \nproject \".14\" to update Django from 3.2 to 3.2.14\nso that the project was no longer susceptible\nto what were deemed by the bot to be\ncritical security vulnurabilities\nallowing the potential\nfor SQL injection.\nHowever, the tutorial mentioned that this would not be applicable here,\nbut since issued the severity had increased, so it \nwas decided to merge the pull request,\nwhich led to 2 contributors being listed\non the project\ni.e. the first being the author and\nthe second being the dependabot\n(for adding \".14\" to the requirements.txt file on a single merge commit).\n[commit 0218233861c9ce95cf75731a46a584361da3a17f Showing 1 changed file with 1 addition and 1 deletion.](https://github.com/Coder731/portfolio_project_5_v4/commit/0218233861c9ce95cf75731a46a584361da3a17f)\nIn a previous trial run at this project, the commit was done manually,\nwhich did not result in the dependabot being listed as a contributor,\nso it was quite surprising when\naccept security update was selected\nthat dependabot was listed \nas a contributor.\n\n# ToDo / Further work:\n## Testing\n\n## Unfinished elements\nDue to time constraints:\n- the review model needs more refinement.\n- ideally edit button would handle the issue\nof one review per customer.\n\n## SEO\nmeta tags\n\n## Marketing\nFacebook\n\n## Add link to contact app\n\n\n# Reference for todo app\n- used for todo  app [Django To Do List App With User Registration \u0026 Login](https://youtu.be/llbtoQTt4qw?t=237\n\n# Testing\n\nthe following sites are working on the local site:\n[/todo/](https://8000-coder731-portfolioproje-cy03inats4r.ws-eu59.gitpod.io/todo/)\n[/todo/task/1/](https://8000-coder731-portfolioproje-cy03inats4r.ws-eu59.gitpod.io/todo/task/1/)\n[/todo/task/2/](https://8000-coder731-portfolioproje-cy03inats4r.ws-eu59.gitpod.io/todo/task/2/)\n[/contact/](https://8000-coder731-portfolioproje-cy03inats4r.ws-eu59.gitpod.io/contact/)\n\nthe following sites have been tested on the heroku deployed app:\n[/products/](https://portfolio-project-5-v4.herokuapp.com/products/)\n[]()\n\n# Bug Fixed\nWas having an issue where by all pages were giving 500 errors with deployed and local images not showing.\n\n## Problem Statement\nI have run migrations at least once today as I added two or three new models but now images are not showing on local at all except for background and not in individual product views on heroku, with the latter giving a 500 error.\n\n\n## Attempts\nI discovered the issue on my local so I ran another deploy on heroku to see if it was just a local issue but now the individual products are not showing there either I am not sure what to do. I have not yet tried rolling back migrations.\n\nRedeploy heroku\n\n## Solution:\n\nrerun the commands:\n\npython3 manage.py loaddata categories\npython3 manage.py loaddata products\n\nadd DEVELOPMENT = 1 variable temporarily to herokku config vars\n\nrun \nheroku login -i\n\nrun \nheroku run python3 manage.py migrate --app herokuprojectappname\n\n\n# Marketing\n\n## Facebook\n- [Facebook page for a business](https://sproutsocial.com/insights/facebook-business-page-guide/)\n\n# Deployment\n## Reference\n\n## Heroku\n\nHeroku notices python app as this files is in root folder:\n- requirements.txt\nThis allows the Python buildpack to proceed. \n- [Deploying Python and Django Apps on Heroku](https://devcenter.heroku.com/articles/deploying-python)\n\n\n## AWS\nFollowed Code Institute Deployment Tutorials and Changes sheet.\n\nAmazon Web services was used to host media and static files.\n\nS3 used.\n\nChanges to AWS deployment:\nOn create bucket:\nACLs enabled, allowing objects in bucket to be owned by AWS accounts.\n\nObject ownership:\nBucket owner preferred option selected.\n\nUnder S3 bucket settings:\nThe new page is scrollable as opposed to the old one where you click through each option.\nProperties tab \u003e scroll to bottom of page \u003e static website hosting\nPermissions tab \u003e 3 settings.\n\n## The Cross-origin resource sharing (CORS) section\nThe following was pasted into the CORS section:\n\n```\n[\n    {\n        \"AllowedHeaders\": [\n            \"Authorization\"\n        ],\n        \"AllowedMethods\": [\n            \"GET\"\n        ],\n        \"AllowedOrigins\": [\n            \"*\"\n        ],\n        \"ExposeHeaders\": []\n    }\n]\n\n```\n\n## Bucket Policy\n\n\n## ACL Access control list\nenabled \nList \nfor\nEveryone (public access)\n\n- Accepted warning box\n\nAt this point a disabled edit button would have indicated\nObject Ownership needed to be changed to ACLs enabled.\n\nAccess Control List (ACL)\nboth list and write options under Objects column were selected.\nboth read and write options under Bucket ACL column were selected.\n\nUnder Objects column: List  was enabled \n\n## Identity and Access Management (IAM)\n### Create group\nUser groups selected on side bar\n### Create policy\nClicked Button to go to next page to add tags.\nEven though tags were  not used, \nthis step is necessary to get to \nthe review policy page.\n\n### Attach policy\nOn sidebar User Groups clicked.\nGroup selected.\n#### Permissions tab\nOpened add permissions dropdown\n\n# SEO\nSearch Engine Optimisation\n\n## Reference\n- [Growing Your Small Business Through Search Engine Optimization](https://youtu.be/681m2QGIF8c?t=32)\n\n3 steps:\n1. see where website ranks cueerntly online\n2. looking where competitors rank\n3. Finding the right keywords and search phrases that your target customers tend to use on a daily basis.\n\n## Reference\n- I noticed this was a good Readme to try and learn from specifically for SEO. [Clay and fire GitHub repo](https://github.com/SamanthaBooth81/clay_and_fire)\n\n## Methodology\n\nIn Google I searched:\nmusical instruments\nmusical instruments stores\nmusical instruments stores online\nbuy musical instruments\n    found:\n    - this used the terms Gear and marketplace [reverb](https://reverb.com/)\n- [gear for music](https://www.gear4music.com/)\n\n\nfrom this I searched:\nmusical instrument gear shop store online\norchestral musical instrument gear shop store online\n\n# Further information on SEO\n- google search [How our Quality Raters make Search results better](https://support.google.com/websearch/answer/9281931?hl=en)\n- [google search quality guidelines](https://static.googleusercontent.com/media/guidelines.raterhub.com/en//searchqualityevaluatorguidelines.pdf)\n\n# SEO theory\nshort tail vs long tail keywords\nshort more competitive\nless focused\n\n# Further keyword research\nother keywords less directly applicable that the user may use in which this site for musical instruments may turn up\n\nmusical instrument lessons\nlearning a musical instrument\nhow to play instruments\nlistening to music\ncomposers\nmusical analysis\n\n## Other considerations\nWhat are questions that potential customers have?\nWhat are other things they will go online for? \n\nAuto complete for search phrases or keywords\n\nFurther search terms \n- musical instrument online buy\n\nSelection based on relevance authority and volume\n\nEliminate generic words\n\neliminate search terms inclined to look for results which which speak from a place of authority, as this ecommerce store is unlikely to compete with that.\nunlikely to work:\nbest musical instrument store\ntop 10 musical instrument stores\nwhere is the best place to buy musical instruments\n\n# Keyword volume\nwant ideally high volume low competition keywords\n\n## Reference\n[WordTracker.com]\nsearched musical instrument buy\nresults:\n\nstring order guitar\nsaxophones for sale\nclarinets for sale\nused drum sets for sale\nprice of violin\nprice of guitar\nharmonicas for sale\npedal order guitar\nbuy guitar\n\ntrending in last month\n\nof these the following are relevant:\nstring, guitar, saxophones, clarinets, violin, harmonicas, buy\n\nfrom this search \"buy violin\" seems to have high volume and low competition.\n\n\n[Google Keyword planner]\n\n# Testing\n -[Basic Unit Testing in Django](https://youtu.be/DmRpNoQEx2o?t=14)\n - [Testing in Django](https://www.google.com/search?q=automated+django+testing\u0026oq=automated+django+testing\u0026aqs=chrome..69i57j0i22i30l2j0i390l3.3311j0j7\u0026sourceid=chrome\u0026ie=UTF-8)\n\n # robots.txt\n - [Introduction to robots.txt](https://developers.google.com/search/docs/advanced/robots/intro#:~:text=txt-,A%20robots.,or%20password%2Dprotect%20the%20page.)\n\n # Deployment note\nIn settings.py, Debug set to False so that excess information used in Development is not presented in production, for security.\n\n# Credits\n## README\n- For structure [README.so](https://readme.so/editor)\n- For SEO [Clay and fire GitHub repo](https://github.com/SamanthaBooth81/clay_and_fire)\n## Tutorials\n### Django\n- [Boutique Ado](https://github.com/Code-Institute-Solutions/boutique_ado_v1)\n\n- Used for task managemment [YouTrack](https://coder731.youtrack.cloud/newIssue?project=C731\u0026draftId=2-59)\n## Validators\n- [Markup Validation Service](https://validator.w3.org/)\n\n# Reference\n- [Adding images to README](https://stackoverflow.com/questions/14494747/how-to-add-images-to-readme-md-on-github)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodersales%2Fportfolio_project_5_v4","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodersales%2Fportfolio_project_5_v4","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodersales%2Fportfolio_project_5_v4/lists"}