The live site can be found at developer-connect.herokuapp.com.
The objective of Developer Connect is to link software developers up with eachother so that they can form teams and work on projects. Furthermore, a project posting board allows the opportunity for people with app, website or software ideas to build a team with the appropriate skills and technological experience to bring their idea(s) to life. The platform also provides a way for developers to connect with one another and for potential employers to find their next ideal candidate.
Originally, the "minty" bootswatch theme was utilised for this project as it provides a simple, clean design with an appealing green colour as its base. The buttons have soft, rounded edges which are visually appealing and the colours used for primary, secondary, warning and danger buttons complement eachother nicely. Minty's card and modal styles are simple, aesthetically pleasing and do not distract from the content of the website.
Following Lighthouse testing, it became obvious that the vast majority of the "Minty" CSS was being unused on the site and was contributing to longer loading times and poor performance. For this reason, custom CSS was applied to supplement the import of regular Bootstrap 5 from the CDN and "Minty" was removed. Many of the colour combinations used in "Minty" were retained, and therefore it is still credited here in the creation of this project.
Following assessment with an EightShapes contrast grid, some of the Minty colours were deemed to not have sufficient contrast for visually impaired users. In particular, many of the areas where white text was used were replaced with black text to improve readability. More details about this can be found in the TESTING.md file.
Adaptations to the "minty" theme:
#FFFFFF
used for nav bar and most button text -> changed in most cases to #000000
#FF7851
, an orange for 'danger' buttons -> changed to #C63D17
, a darker red, for better contrast with white text#5a5a5a
a medium gray -> changed in areas with small font text or on coloured backgrounds (nav bar, buttons) to #000000
The general colour scheme can be seen below:
The coolers colour scheme shown above shows the basic colours used for the site.
I've used CSS :root
variables to easily update the global colour scheme by changing only one value, instead of everywhere in the CSS file. These are inspired by the "Minty" colour scheme mentioned earlier.
:root {
--mint-green: #78C2AD;
--hover-mint-green: #66a593;
--disabled-green: #CCE8E0;
--pink:#F3969A;
--red: #C63D17;
--black: #000;
--white: #FFF;
--off-white: #ccc;
--dark-green: #006400;
--dark-grey: #5a5a5a;
}
Fonts imported as part of the Bootstrap import are used throughout this project. Additional icons from the Font Awesome library were used. Icons were used throughout the site, including the social media icons in the footer and the edit/delete icons for messages. The icons used are shown below:
User stories are an integral part of software design and execution and help not only with the design on the features but also with the management of the project. User stories represent the small units of work which can be undertaken during an iteration (or "sprint").
In this project, User Stories are broken down from three "Epics". Epics are large overarching concepts which define the major parts of the software being developed. These epics were then dissected into smaller User Stories. The epics used for this project were:
Github actions was used to record epics and user stories and a User Story template was created and used for the purpose of recording the user stories and for breaking them down into "acceptance criteria" - the conditions which must be met in order for the User Story to be considered "finished" - and "tasks" - the actual work that needs to be done in order to meet these acceptance criteria.
The User Stories are listed below and are linked to the respective issue on Github actions:
More information about the Agile process can be found in the Agile Development Process section.
To follow best practice and to help with planning, wireframes were developed for mobile, tablet, and desktop sizes. Balsamiq was used to design the site wireframes. The table below shows the wireframes in all three sizes (mobile, tablet and desktop).
Page | Wireframes (mobile, tablet, desktop) |
---|---|
Log in page | |
Registration page | |
Individual Profile page | |
About page | |
Find Developer Page | |
Find Projects page |
Navbar
Homepage
About Page
Registration page
Social registration:
Login page
Social sign in:
Developer Overview Page
Project Overview Page
User Profile Page (logged in user)
The user profile has full CRUD (Create Read Update Delete) functionality. "Create" is invoked when a user signs up to the website, and the "Read" functionality is displayed here. See below for the "Update" and "Delete" functions.
Edit User Profile Page(logged in user)
Delete User Account
Profile Picture Overview
Profile Picture CRUD
Other User Profile
User profiles for users other than the logged in user may be viewed by the logged in user. Most of the details are the same as on the logged in user's own profile, but the e-mail address is omitted for privacy. The logged in user cannot edit or delete another user's account, nor add/remove photos from another user's profile, but they can send a message to the other user through their profile page by clicking the "Send message" button.
Project CRUD
Create New Project
Project Picture CRUD
Messages Inbox and Sent Messages
The layout of the message lists varies depending on the screen size of the device used. For smaller devices, only the key information is displayed - username of the sender/recevier, title of the message and the sent/received date and time. If users use a device with a screen width of 768px or above, they can also see a thumbnail of the sender/receiver's profile picture and they have the option to delete (and edit, if the sender) from this list view. If using a screen size of below 768px, users must go into the individual message if they wish to edit or delete the message. Users of all screen sizes may access the user profile of the sender/receiver by clicking their username and may access the individual message by clicking the message title.
Messages CRUD
Send new message
The new message form can be accessed from three locations.
Pressing cancel will take the user to the message inbox, regardless of which page the user came from.
Edit message
Delete message
Individual messages
Individual sent message page Individual received message page
Django Messages
Filtering
Pagination
Pagination works alone but can also be combined with the filtering mentioned above. The site is set up to recieve arguments in the url for filtering, pagination, or both. The screenshot below demonstrates some of the different combinations possible.
The base url for the developer page is https://developer-connect.herokuapp.com/developers/
and queries can be made using .../developers/?
followed by the query. This can be either p_language=(num)
or page=(num)
.
There are many features which could be added to the project at a later date but were not deemed important for this iteration of the project implementation. Some ideas for future features include:
A notification system for messages
The ability to add other users to the project
The ability to favourite users and projects to be able to quickly find them again in the future
Search and sort functionality for Developer and Project Overview pages and messages
Addition of other skills users could select in addition to programming languages - such as frameworks, dadabases and stacks.
A password reset function
Email notification system for sign up, unauthorised accessed, password reset, new message etc.
An administrator area where administrators can have an overview of users, projects etc. and make amendments without needing to go into the admin panel
HTML used for the main site content.
CSS used for the main site design and layout.
CSS :root variables used for reusable styles throughout the site.
Bootstrap used as the front-end CSS framework for modern responsiveness and pre-built components.
Bootswatch* used as an extension to Bootstrap to provide pleasant aesthetics for the site.
Python used as the back-end programming language.
Git used for version control. (git add
, git commit
, git push
)
GitHub used for secure online code storage.
Gitpod used as a cloud-based IDE for development.
Markdown Builder by Tim Nelson used to help generate the Markdown files.
Django used as the Python framework for the site.
PostgreSQL used as the relational database management.
ElephantSQL used as the Postgres database.
Heroku used for hosting the deployed back-end site.
Cloudinary used for online static file storage.
Visual Studio Code used as a local IDE for development.
Black used as a PEP8 compliant Python code formatter
DBeaver used to produce ERDs and help plan the database models
Balsamiq used to produce wireframes
Bootswatch was later removed but many of the colours in the chosen theme were used, so this credit remains
An Entity Relationship Diagram (ERD) was created using DBeaver in order to visualize the database architecture before creating Django models.
The ERD is shown below. There are 6 models which interact with eachother in a relational manner. The six models are:
The relationships are either one-to-many or many-to-many in nature, as discussed below.
The following models have a one-to-many relationship:
The remaining relationships are many to many:
These three models form a "square" on the ERD as they require intermediate tables to store the many-to-many relationship details. On the ERD these intermediate tables are labelled as "user-project", "project-p-language" and ""user-to-p-language" and they store the id of the two relevant tables. For example, in the "user-to-p-language" table, the id of a user1 could be associated with programming languages 1 and 2, but at the same time programming language 1 could be associated with many other users. This table provides an interface between the user table and the programming language table so that these relationships may be stored and related information may be accessed from both ends.
*This backwards relationship has not yet been implemented, but it is on the list of future features that each project may have many users associated with it.
An example of a model used in the project is shown below:
class Project(models.Model):
user = models.ManyToManyField(User, blank=True)
p_language = models.ManyToManyField("ProgramLang")
title = models.CharField(
help_text="What is the title for your project?",
max_length=100,
unique=True,
)
description = models.TextField(
help_text="Enter your project description here", blank=True, null=True
)
def __str__(self):
return f"<Project name: {self.title}>"
def delete(self, *args, **kwargs):
"""
Additional function to ensure pictures are deleted
from cloudinary
"""
# delete associated profile pics
for pic in self.project_pic.all():
pic.delete()
# then delete itself
super().delete(*args, **kwargs)
This Project
model inherits from Django's inbuilt Model
class and utilises two many-to-many relationships. One between itself and the User
class (which may be blank, incase an associated user account is deleted), and one between itself and the ProgramLang
class (which may not be blank). The model then has a title
CharField with a maximum length of 100 characters (limited as this is displayed on a bootstrap card) which must be unique. An optional description
TextField may be as long as a user desires and may be left blank.
The __str__
method returns <Project name: ((project title))>
so that the project may be easily identified in the admin panel.
A delete
method extends the default delete method to call the delete method for each picture associated with the project, which in turn deletes the pictures from Cloudinary (this Cloudinary delete method can be seen at app_user/models.py
lines 137-144).
This Project
model is represented as a table below as an example:
id (unique) | Type | Notes |
---|---|---|
user | ManyToManyField | MTM to User model |
p_language | ManyToManyField | MTM to ProgramLang model |
title | CharField | Max length 100 chars |
description | TextField |
GitHub Projects served as an Agile tool for this project. It isn't a specialized tool, but with the right tags and project creation/issue assignments, it can be made to work.
Through it, user stories, issues, and milestone tasks were planned, then tracked on a weekly basis using the basic Kanban board. An overview of the Kanban board is shown below. Newly created issues began in the "Backlog" column and were moved through the "Ready to Begin", "In Progress" and "Testing" columns before being maked as closed and moved to the "Done" column.
GitHub Issues served as an another Agile tool.
There, I used my own User Story Template to manage user stories and Bug Report Template to report bugs as they were discovered. For each User Story, at least three Acceptance Criteria were recorded to indicate the criteria that must be fulfilled in order for the User story to be completed and at least three Tasks which must be performed in order to fulfil said criteria.
The Bug Report Template is based off the Bug report template provided by Github with some minor modifications to add the tag "bug" and automatically assign it to a user.
Below, the open and closed issues can be seen. These helped with milestone iterations on a weekly basis. The list below includes all issues including User Stories and Bugs.
I've decomposed my Epics into stories prior to prioritizing and implementing them. Using this approach, I was able to apply the MoSCow prioritization and labels to my user stories within the Issues tab.
These labels were added to the default ones provided by Github and can be seen in the screenshot below:
Branches were utilised within GitHub to help seperate areas of focus and to enable more information to be given about a series of commits and how they relate to the GitHub issues mentioned earlier. This was extremely valuable for managing which user story (or other task, such as testing or documentation) was being focused on at the time and helped keep the workflow organised.
Branching may be performed in in Visual Studio Code or GitPod using the following CLI commands:
CLI command | Notes |
---|---|
git branch |
list current branches |
git checkout <branchname> |
switch to specified branch |
git checkout -b <branchname> |
create new branch (if it doesn't exist) and switch to it |
git branch -d <branchname> |
delete specified branch |
git push origin <branchname> |
pushes the specified branch to GitHub |
Once ready to merge from the created branch back to the main branch, a pull request may be made on GitHub.
Below are some screenshots of the pull request and merging process:
Normally, a reviewer would be assigned to check the pull request before merging it to the main branch, however I was the only one working on this project and therefore this was not possible.
Pull requests from different branches are accessed here.
Below is an example pull request. Pull requests contain the details of the commits contained within them and in most cases they have been linked to the issues and milestones that they relate to with a description.
For all testing, please refer to the TESTING.md file. This includes User Story testing.
The live deployed application can be found deployed on Heroku.
This project uses ElephantSQL for the PostgreSQL Database.
To obtain your own Postgres Database, sign-up with your GitHub account, then follow these steps:
This project uses the Cloudinary API to store media assets online, due to the fact that Heroku doesn't persist this type of data.
To obtain your own Cloudinary API key, create an account and log in.
CLOUDINARY_URL=
as part of the API value; this is the key.This project uses Heroku, a platform as a service (PaaS) that enables developers to build, run, and operate applications entirely in the cloud.
Deployment steps are as follows, after account setup:
Key | Value |
---|---|
CLOUDINARY_URL |
user's own value |
DATABASE_URL |
user's own value |
DISABLE_COLLECTSTATIC |
1 (this is temporary, and can be removed for the final deployment) |
SECRET_KEY |
user's own value |
Heroku needs two additional files in order to deploy properly.
You can install this project's requirements (where applicable) using:
pip3 install -r requirements.txt
If you have your own packages that have been installed, then the requirements file needs updated using:
pip3 freeze --local > requirements.txt
The Procfile can be created with the following command:
echo web: gunicorn app_name.wsgi > Procfile
For Heroku deployment, follow these steps to connect your own GitHub repository to the newly created app:
Either:
Or:
heroku login -i
heroku git:remote -a app_name
(replace app_name with your app name)add
, commit
, and push
to GitHub, you can now type:
git push heroku main
The project should now be connected and deployed to Heroku!
This project can be cloned or forked in order to make a local copy on your own system.
For either method, you will need to install any applicable packages found within the requirements.txt file.
pip3 install -r requirements.txt
.You will need to create a new file called env.py
at the root-level,
and include the same environment variables listed above from the Heroku deployment steps.
Sample env.py
file:
import os
os.environ.setdefault("CLOUDINARY_URL", "user's own value")
os.environ.setdefault("DATABASE_URL", "user's own value")
os.environ.setdefault("SECRET_KEY", "user's own value")
# local environment only (do not include these in production/deployment!)
os.environ.setdefault("DEBUG", "True")
Once the project is cloned or forked, in order to run it locally, you'll need to follow these steps:
python3 manage.py runserver
CTRL+C
or ⌘+C
(Mac)python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py createsuperuser
python3 manage.py loaddata file-name.json
(repeat for each file)python3 manage.py runserver
You can clone the repository by following these steps:
git clone https://github.com/dragon-fire-fly/developer_matcher.git
Alternatively, if using Gitpod, you can click below to create your own workspace using this repository.
Please note that in order to directly open the project in Gitpod, you need to have the browser extension installed. A tutorial on how to do that can be found here.
By forking the GitHub Repository, we make a copy of the original repository on our GitHub account to view and/or make changes without affecting the original owner's repository. You can fork this repository by using the following steps:
Source | Location | Notes |
---|---|---|
Markdown Builder by Tim Nelson | README and TESTING | tool to help generate the Markdown files |
Pylessions user registration | models and forms | user registration |
Generic views | views | generic views |
Uploading Images | image upload (projects and profile forms) | uploading images in django |
Profanity checking | user and project creation and edit forms | profanity checking |
LoginRequiredMixin | entire site | authentication of user |
Bootstrap Pagination | templates and views | Pagination for Django |
Codemy Pagination Youtube | templates and views | Pagination for Django |
Django unittesting | entire site | unittesting for Django |
Learn Django AllAuth | entire site | authentication with AllAuth |
Pylessons AllAuth | entire site | authentication with AllAuth |
Crispy Forms | forms, templates | improving form styling with crispy forms |
Cloudinary image upload API | image uploads | uploading images throught the cloudinary API |
Bootstrap Navbar | entire site | implementing bootstrap navbar |
Bootstrap Cards | templates | displaying cards in developer and project overview pages |
Horizontal bootstrap cards | templates | making project overview cards display horizontally |
Logo creation | entire site, home page | creation of a logo and favicon for the site |
Cat sample images | developer profiles | AI for creating unique images for samples user profiles |
WhiteNoise | entire site | hosting static files on Heroku temporarily |
Source | Location | Type | Notes |
---|---|---|---|
404 image | entire site | image | 404 page image |
500 image | entire site | image | 500 page image |
Coffee image | project page | image | image for online coffee shop sample project |
No img/ upload img | project page | image | placeholder image for projects without a user uploaded image |
Gallery image | project page | image | image for online gallery sample project |
Poker image | project page | image | image for online poker sample project |
Face detection image | project page | image | image for face detection sample project |
Cat sample images | developer page | image | Most of the images for the sample user accounts were created using dreamstudio |