{"id":28383971,"url":"https://github.com/lmcrean/coach-matrix","last_synced_at":"2026-05-09T09:39:12.008Z","repository":{"id":215960103,"uuid":"713381836","full_name":"lmcrean/Coach-Matrix","owner":"lmcrean","description":"a multi-user blog for professionals working in education, built with Django and PostgreSQL","archived":false,"fork":false,"pushed_at":"2025-03-18T17:22:51.000Z","size":2466,"stargazers_count":0,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-30T08:15:41.435Z","etag":null,"topics":["cloudinary","django","fullstack-development","heroku","javascript"],"latest_commit_sha":null,"homepage":"http://coachmatrix.org","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/lmcrean.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":"2023-11-02T12:07:43.000Z","updated_at":"2025-03-18T17:22:55.000Z","dependencies_parsed_at":"2025-01-20T20:25:15.564Z","dependency_job_id":"9fd4b886-dab5-4dac-bbc2-c6eb78222a00","html_url":"https://github.com/lmcrean/Coach-Matrix","commit_stats":null,"previous_names":["lmcrean/coach-matrix"],"tags_count":0,"template":true,"template_full_name":"Code-Institute-Org/gitpod-full-template","purl":"pkg:github/lmcrean/Coach-Matrix","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmcrean%2FCoach-Matrix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmcrean%2FCoach-Matrix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmcrean%2FCoach-Matrix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmcrean%2FCoach-Matrix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lmcrean","download_url":"https://codeload.github.com/lmcrean/Coach-Matrix/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmcrean%2FCoach-Matrix/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261962199,"owners_count":23236885,"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":["cloudinary","django","fullstack-development","heroku","javascript"],"created_at":"2025-05-30T07:38:27.003Z","updated_at":"2026-05-09T09:39:11.965Z","avatar_url":"https://github.com/lmcrean.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Coach Matrix \u003c!-- omit in toc --\u003e\n\nCoach Matrix is an open-source CPD platform for educators to connect and share knowledge.\n\n## Table of Contents \u003c!-- omit in toc --\u003e\n\n\n- [1. Features](#1-features)\n- [2. User Stories reviewed against UX Planes and Manual Testing](#2-user-stories-reviewed-against-ux-planes-and-manual-testing)\n- [3. Automatic Testing](#3-automatic-testing)\n- [4. Issues and Bugs](#4-issues-and-bugs)\n- [5. Acknowledgement and credits](#5-acknowledgement-and-credits)\n\n***\n- [1. Features](#1-features)\n  - [1.1. User Posts Questions which can be answered and voted ](#11-user-posts-questions-which-can-be-answered-and-voted-)\n  - [1.2. Questions have tags which can be found through the filter view ](#12-questions-have-tags-which-can-be-found-through-the-filter-view-)\n  - [1.3. User Posts Answers to Questions](#13-user-posts-answers-to-questions)\n  - [1.4. User votes for both questions and answers  ](#14-user-votes-for-both-questions-and-answers--)\n  - [1.5. Toggle Sort content by highest vote vs newest post  ](#15-toggle-sort-content-by-highest-vote-vs-newest-post--)\n  - [1.6. Landing Page with login and sign up tabs ](#16-landing-page-with-login-and-sign-up-tabs-)\n  - [1.7. User creates, reads and deletes bookmarks. ](#17-user-creates-reads-and-deletes-bookmarks-)\n  - [1.8. User updates Authentication details ](#18-user-updates-authentication-details-)\n  - [1.9. Navbar ](#19-navbar-)\n  - [1.10. Footer ](#110-footer-)\n  - [1.11. About Page ](#111-about-page-)\n  - [1.12. Error Messages ](#112-error-messages-)\n- [2. User Stories reviewed against UX Planes and Manual Testing](#2-user-stories-reviewed-against-ux-planes-and-manual-testing)\n  - [2.1. Strategy plane](#21-strategy-plane)\n  - [2.2. Scope plane](#22-scope-plane)\n  - [2.3. Structure plane](#23-structure-plane)\n    - [2.3.1. App Structure](#231-app-structure)\n    - [2.3.2. Models](#232-models)\n    - [2.3.3. Forms](#233-forms)\n    - [2.3.4. Views](#234-views)\n    - [2.3.5. Templates](#235-templates)\n    - [2.3.6. URLPatterns](#236-urlpatterns)\n    - [2.3.7. Static Files](#237-static-files)\n    - [2.3.8. JavaScript Front-End Logic](#238-javascript-front-end-logic)\n  - [2.4.  Skeleton plane](#24--skeleton-plane)\n    - [2.4.1. Skeleton Plane Acceptance Criteria](#241-skeleton-plane-acceptance-criteria)\n    - [2.4.2. Early Wireframes using Figma](#242-early-wireframes-using-figma)\n    - [2.4.3. Feature drafting with CodePen](#243-feature-drafting-with-codepen)\n    - [2.4.4. CSS Skeleton Testing](#244-css-skeleton-testing)\n    - [2.4.5. HTML Bootstrap Testing](#245-html-bootstrap-testing)\n  - [2.5. Surface plane](#25-surface-plane)\n    - [2.5.1. Surface Plane acceptance criteria](#251-surface-plane-acceptance-criteria)\n    - [2.5.2. CSS Surface Testing](#252-css-surface-testing)\n    - [2.5.3. FontAwesome](#253-fontawesome)\n    - [2.5.4. Media Surface Testing](#254-media-surface-testing)\n- [3. Automatic Testing and Deployment](#3-automatic-testing-and-deployment)\n  - [3.1. Browserstack testing](#31-browserstack-testing)\n  - [3.2. Lighthouse testing](#32-lighthouse-testing)\n  - [3.3. Deployment to Heroku](#33-deployment-to-heroku)\n  - [3.4. Deployment from Heroku to coachmatrix.org](#34-deployment-from-heroku-to-coachmatrixorg)\n  - [3.5. Python Validation with PEP8 guidelines](#35-python-validation-with-pep8-guidelines)\n  - [3.6. HTML Validation with W3C guidelines](#36-html-validation-with-w3c-guidelines)\n  - [3.7.](#37)\n- [4. Issues and Bugs](#4-issues-and-bugs)\n  - [4.1. \"Cannot Access Django-Admin Panel on Port.\"](#41-cannot-access-django-admin-panel-on-port)\n  - [4.2. \"IntegrityError When Adding Social Application in Django: Null Value in Column ‘Provider\\_id.’\"](#42-integrityerror-when-adding-social-application-in-django-null-value-in-column-provider_id)\n  - [4.3. \"Cannot Delete ‘Forgot Password?’ On Sign in Page. Seems Completely Unresponsive to Code.\"](#43-cannot-delete-forgot-password-on-sign-in-page-seems-completely-unresponsive-to-code)\n  - [4.4. \"Cannot Access Django-Admin Panel on Port.\"](#44-cannot-access-django-admin-panel-on-port)\n  - [4.5. \"Django NoReverseMatch Error for ‘questions’ View After Google OAuth Sign-In.\"](#45-django-noreversematch-error-for-questions-view-after-google-oauth-sign-in)\n  - [4.6. \"Social Login Expects to Lead to Questions.Html via Django Urlpatterns, Instead Leads to Home Page.\"](#46-social-login-expects-to-lead-to-questionshtml-via-django-urlpatterns-instead-leads-to-home-page)\n  - [4.7. \"Django QuestionForm in Forms.Py Not Creating Instance in Questions.Html.\"](#47-django-questionform-in-formspy-not-creating-instance-in-questionshtml)\n  - [4.8. \"Django taggit view leading to FieldError: Related Field got invalid lookup: name\"](#48-django-taggit-view-leading-to-fielderror-related-field-got-invalid-lookup-name)\n  - [4.9. \"profile\\_update\\_form does not update field correctly, print logs suggest issue with redundant if statement](#49-profile_update_form-does-not-update-field-correctly-print-logs-suggest-issue-with-redundant-if-statement)\n  - [4.10. \"Tag instances via django-taggit are not rendering as expected in update post form.\"](#410-tag-instances-via-django-taggit-are-not-rendering-as-expected-in-update-post-form)\n- [5. Acknowledgement and credits](#5-acknowledgement-and-credits)\n  - [5.1. Coding Languages](#51-coding-languages)\n  - [5.2. Frameworks, Libraries and Programs](#52-frameworks-libraries-and-programs)\n    - [5.2.1. Front-end modules](#521-front-end-modules)\n    - [5.2.2. Back-end modules](#522-back-end-modules)\n    - [5.2.3. Large Language Models](#523-large-language-models)\n  - [5.3. Deployment and IDE](#53-deployment-and-ide)\n  - [5.4. UX Software](#54-ux-software)\n  - [5.5. Resources](#55-resources)\n  - [5.6. Personal Acknowledgements](#56-personal-acknowledgements)\n\n\n\n# 1. Features\n\nThe following features were implemented, tested and debugged throughout the development process. Many of them are tightly interwoven e.g. Users Post Questions with Tags.\n\n## 1.1. User Posts Questions which can be answered and voted \u003c!-- omit in toc--\u003e\nUsers can post questions, which can be edited and deleted. \n\n## 1.2. Questions have tags which can be found through the filter view \u003c!-- omit in toc--\u003e\n\nTags are used throughout the programme. Users can add tags to their questions. Users can also filter for questions by tag.\n\n##  1.3. User Posts Answers to Questions\u003c!-- omit in toc--\u003e\n\nUsers can post answers in response to questions, which can be edited and deleted.\n\n##  1.4. User votes for both questions and answers  \u003c!-- omit in toc--\u003e\n\nUsers can upvote and downvote both questions and answers\n\n##  1.5. Toggle Sort content by highest vote vs newest post  \u003c!-- omit in toc--\u003e\n\nThe user can toggle between sorting content by highest vote vs newest post. The default is highest vote. This applies to both questions and answers. Answers also provides a toggle to sort by oldest post, so they can get a sense of the narrative.\n\n##  1.6. Landing Page with login and sign up tabs \u003c!-- omit in toc--\u003e\n\nThe landing page provides a brief description of the site and a call to action to sign up. It also provides a link to the questions page. It features appealing animations and a video background. \n\nDynamic Tabs are used to toggle between sign in and sign up.\n\nFor Accessibility an option to pause the video is provided.\n\nFor surface appeal dynamic animations are included, including a custom CSS logo.\n\n## 1.7. User creates, reads and deletes bookmarks. \u003c!-- omit in toc--\u003e\n\nThe user can bookmark questions. This is particularly useful for questions that the user wants to return to later.\n\n## 1.8. User updates Authentication details \u003c!-- omit in toc--\u003e\n\nThe user can update their profile. This includes updating their username and password.\n\n##  1.9. Navbar \u003c!-- omit in toc--\u003e\n\nThe navbar provides all the important links to the landing page, questions page, and the user's profile. It also provides a link to sign in and sign out.\n\nA custom CSS Logo is included in the navbar.\n\n\n##  1.10. Footer \u003c!-- omit in toc--\u003e\n\nThe footer provides links to the developer's social media and a link to the developer's portfolio.\n\n## 1.11. About Page \u003c!-- omit in toc--\u003e\n\nThe About Page provides a brief description of the site and introduces the developer. It also links to this README and the developer's portfolio.\n\n## 1.12. Error Messages \u003c!-- omit in toc--\u003e\n\n\nCustom error messages are used to provide feedback to the user.\n\n\n# 2. User Stories reviewed against UX Planes and Manual Testing\n\n## 2.1. Strategy plane\n\nThe key strategy in this project was to use a Manual Testing Spreadsheet that would establish \n- the user stories\n- the acceptance criteria that would be used to establish the feature as implemented\n- the validation criteria that would be used to establish the feature as working under \"high-stress\" conditions e.g. a user trying to break the site.\n- the design criteria that would be used to establish the feature as visually appealing and engaging to the target audience. This was generic for all features.\n- Track Progress using ✅ for TRUE and ❌ for FALSE in the validation criteria.\n\nFull testing can be reviewed here:\nhttps://docs.google.com/spreadsheets/d/1tii97g0Q4bVVvkrn_llrX8nOc_N2EyoOecOuMOEYFz0/edit?usp=sharing\n\n***\n\n\u003cdetails\u003e\n\u003csummary\u003eManual Testing PASSED Spreadsheet\u003c/summary\u003e\n\n![testing](assets/media/testing.png)\n\n![testing](assets/media/testing2.png)\n\n\u003c/details\u003e\n\n\u003cbr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eNot Yet Implemented Spreadsheet\u003c/summary\u003e\n![testing](assets/media/testing3.png)\n\u003c/details\u003e\n\n***\n\nDiscarded strategies included using a Todoist Kanban board and a large 900x1200mm whiteboard with a 3x3 grid. The spreadsheet was chosen as it was both the most efficient way to track progress while also able to carry the most accurate information for the developer.\n\n## 2.2. Scope plane\n\nBased on the user stories above, the following features were prioritised which you can see in the [features section](1-features) above.\n\n## 2.3. Structure plane\n\nThe structure plane was particularly important with this project and are best summarised through the framework of Django:\n\nStructure contents:\n- [App Structure](#231-app-structure)\n- [Models](#232-models)\n- [Forms](#233-forms)\n- [Views](#234-views)\n- [Templates](#235-templates)\n- [URLPatterns](#236-urlpatterns)\n- [Static Files](#237-static-files)\n- [JavaScript Front-End Logic](#238-javascript-front-end-logic)\n\n### 2.3.1. App Structure\n\nThe app structure was particularly important with this project. The following app structure was concieved.\n\ncoach_matrix was the general project folder with important files being:\n- settings.py holding the django settings for the project, such as installed apps and middleware\n- urls.py holding the urls for the project and linking to the main_forum app\n\ncoach_matrix was the general project folder with important files being settings.py holding the django settings for the project, such as installed apps and middleware and urls.py holding the urls for the project and linking to the main_forum app.\n\nmain_forum was the django app with important files being:\n- models.py holding the database schema\n- forms.py holding the forms such as asking questions and answering questions\n- views.py holding the views for the questions and answers. This was divided into many separate subdirectories and put together in an init.py file.\n- urls.py holding the urls together within the app\n\nmain_forum was the django app with important files being models.py holding the database schema, forms.py holding the forms such as asking questions and answering questions, views.py holding the views for the questions and answers. This was divided into many separate subdirectories and put together in an init.py file, urls.py holding the urls together within the app.\n\nusers was the django app for user authentication with important files being forms.p views.py and urls.py. It included a user model for updating the profile and sign in functionality.\n\n### 2.3.2. Models\n\nThe following diagrams were used to plan the models in `main_forum` and were tested and debugged throughout the development process.\n\nThe Diagrams were divided between User and Question point of view for better readability\n\n**Mermaid Diagram 1: User Point of View**\nBelow illustrates the simplified view of the user model. The user can have a profile, ask questions, write answers, bookmark questions and vote on questions and answers.\n\n```mermaid\nerDiagram\n    User ||--o{ UserProfile : \"has\"\n    User ||--o{ Question : \"can write Many\"\n    User ||--o{ Answer : \"can write Many\"\n    User ||--o{ Bookmark : \"can write Many, 1 per question\"\n    User ||--o{ Vote : \"can write many, 1 per question/answer\"\n    Vote ||--o{ Upvote : \"\"\n    Vote ||--o{ Downvote : \"\"\n\n\n\n    UserProfile {\n        username string\n    }\n\n        Bookmark {\n        created_at datetime\n    }\n\n    Upvote {\n        upvotedate datetime\n    }\n    Downvote {\n        downvotedate datetime\n    }\n\n    Answer {\n        slug string\n        created_on datetime\n        status int\n        name string\n        email string\n        body text\n        approved boolean\n        answercount int\n        featured_image image\n    }\n\n    Question {\n        subject string\n        created_on datetime\n        status int\n        updated_on datetime\n        content text\n        answercount int\n        views int\n        net_votes int\n    }\n```\n***\n\n**Mermaid Diagram 2: Question Point of View**\nBelow illustrates the relationship between questions and answers. A question can have many answers, and both a quesiton and an answer can have many votes.\n\n```mermaid\nerDiagram\n    Question ||--o{ Answer : \"can recieve many from any User\"\n    Question ||--o{ Upvote : \"can receive 1 from any User\"\n    Question ||--o{ Downvote : \"can receive 1 from any User\"\n    Question ||--o{ Bookmark : \"can receive 1 from User (private)\"\n\n    Answer ||--o{ Upvote : \"can receive 1 from any User\"\n    Answer ||--o{ Downvote : \"can receive 1 from any User\"\n\n\n\n    Bookmark {\n        created_at datetime\n    }\n\n    Upvote {\n        upvotedate datetime\n    }\n    Downvote {\n        downvotedate datetime\n    }\n\n    Answer {\n        slug string\n        created_on datetime\n        status int\n        name string\n        email string\n        body text\n        approved boolean\n        answercount int\n        featured_image image\n    }\n\n    Question {\n        subject string\n        created_on datetime\n        status int\n        updated_on datetime\n        content text\n        answercount int\n        views int\n        net_votes int\n    }\n```\n\n***\n\n**Methods used:**\n\n| model method | description | example | documentation-link for Django 4.1 |\n| --- | --- | --- | --- |\n| class-based models | models that are classes, these are particularly useful for models that require a lot of methods  | Question | https://docs.djangoproject.com/en/4.1/topics/db/models/ |\n| meta class | a class within a class that provides metadata for the model | Meta class for the question model | https://docs.djangoproject.com/en/4.1/ref/models/options/ |\n| __str__ | a method that returns a string representation of the object | __str__ for the question model | https://docs.djangoproject.com/en/4.1/ref/models/instances/#django.db.models.Model.__str__ |\n| ForeignKey | a field that links to another model | ForeignKey for the question model | https://docs.djangoproject.com/en/4.1/ref/models/fields/#foreignkey |\n| ManyToManyField | a field that links to another model with a many-to-many relationship | ManyToManyField for the question model | https://docs.djangoproject.com/en/4.1/ref/models/fields/#manytomanyfield |\n| CharField | a field for storing a string | CharField for the question model | https://docs.djangoproject.com/en/4.1/ref/models/fields/#charfield |\n| TextField | a field for storing a large amount of text | TextField for the question model | https://docs.djangoproject.com/en/4.1/ref/models/fields/#textfield |\n| DateTimeField | a field for storing a date and time | DateTimeField for the question model | https://docs.djangoproject.com/en/4.1/ref/models/fields/#datetimefield |\n| IntegerField | a field for storing an integer | IntegerField for the question model | https://docs.djangoproject.com/en/4.1/ref/models/fields/#integerfield |\n| SlugField | a field for storing a slug | SlugField for the question model | https://docs.djangoproject.com/en/4.1/ref/models/fields/#slugfield |\n| save method | a method that saves the object | save method for the question model | https://docs.djangoproject.com/en/4.1/ref/models/instances/#django.db.models.Model.save |\n| super method | a method that calls the parent class method | super method for the question model | https://docs.djangoproject.com/en/4.1/ref/models/instances/#django.db.models.Model.save |\n| count method | a method that counts the number of objects | count method for the question model | https://docs.djangoproject.com/en/4.1/ref/models/querysets/#count |\n| related_name | a field that provides a name for the reverse relation | related_name for the question model | https://docs.djangoproject.com/en/4.1/ref/models/fields/#django.db.models.ForeignKey.related_name |\n| @reciever | a decorator that connects a signal to a function | @reciever for the question model | https://docs.djangoproject.com/en/4.1/ref/signals/#django.dispatch.receiver |\n| ordering | a field that orders the queryset | ordering for the question model | https://docs.djangoproject.com/en/4.1/ref/models/options/#ordering |\n| instance | a method that returns the instance of the object | instance for the question model | https://docs.djangoproject.com/en/4.1/ref/models/instances/#django.db.models.Model.instance |\n\n\n### 2.3.3. Forms\n\nThe following forms were used.\n\n| form method | description | example | documentation-link for Django 4.1 |\n| --- | --- | --- | --- |\n| class-based forms | forms that are classes, these are particularly useful for forms that require a lot of methods  | QuestionForm | https://docs.djangoproject.com/en/4.1/topics/forms/ |\n| save method | a method that saves the object | save method for the question form | https://docs.djangoproject.com/en/4.1/ref/models/instances/#django.db.models.Model.save |\n| clean method | a method that cleans the form | clean method for the question form | https://docs.djangoproject.com/en/4.1/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other |\n| __init__ method | a method that initialises the form | __init__ method for the question form, This is for checking if the form is bound to an existing instance, i.e. if the form is being used to update an existing question | https://docs.djangoproject.com/en/4.1/ref/forms/api/#django.forms.Form.__init__ |\n\n### 2.3.4. Views\n\nNumerous views were used in main_forum and users and were split into seperate folders. There were many important methods used in the views.\n\n| function method | description | example | documentation-link for Django 4.1 |\n| --- | --- | --- | --- |\n| class-based views | views that are classes, these are particularly useful for views that require a lot of methods  | QuestionDetail View | https://docs.djangoproject.com/en/4.1/topics/class-based-views/ |\n| get_context_data | gets the context data for the view | get_context_data for the question detail view | https://docs.djangoproject.com/en/4.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_context_data |\n| get_queryset | gets the queryset for the view | get_queryset for the question detail view | https://docs.djangoproject.com/en/4.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_queryset |\n| get_object_or_404 | gets the object or returns a 404 error | get_object_or_404 for the question detail view | https://docs.djangoproject.com/en/4.1/topics/http/shortcuts/#get-object-or-404 |\n| get | retrieves a page | get request for questions page | https://docs.djangoproject.com/en/4.1/ref/request-response/#django.http.HttpRequest.GET |\n| post | sends data to the server | post request for asking a question | https://docs.djangoproject.com/en/4.1/ref/request-response/#django.http.HttpRequest.POST |\n| form_valid | checks if the form is valid | form_valid for asking a question | https://docs.djangoproject.com/en/4.1/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.form_valid |\n| form_invalid | checks if the form is invalid | form_invalid for asking a question | https://docs.djangoproject.com/en/4.1/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.form_invalid |\n| get_success_url | gets the success url | get_success_url for asking a question | https://docs.djangoproject.com/en/4.1/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin.get_success_url |\n| test_func | checks if the user is allowed to access the view | test_func for the question detail view | https://docs.djangoproject.com/en/4.1/ref/class-based-views/mixins-permission/#django.views.generic.detail.SingleObjectMixin.test_func |\n\n| return method | description | example | documentation-link for Django 4.1 |\n| --- | --- | --- | --- |\n| return | returns a page | return for asking a question | https://docs.djangoproject.com/en/4.1/ref/request-response/#django.http.HttpResponse |\n| return render() | renders a page | render for the questions page | https://docs.djangoproject.com/en/4.1/topics/http/shortcuts/#render |\n| return redirect | redirects to a page | redirect for asking a question | https://docs.djangoproject.com/en/4.1/topics/http/shortcuts/#redirect |\n| return Model.objects.filter() | filters the queryset | .objects.filter() for the questions page | https://docs.djangoproject.com/en/4.1/topics/db/queries/#retrieving-specific-objects-with-filters |\n| return self.request.user | returns the user | self.request.user for the question detail view | https://docs.djangoproject.com/en/4.1/ref/request-response/#django.http.HttpRequest.user |\n| return self.get_object() | returns the object | self.get_object() for the question detail view | https://docs.djangoproject.com/en/4.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_object |\n\n| general method | description | example | documentation-link for Django 4.1 |\n| --- | --- | --- | --- |\n| class-based views | views that are classes, these are particularly useful for views that require a lot of methods  | QuestionDetail View | https://docs.djangoproject.com/en/4.1/topics/class-based-views/ |\n\n\n\n\u003c!-- | put | updates data | put request for updating a question | https://docs.djangoproject.com/en/4.1/ref/request-response/#django.http.HttpRequest.PUT | --\u003e\n\u003c!-- | delete | deletes data | delete request for deleting a question | https://docs.djangoproject.com/en/4.1/ref/request-response/#django.http.HttpRequest.DELETE | --\u003e\n\n### 2.3.5. Templates\n\nThe following templates were used the hyperlinks were summarised in this diagram.\n\ntemplates was the folder for seperate html templates, some of which were imported from django-allauth\n- base.html was the master template with the head links, navbar and footer. It also linked to the master css file and the js files. It appears on every page.\n- other file names are more self-explanatory such as questions.html and question_detail.html\n\n| template method | description | example | documentation-link for Django 4.1 |\n| --- | --- | --- | --- |\n| extends | extends a template | extends for the questions page | https://docs.djangoproject.com/en/4.1/ref/templates/builtins/#extends |\n| block | defines a block | block for the questions page | https://docs.djangoproject.com/en/4.1/ref/templates/builtins/#block |\n| include | includes a template | include for the questions page | https://docs.djangoproject.com/en/4.1/ref/templates/builtins/#include |\n| url | links to a url | url for the questions page | https://docs.djangoproject.com/en/4.1/ref/templates/builtins/#url |\n| static | links to a static file | static for the questions page | https://docs.djangoproject.com/en/4.1/ref/templates/builtins/#static |\n| csrf_token | adds a csrf token | csrf_token for the questions page | https://docs.djangoproject.com/en/4.1/ref/templates/builtins/#csrf-token |\n| form.as_p | renders a form | form.as_p for the questions page | https://docs.djangoproject.com/en/4.1/ref/forms/api/#django.forms.Form.as_p |\n| crispy | renders a form with crispy forms | crispy for the questions page | https://django-crispy-forms.readthedocs.io/en/latest/ |\n| load socialaccount | loads the social account template | load socialaccount for the questions page | https://rdmo.readthedocs.io/en/latest/configuration/authentication/allauth.html#social-accounts |\n| extra_head | adds extra head content | extra_head for the questions page | https://www.ericholscher.com/blog/2008/nov/20/gentlemans-agreement-django-templates/#block-extra-head |\n\n\n### 2.3.6. URLPatterns\n\nThe following URLPatterns were used.\n\n$$$$ INSERT CODE $$$$$\n\n| urlpattern method | description | example | documentation-link for Django 4.1 |\n| --- | --- | --- | --- |\n| path | links to a view | path for the questions page | https://docs.djangoproject.com/en/4.1/ref/urls/#path |\n| name | names a url | name for the questions page | https://docs.djangoproject.com/en/4.1/ref/urls/#name |\n| as_view | calls a view | as_view for the questions page | https://docs.djangoproject.com/en/4.1/ref/class-based-views/base/#django.views.generic.base.View.as_view |\n| int:pk | passes an integer primary key | int:pk for the question detail view | https://docs.djangoproject.com/en/4.1/topics/http/urls/#path-converters |\n| slug:slug | passes a slug | slug:slug for the question detail view | https://docs.djangoproject.com/en/4.1/topics/http/urls/#path-converters |\n\n### 2.3.7. Static Files\n\nstatic was the folder for static files such as css and javascript. This was later hosted on `cloudinary` for deployment using ```dj3-cloudinary-storage```.\n- CSS had a master css file then a separate css file for each html template\n- JS had a separate js files for each html template\n- data was a folder for json files\n- media was a folder for fonts and images. In some instances media files were delegated to cloudinary URL directly, such as a video background on the login page.\n\n### 2.3.8. JavaScript Front-End Logic\n\nJavaScript was used to add front-end logic to the site. This was particularly important for the toggle views between compact and expanded. The following methods were used.\n\nstatic/js/ask_question.js\nstatic/js/bg-logo.js\nstatic/js/login.js\nstatic/js/navbar.js\n\n## 2.4.  Skeleton plane\n\n### 2.4.1. Skeleton Plane Acceptance Criteria\n\nTHe following criteria was used to test the skeleton plane. You can refer back to the [speadsheet](#21-strategy-plane) in the strategy plane to see the progress of the acceptance criteria against the features.\n\n- The feature can be viewed from 300px to 1920px, without unintended results such as:\n    - unintented text overflowing\n    - unintended overlapping\n    - unintended hidden content\n    - unintended large gaps\n    - unintended text sizing\n\nWhere appropriate, the feature is responsive to the screen size, and could split into columns or rows as the screen size decreases. A single column does not fail the acceptance criteria as the site is designed mobile-first,therefore should be responsive to mobile devices.\n\n### 2.4.2. Early Wireframes using Figma\n\nFigma was used to create the early wireframes during the design process, prioritising a mobile-first approach. The wireframes can be found here:\n\nhttps://www.figma.com/file/jXT4Bi1WXVwYG4daO3Yczi/Portfolio-Project-4?type=design\u0026node-id=0%3A1\u0026mode=design\u0026t=0DTJelaO4PzBf99a-1\n\n$$$$$$$$$$$$ SCREENSHOT HERE $$$$$$$$$$$$$$$\n\nThe category feature was omitted from the final design as it was deemed to be too complex. Other omissions included the use of a logo backgrouund and reputation points. These plan to be added in future versions.\n\n### 2.4.3. Feature drafting with CodePen\n\nCodepen was used to draft code snippets in the front-end using bootstrap and css. This platform was chosen for it's efficient interface. \n\nThe codepen collection can be found here:\nhttps://codepen.io/collection/jbEjoo\n\n| Collection | Description | Link |\n|----|---| ---|\n| Master | master CSS files, e.g. colour schemes | https://codepen.io/collection/yrwrJZ |\n| Components | components HTML CSS and JS files | https://codepen.io/collection/jbEjoo |\n\n|Codepen| Description | Link |\n|---|---| ---|\n| Login Page | login page HTML CSS and JS  | https://codepen.io/lauriecrean/pen/wvZqZyZ |\n| Ask Question Page | questions page HTML CSS and JS | https://codepen.io/lauriecrean/pen/rNRYZYK |\n\n### 2.4.4. CSS Skeleton Testing\n\nThe following files were used to test responsivity:\n\n```\nstatic/css/components/about.css\nstatic/css/components/answercard.css\nstatic/css/components/ask_question.css\nstatic/css/components/errors.css\nstatic/css/components/login.css\nstatic/css/components/navbar.css\nstatic/css/components/question_detail.css\nstatic/css/components/votingcard.css\n```\n\n### 2.4.5. HTML Bootstrap Testing\n\nBootstrap was also used throughout the project as an efficient way to use CSS resources.\n\n| bootstrap method | syntax | example | documentation-link for Bootstrap 5.3 |\n| --- | --- | --- | --- |\n| container | `\u003cdiv class=\"container\"\u003e` | container for the questions page | https://getbootstrap.com/docs/5.3/layout/containers/ |\n| row | `\u003cdiv class=\"row\"\u003e` | row for the questions page | https://getbootstrap.com/docs/5.3/layout/grid/ |\n| col | `\u003cdiv class=\"col\"\u003e` |  col for the questions page | https://getbootstrap.com/docs/5.3/layout/grid/ |\n| card | `\u003cdiv class=\"card\"\u003e` |  card for the questions page | https://getbootstrap.com/docs/5.3/components/card/ |\n| modal | `\u003cdiv class=\"modal\"\u003e` |  modal for the questions page | https://getbootstrap.com/docs/5.3/components/modal/ |\n| d-flex | `\u003cdiv class=\"d-flex\"\u003e` |  d-flex for the questions page | https://getbootstrap.com/docs/5.3/utilities/flex/ |\n\n\n## 2.5. Surface plane\n\nThe colour scheme was chosen to be bright and engaging, with a primary colour of dark turqoise.\n\nRoot vars were used to make the colour scheme consistent throughout the site with a more.\n\n### 2.5.1. Surface Plane acceptance criteria\n\nThe following criteria was used to test the surface plane. You can refer back to the [speadsheet](#21-strategy-plane) in the strategy plane to see the progress of the acceptance criteria against the features.\n\n- The feature is designed with an acceptable colour scheme\n - consistent colour scheme with primary, secondary and monochrome colours all defined in the root vars\n - consistent typefaces of Yeseva One and Glacial Indifference\n - consistent design of buttons\n\n### 2.5.2. CSS Surface Testing\n\n```css\n:root {\n    /* Primary Color Variations */\n    --primary-color-lightest: #4dd0e1;\n    /* Lightest shade, closer to 'primary-color-dark' */\n    --primary-color-light: #26c6da;\n    /* Light shade, closer to 'primary-color-dark' */\n    --primary-color-medium: #00acc1;\n    /* Medium shade, closer to 'primary-color-dark' */\n    --primary-color-dark: #009693;\n    /* Unchanged, original dark shade */\n    --primary-color-darkest: #00897b;\n    /* Darkest shade, closer to 'primary-color-dark' */\n\n    /* Secondary Color Variations */\n    --secondary-color-lightest: #ffccbc;\n    /* Lightest shade, closer to 'secondary-color-dark' */\n    --secondary-color-light: #ffab91;\n    /* Light shade, closer to 'secondary-color-dark' */\n    --secondary-color-medium: #ff8a65;\n    /* Medium shade, closer to 'secondary-color-dark' */\n    --secondary-color-dark: #f46b17;\n    /* Unchanged, original dark shade */\n    --secondary-color-darkest: #e64a19;\n    /* Darkest shade, closer to 'secondary-color-dark' */\n\n    /* Monochrome Color Variations */\n    --mono-lightest: #cfd8dc;\n    /* Lightest shade, closer to 'mono-dark' */\n    --mono-light: #b0bec5;\n    /* Light shade, closer to 'mono-dark' */\n    --mono-medium: #90a4ae;\n    /* Medium shade, closer to 'mono-dark' */\n    --mono-dark: #737373;\n    /* Unchanged, original dark shade */\n    --mono-darkest: #546e7a;\n    /* Darkest shade, closer to 'mono-dark' */\n}\n```\n\nAnimations were also used to make the site more engaging, for example in the landing page.\n\nThe logo was also designed by the developer as CSS, as a way to incorperate more dynamic animation on the landing.\n\n### 2.5.3. FontAwesome \n\nFontAwesome was used to add icons throughout the site including.\n\n- The Navbar.\n- Edit and Delete buttons.\n- Bookmark\n- Flag\n\n### 2.5.4. Media Surface Testing\n\nThe media contributed to the surface plane with various vectors and videos.\n\n- the video is a montage of various educational settings, formed from pexels.com and collaged manually using [CapCut](http://capcut.com) and was used for a video background on the landing page.\n- the icons were used from [Canva](http://canva.com)'s vector library permitting educational use. They were used for the voting buttons and the navbar.\n\n\u003c/details\u003e\n\n# 3. Automatic Testing and Deployment\n\n## 3.1. Browserstack testing\n\nBrowserstack was used to test the site on different devices and browsers. \n\nThe following devices were tested:\n\n- iPhone 13\n- Samsung Galaxy S21\n- iPad Pro\n- MacBook Pro\n- Windows 10\n\nThe following browsers were tested:\n- Chrome\n- Firefox\n- Safari\n- Edge\n\n## 3.2. Lighthouse testing\n\nLighthouse was used to test the site for performance, accessibility, best practices and SEO. The following scores were achieved:\n\n| page | lightouse score | mobile/desktop | date |\n| --- | --- | --- |\n| landing |  | mobile |  |\n| landing |  | desktop |  |\n| questions |  | mobile |  |\n| questions |  | desktop |  |\n| question detail |  | mobile |  |\n| question detail |  | desktop |  |\n\n\n\n## 3.3. Deployment to Heroku\n\nThe site was deployed on Heroku. The following steps were taken to deploy the site:\n\n1. Create a requirements.txt file using the following command in the terminal:\n\n    ```bash\n    pip3 freeze --local \u003e requirements.txt\n    ```\n\n2. Create a Procfile using the following command in the terminal:\n\n    ```bash\n    echo web: gunicorn coach_matrix.wsgi:application \u003e Procfile\n    ```\n\n3. Push the requirements.txt and Procfile to GitHub.\n4. Create a new app on Heroku.\n5. Link the app to the GitHub repository.\n6. Set the following config vars in the Heroku settings:\n\n    ```bash\n    CLOUDINARY_API_KEY\n\n   CLOUDINARY_API_SECRET\n\n   CLOUDINARY_CLOUD_NAME\n\n   CLOUDINARY_URL\n\n   DATABASE_URL\n\n   PORT\n\n   SECRET_KEY\n    ```\n\n7. Deploy the app on Heroku.\n\n## 3.4. Deployment from Heroku to coachmatrix.org\n\nThe site was deployed on http://coachmatrix.org. The following steps were taken to deploy the site:\n\n1. aquire the domain from [namecheap](http://namecheap.com)\n2. link the domain to the heroku app using the following DNS settings:\n\n    ```bash\n    CNAME www -\u003e [DNS Target from Heroku e.g. dnsaddress.herokuapp.com]\n    ALIAS @ -\u003e [DNS Target from Heroku e.g. dnsaddress.herokuapp.com]\n    ```\n\n## 3.5. Python Validation with PEP8 guidelines\n\nAll major python models, views and templates were validated through PEP8 style guide on 21st March 2024.\n\nhttps://pep8ci.herokuapp.com/\n\nThe PEP8 style guide ensures that the code is readable and maintainable. Rules include:\n\n- Line length should be less than 79 characters\n- Indentation should be 4 spaces\n- Blank lines should be used to separate functions and classes\n- New lines should be used to separate blocks of code\n- Two spaces should be used before an inline comment\n- No trailing whitespaces at end of code lines\n\n## 3.6. HTML Validation with W3C guidelines\n\nThe landing page was validated through W3C HTML validator on 21st March 2024.\n\nhttps://validator.w3.org/\n\nOther templates are in process of being validated.\n\n## 3.7. \nAll CSS files were validated through W3C CSS validator on 21st March 2024 and passed with no errors.\n\n```\nstatic/css/components/about.css\nstatic/css/components/answercard.css\nstatic/css/components/ask_question.css\nstatic/css/components/errors.css\nstatic/css/components/login.css\nstatic/css/components/navbar.css\nstatic/css/components/question_detail.css\nstatic/css/components/votingcard.css\nstatic/css/animations.css\nstatic/css/colors.css\nstatic/css/interactions.css\nstatic/css/master.css\nstatic/css/styling.css\nstatic/css/typefaces.css\n```\n\n# 4. Issues and Bugs\n\nAll major issues and bugs were documented on StackOverflow, which turned out to be an invaluable learning strategy for debugging.\n\nIn the timeframe of this project it was not practical to migrate the full stackoverflow posts to this README, which would require extra heading formatting. Instead, I have copy and pasted the issue and solution for the first issue, then the following are provided a link to my stackoverflow. \n\n\u003cb\u003eNOTE TO CODE INSTITUTE ASSESSORS: all stackoverflowposts were written in my own words, all stackoverflow posts included a solution documented by myself in my own words\u003c/b\u003e.\n\n## 4.1. \"Cannot Access Django-Admin Panel on Port.\" \n\n“Cannot Access Django-Admin Panel on Port.” Stack Overflow, https://stackoverflow.com/questions/77465837/cannot-access-django-admin-panel-on-port. Accessed 12 Nov. 2023.\n\n\u003cdetails\u003e\u003csummary\u003e\u003ci\u003eissue\u003c/i\u003e\u003c/summary\u003e\n\n### Expecting to be able to access django admin panel and add social accouunt \u003c!-- omit in toc --\u003e\n\nopening admin panel by adding standard `admin/` extension to local preview port URL. This is expected to lead to classic [django admin panel.](https://www.programink.com/static/img/django-admin-login.png)\n\n**going to the admin url instead leads to an [error message](https://i.stack.imgur.com/z4v0U.png)**\n\nthe website is otherwise displaying fine.\n\n*A simple google oath signin is currently being implemented.*\n\n### Error message: \u003c!-- omit in toc --\u003e\n\n```\nDoesNotExist at /admin/login/\nSite matching query does not exist.\nRequest Method:\tGET\nRequest URL:\thttp://8000-lmcrean-project4-avaw7dd1zq8.ws-eu106.gitpod.io/admin/login/?next=/admin/\nDjango Version:\t3.2.23\nException Type:\tDoesNotExist\nException Value:\t\nSite matching query does not exist.\nException Location:\t/workspace/.pip-modules/lib/python3.9/site-packages/django/db/models/query.py, line 435, in get\nPython Executable:\t/home/gitpod/.pyenv/versions/3.9.17/bin/python3\nPython Version:\t3.9.17\nPython Path:\t\n['/workspace/Project-4',\n '/home/gitpod/.pyenv/versions/3.9.17/lib/python39.zip',\n '/home/gitpod/.pyenv/versions/3.9.17/lib/python3.9',\n '/home/gitpod/.pyenv/versions/3.9.17/lib/python3.9/lib-dynload',\n '/workspace/.pip-modules/lib/python3.9/site-packages',\n '/home/gitpod/.pyenv/versions/3.9.17/lib/python3.9/site-packages']\nServer time:\tSat, 11 Nov 2023 15:17:58 +0000\n```\n\n[traceback details in full](https://file.io/haymHM3ANkEI)\n\n### Currently trying to fix with this tutorial \u003c!-- omit in toc --\u003e\n\n“Set up Google Sign-in for Faster Django Login Experience Feat. Tech with Tim.” Akamai DevRel, YouTube Video, 12 Dec. 2022, https://youtu.be/yO6PP0vEOMc?feature=shared\u0026t=1328. Accessed 11 Nov. 2023.\n\n- have followed correctly with all working up to 22 minutes in\n- migration was recently made after setting up urls, views and templates for google oauth as per the tutorial, there were no obvious issues with this\n- before that django-admin panel seemed to be working fine\n\n\n## settings.py and url are likely problem areas \u003c!-- omit in toc --\u003e\n\n\ninstalled apps seems ok on [settings.py - can be viewed here in full](https://file.io/HDZjRjk17k3w)\n\nthis was recently implemented but is correct according to tutorial:\n```\nAUTHENTICATION_BACKENDS = (\n    \"django.contrib.auth.backends.ModelBackend\",\n    \"allauth.account.auth_backends.AuthenticationBackend\"\n)\n```\n\n\nurlpatterns in urls.py\n```\nurlpatterns = [\n    path('admin/', admin.site.urls),\n    path(\"\", include(\"blog.urls\"), name=\"blog-urls\"),\n    path('summernote/', include('django_summernote.urls')),\n    path(\"accounts/\", include(\"allauth.urls\")),\n    path(\"\", include(\"users.urls\"))\n]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003ci\u003esolution\u003c/i\u003e\u003c/summary\u003e\n\nThe error message \"Site matching query does not exist,\" typically occurs in Django when the SITE_ID setting in settings.py refers to a Site object that does not exist in the database.\n\nI managed to debug this with the Python Shell by checking existing site ID.\n\n    from django.contrib.sites.models import Site\n    existing_site = Site.objects.get(domain='http://127.0.0.1:8000')\n    print(existing_site.id)\n\nThe returning statement revealed that the SITE_ID should be 2, not 1 as previously set.\n\nThis was fixed with an update to settings.py to match the correct site ID:\n\n    SITE_ID = 2\n\n[The django admin panel can now be accessed][1] without any further errors.\n\n\n[1]: https://i.stack.imgur.com/GY9LK.png\n\n\u003c/details\u003e\n\n## 4.2. \"IntegrityError When Adding Social Application in Django: Null Value in Column ‘Provider_id.’\" \n“IntegrityError When Adding Social Application in Django: Null Value in Column ‘Provider_id.’” Stack Overflow, https://stackoverflow.com/questions/77466342/integrityerror-when-adding-social-application-in-django-null-value-in-column-p. Accessed 12 Nov. 2023.\n\n## 4.3. \"Cannot Delete ‘Forgot Password?’ On Sign in Page. Seems Completely Unresponsive to Code.\" \n“Cannot Delete ‘Forgot Password?’ On Sign in Page. Seems Completely Unresponsive to Code.” Stack Overflow, https://stackoverflow.com/questions/77427112/cannot-delete-forgot-password-on-sign-in-page-seems-completely-unresponsive. Accessed 12 Nov. 2023.\n\n## 4.4. \"Cannot Access Django-Admin Panel on Port.\"\n“Cannot Access Django-Admin Panel on Port.” Stack Overflow, https://stackoverflow.com/questions/77465837/cannot-access-django-admin-panel-on-port. Accessed 26 Nov. 2023.\n\n\n## 4.5. \"Django NoReverseMatch Error for ‘questions’ View After Google OAuth Sign-In.\"\n“Django NoReverseMatch Error for ‘questions’ View After Google OAuth Sign-In.” Stack Overflow, https://stackoverflow.com/questions/77547799/django-noreversematch-error-for-questions-view-after-google-oauth-sign-in. Accessed 26 Nov. 2023.\n\n## 4.6. \"Social Login Expects to Lead to Questions.Html via Django Urlpatterns, Instead Leads to Home Page.\"\n“Social Login Expects to Lead to Questions.Html via Django Urlpatterns, Instead Leads to Home Page.” Stack Overflow, https://stackoverflow.com/questions/77634816/social-login-expects-to-lead-to-questions-html-via-django-urlpatterns-instead-l. Accessed 10 Dec. 2023.\n\n\n## 4.7. \"Django QuestionForm in Forms.Py Not Creating Instance in Questions.Html.\"\n“Django QuestionForm in Forms.Py Not Creating Instance in Questions.Html.” Stack Overflow, https://stackoverflow.com/questions/77704846/django-questionform-in-forms-py-not-creating-instance-in-questions-html. Accessed 25 Dec. 2023.\n\n## 4.8. \"Django taggit view leading to FieldError: Related Field got invalid lookup: name\"\nDjango taggit view leading to FieldError: Related Field got invalid lookup: name. (n.d.). Stack Overflow. Retrieved February 20, 2024, from https://stackoverflow.com/questions/78012162/django-taggit-view-leading-to-fielderror-related-field-got-invalid-lookup-name\n\n## 4.9. \"profile_update_form does not update field correctly, print logs suggest issue with redundant if statement\nprofile_update_form does not update field correctly, print logs suggest issue with redundant if statement. (n.d.). Stack Overflow. Retrieved February 20, 2024, from https://stackoverflow.com/questions/78016607/profile-update-form-does-not-update-field-correctly-print-logs-suggest-issue-wi\n\n##  4.10. \"Tag instances via django-taggit are not rendering as expected in update post form.\"\n\nTag instances via django-taggit are not rendering as expected in update post form. (n.d.). Stack Overflow. Retrieved March 28, 2024, from https://stackoverflow.com/questions/78096352/tag-instances-via-django-taggit-are-not-rendering-as-expected-in-update-post-for\n\n # 5. Acknowledgement and credits\n\nThis section is dedicated to all acknowledgements and credits of external resources used in the development of the site.\n\n ## 5.1. Coding Languages\n\nThe following languages were used in the development of the site:\n\n- [HTML](https://en.wikipedia.org/wiki/HTML)\n    - HTML is the standard markup language for documents designed to be displayed in a web browser.\n- [CSS](https://en.wikipedia.org/wiki/CSS)\n    - Cascading Style Sheets is a style sheet language used for describing the presentation of a document written in a markup language such as HTML.\n- [JavaScript](https://en.wikipedia.org/wiki/JavaScript)\n    - JavaScript, often abbreviated as JS.\n- [Python](https://www.python.org/)\n    - Python is an interpreted high-level general-purpose programming language.\n\n ## 5.2. Frameworks, Libraries and Programs\n\nThe following frameworks, libraries and programs were used in the development of the site:\n\n### 5.2.1. Front-end modules\n\nThe following front-end libraries were used in the development of the site:\n\n- [Bootstrap](https://getbootstrap.com/)\n    - Bootstrap was used to assist with the responsiveness and styling of the website.\n- [Font Awesome](https://fontawesome.com/)\n    - Font Awesome was used on all pages throughout the website to add icons for aesthetic and UX purposes.\n- [JQuery](https://jquery.com/)\n    - jQuery came with Bootstrap to make the navbar responsive.\n\n### 5.2.2. Back-end modules\n\nThe following Python libraries were used in the development of the site:\n\n- [asgiref](https://pypi.org/project/asgiref/)\n    - ASGI is a standard for Python asynchronous web apps and servers to communicate with each other, and positioned as an asynchronous successor to WSGI.\n- [better-profanity](https://pypi.org/project/better-profanity/)\n    - A Python library to check for profanity in a given text. This was used to check for profanity in questions and answers.\n- [cloudinary](https://cloudinary.com/)\n    - Cloudinary is a cloud service that offers a solution to a web application's entire image management pipeline.\n- [dj-database-url](https://pypi.org/project/dj-database-url/)\n    - This simple Django utility allows you to utilize the 12factor inspired DATABASE_URL environment variable to configure your Django application.\n- [dj3-cloudinary-storage](https://pypi.org/project/dj3-cloudinary-storage/)\n    - A Django storage backend for Cloudinary.\n- [Django](https://www.djangoproject.com/)\n    - Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.\n- [django-allauth](https://django-allauth.readthedocs.io/en/latest/)\n    - Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication.\n- [django-crispy-forms](https://django-crispy-forms.readthedocs.io/en/latest/)\n    - django-crispy-forms provides you with a |crispy filter and {% crispy %} tag that will let you control the rendering behavior of your Django forms in a very elegant and DRY way.\n- [django-quill-editor](https://pypi.org/project/django-quill-editor/)\n    - A Django app to use Quill editor in forms. This was used on the ask question page and the answer question page (question_detail.html).\n- [django-taggit](https://pypi.org/project/django-taggit/)\n    - Simple tagging for Django. This was used to implement tags for questions using `TaggableManager.` The tags can also be created through the admin panel.\n- [gunicorn](https://gunicorn.org/)\n    - Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX.\n- [oauthlib](https://oauthlib.readthedocs.io/en/latest/)\n- [psycopg2](https://pypi.org/project/psycopg2/)\n    - Psycopg is the most popular PostgreSQL database adapter for the Python programming language.\n- [PyJWT](https://pyjwt.readthedocs.io/en/stable/)\n    - A Python library which allows you to encode and decode JSON Web Tokens (JWT).\n- [python3-openid](https://pypi.org/project/python3-openid/)\n    - This is a set of Python packages to support use of the OpenID decentralized identity system in your application.\n- [pytz](https://pypi.org/project/pytz/)\n    - pytz brings the Olson tz database into Python.\n- [requests-oauthlib](https://pypi.org/project/requests-oauthlib/)\n    - OAuthlib support for Python-Requests!\n- [sqlparse](https://pypi.org/project/sqlparse/)\n    - A non-validating SQL parser module for Python.\n- [taggit](https://pypi.org/project/django-taggit/)\n    - Simple tagging for Django. This was used to implement tags for questions.\n    - TaggableManager was used to manage tags\n- [urllib3](https://pypi.org/project/urllib3/)\n    - urllib3 is a powerful, sanity-friendly HTTP client for Python.\n- [whitenoise](http://whitenoise.evans.io/en/stable/)\n    - Radically simplified static file serving for Python web apps. This was used to serve static files in production.\n\n\u003cdetails\u003e\u003csummary\u003e\nclick here for the full list of Python library versions:\n\u003c/summary\u003e\n\n```txt\nasgiref==3.7.2\nbetter-profanity==0.7.0\ncloudinary==1.36.0\ndj-database-url==0.5.0\ndj3-cloudinary-storage==0.0.6\nDjango==4.1\ndjango-allauth==0.58.2\ndjango-crispy-forms==1.14.0\ndjango-js-asset==2.2.0\ndjango-quill-editor==0.1.40\ndjango-taggit==1.5.1\ngunicorn==21.2.0\noauthlib==3.2.2\npsycopg2==2.9.9\nPyJWT==2.8.0\npython3-openid==3.2.0\npytz==2023.3.post1\nrequests-oauthlib==1.3.1\nselenium==4.17.2\nsqlparse==0.4.4\nurllib3==1.26.15\nwhitenoise==6.6.0\n```\n\n\u003c/details\u003e\n\n### 5.2.3. Large Language Models\n\nThe following large language models were used for drafting solutions to bugs and errors. The output would always need to be manually refined and tested before implementation.\n\nLarge Language Models refer to a class of machine learning models that have been trained on vast amounts of text data. These models are capable of generating human-like text.\n\n- [Phind](https://phind.com/)\n    - Phind was used to help with error messages and draft debugging solutions. It's VSCode extension was particularly helpful for reading the codebase efficiently.\n- [GPT-4](https://openai.com/)\n    - GPT-4 was used to help with error messages and draft debugging solutions.\n\n\n ## 5.3. Deployment and IDE\n\n The following software was used to deploy the project and develop the code:\n\n- [Heroku](https://www.heroku.com/)\n    - Heroku is a platform as a service (PaaS) that enables developers to build, run, and operate applications entirely in the cloud.\n- [NameCheap](https://www.namecheap.com/)\n    - Namecheap is an ICANN-accredited domain name registrar, which provides domain name registration and web hosting. It was used to purchase the domain name for this project.\n- [GitHub](https://www.github.com/)\n    - GitHub is a code hosting platform for version control and collaboration. It was used to store the project's code.\n- [Git](https://git-scm.com/)\n    - Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. It was used to track changes in the codebase.\n- [GitPod](https://www.gitpod.io/)\n  - gitpod is an online IDE for GitHub that provides a complete dev environment with a single click. It was used to develop the project, allowing a smooth transition between local and remote development.\n- [Visual Studio Code](https://code.visualstudio.com/)\n    - Visual Studio Code is a source-code editor made by Microsoft for Windows, Linux and macOS. It was used to write and debug the code.\n- [CodePen](https://codepen.io/)\n    - CodePen is a social development environment for front-end designers and developers. It was used to test and debug code snippets, particularly useful with live previews of HTML/CSS/JS code.\n      - My collection [Master CSS files](https://codepen.io/collection/yrwrJZ ) were created for CSS that would interact across the site.\n      - My collection of [Components](https://codepen.io/collection/jbEjoo) was used to draft code snippets in the front-end using html, bootstrap and css.\n\n\n ## 5.4. UX Software\n\n The following software assisted with Design and User Experience:\n\n- [Figma](https://www.figma.com/)\n    - Figma is a vector graphics editor and prototyping tool which is primarily web-based. This was used to create the wireframes during the design process.\n- [Canva](https://www.canva.com/)\n    - Canva is a graphic design platform, used to create social media graphics, presentations, posters, documents and other visual content.\n\n ## 5.5. Resources\n\nThe following resources were used to assist with the development of the project and the learning of the technologies:\n\n- [Code Institute](https://codeinstitute.net/)\n    - Code Institute private learning platform was used to learn Django and Python as part of a full-stack web development course. Specifically, the Django module with \"I think therefore I blog\" was particularly helpful.\n- [StackOverflow](https://stackoverflow.com)\n  - Stackoverflow was used to document the bugs as well as consult with the community for solutions.\n- [W3Schools](https://www.w3schools.com/)\n    - W3Schools is a web developer information website, with tutorials and references relating to web development topics such as HTML, CSS, JavaScript, PHP, SQL, Python, jQuery, Java, C++, C#, React, Node.js, XML, W3.CSS, and Bootstrap.\n- [MDN Web Docs](https://developer.mozilla.org/en-US/)\n    - MDN Web Docs, previously Mozilla Developer Network and formerly Mozilla Developer Center, is the official Mozilla website for development documentation of web standards and Mozilla projects.\n- [Django Documentation](https://docs.djangoproject.com/en/4.1/)\n    - The official documentation for Django was particularly helpful.\n\nForked Code Snippets on Codepen:\n- [Login Page by Satnam Saini](https://codepen.io/sainisatnam52/pen/vYNbJgw) was used to draft the login page, particularly useful was the JS for the different tabs.\n\n## 5.6. Personal Acknowledgements\n\nI would like to thank the following people for their support and assistance in the development of this project:\n\n- My mentor, Koko, for her patience and support especially with the testing process and helping me understand Django Views.\n- My family and friends for their support and encouragement throughout the project, it really means the world. Particularly thank you to my Mother for her endless ability to listen to me even when I'm working through something she doesn't understand.\n- My colleagues at Featherstone High School for providing me with endless inspiration and motivation to keep learning and growing.\n- The Code Institute Slack community for their support and assistance throughout the project, particularly a big thank you to Sean Meade for his help with solving the most mysterious Cloudinary bug, eventually realising that the issue was `whitenoise` middleware in `settings.py`.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flmcrean%2Fcoach-matrix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flmcrean%2Fcoach-matrix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flmcrean%2Fcoach-matrix/lists"}