From 93817ef984bf41350417a8315dff5905aefbde53 Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Tue, 7 Apr 2020 20:20:04 +0100 Subject: [PATCH 01/26] Added s3 media storages --- custom_storages.py | 4 ++++ issue_tracker/settings.py | 10 ++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/custom_storages.py b/custom_storages.py index c4f691d..2695816 100644 --- a/custom_storages.py +++ b/custom_storages.py @@ -4,3 +4,7 @@ class StaticStorage(S3Boto3Storage): location = settings.STATICFILES_LOCATION + + +class MediaStorage(S3Boto3Storage): + location = settings.MEDIAFILES_LOCATION diff --git a/issue_tracker/settings.py b/issue_tracker/settings.py index 07d4c76..947a754 100644 --- a/issue_tracker/settings.py +++ b/issue_tracker/settings.py @@ -152,18 +152,20 @@ # STATIC_ROOT = (os.path.join(BASE_DIR, 'staticfiles')) -MESSAGE_STORAGE = "django.contrib.messages.storage.session.SessionStorage" - -TAGGIT_CASE_INSENSITIVE = True +MEDIAFILES_LOCATION = 'media' +DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') -MEDIA_URL = '/media/' +MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION) CRISPY_TEMPLATE_PACK = 'bootstrap4' STRIPE_PUBLISHABLE = os.getenv('STRIPE_PUBLISHABLE') STRIPE_SECRET = os.getenv('STRIPE_SECRET') +TAGGIT_CASE_INSENSITIVE = True + +MESSAGE_STORAGE = "django.contrib.messages.storage.session.SessionStorage" MESSAGE_TAGS = { messages.DEBUG: 'alert-info', messages.INFO: 'alert-info', From ba48862f40aebfd490560a961cffb4c368ffe4bd Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Tue, 7 Apr 2020 20:25:33 +0100 Subject: [PATCH 02/26] repo synced with travis for continuous integration testing --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..352378c --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: python +python: + - '3.6' +install: 'pip install -r requirements.txt' +script: + - SECRET_KEY="whatever" ./manage.py test From a9eaae50c4964334fdd97755183c7eb83984c3d1 Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Tue, 7 Apr 2020 20:42:12 +0100 Subject: [PATCH 03/26] if else for databases for travis --- issue_tracker/settings.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/issue_tracker/settings.py b/issue_tracker/settings.py index 947a754..b7332fe 100644 --- a/issue_tracker/settings.py +++ b/issue_tracker/settings.py @@ -82,23 +82,36 @@ WSGI_APPLICATION = 'issue_tracker.wsgi.application' # Database -# https://docs.djangoproject.com/en/1.11/ref/settings/#databases -if development: - print('DATABASE: SQLITE3') +# if development: +# print('DATABASE: SQLITE3') +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), +# } +# } +# else: +# print('DATABASE: POSTGRESQL') +# DATABASES = { +# 'default': dj_database_url.parse(os.environ.get('DATABASE_URL')) +# } + +if "DATABASE_URL" in os.environ and development == False: + print('Database URL found. Using POSTGRESQL') + DATABASES = { + 'default': dj_database_url.parse(os.environ.get('DATABASE_URL')) + } +else: + print("Database URL not found. Using SQLite instead.") DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } -else: - print('DATABASE: POSTGRESQL') - DATABASES = { - 'default': dj_database_url.parse(os.environ.get('DATABASE_URL')) - } + # Password validation -# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { @@ -117,7 +130,6 @@ # Internationalization -# https://docs.djangoproject.com/en/1.11/topics/i18n/ LANGUAGE_CODE = 'en-us' From a0c760e3d2506fde9b09d107fedbc7576b5771cd Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Thu, 9 Apr 2020 12:17:14 +0100 Subject: [PATCH 04/26] Corrected travis.yml script --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 352378c..5cf46b2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,4 +3,4 @@ python: - '3.6' install: 'pip install -r requirements.txt' script: - - SECRET_KEY="whatever" ./manage.py test + - SECRET_KEY="whatever" python ./manage.py test From 6056a7e4b5ae4e9ed2116d479a7ede524cac2f74 Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Thu, 9 Apr 2020 12:58:27 +0100 Subject: [PATCH 05/26] Fix travis yml spacing --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5cf46b2..b65e0d1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: python python: - - '3.6' -install: 'pip install -r requirements.txt' +- "3.6" +install: "pip install -r requirements.txt" script: - - SECRET_KEY="whatever" python ./manage.py test +- SECRET_KEY="whatever" ./manage.py test From 36be71d77fb1ec890b44b6d814d3770c74cf8e6a Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Thu, 9 Apr 2020 13:24:22 +0100 Subject: [PATCH 06/26] Add db.sqlite3 database for Travis --- db.sqlite3 | Bin 0 -> 294912 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 db.sqlite3 diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..7371aee9d8567480b7e330e270c94ab7f5251411 GIT binary patch literal 294912 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 IFkFUE<5cKN8<0 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 GzVm Date: Thu, 9 Apr 2020 15:42:31 +0100 Subject: [PATCH 07/26] Travis yml script edit --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b65e0d1..0e96081 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,4 +3,4 @@ python: - "3.6" install: "pip install -r requirements.txt" script: -- SECRET_KEY="whatever" ./manage.py test +- SECRET_KEY="whatever" ./manage.py makemigrations; ./manage.py migrate; ./manage.py test From 6a8408c74dea2c904af54e05b4c2c3a7a1020b13 Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Thu, 9 Apr 2020 15:50:42 +0100 Subject: [PATCH 08/26] Travis.yml script edits with secret_key --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0e96081..83f2394 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,4 +3,4 @@ python: - "3.6" install: "pip install -r requirements.txt" script: -- SECRET_KEY="whatever" ./manage.py makemigrations; ./manage.py migrate; ./manage.py test +- SECRET_KEY="whatever" ./manage.py makemigrations; SECRET_KEY="whatever" ./manage.py migrate; SECRET_KEY="whatever" ./manage.py test From 688cb5d602ae71f348ab19a228055fce273ffc29 Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Fri, 10 Apr 2020 11:49:02 +0100 Subject: [PATCH 09/26] Remove database comments from settings.py --- issue_tracker/settings.py | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/issue_tracker/settings.py b/issue_tracker/settings.py index b7332fe..efe4f50 100644 --- a/issue_tracker/settings.py +++ b/issue_tracker/settings.py @@ -1,6 +1,5 @@ """ Django settings for issue_tracker project. - Generated by 'django-admin startproject' using Django 1.11.24. """ @@ -16,10 +15,8 @@ print('DEVELOPMENT=FALSE') -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -# SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = os.environ.get('SECRET_KEY') # DEBUG = development @@ -82,19 +79,6 @@ WSGI_APPLICATION = 'issue_tracker.wsgi.application' # Database -# if development: -# print('DATABASE: SQLITE3') -# DATABASES = { -# 'default': { -# 'ENGINE': 'django.db.backends.sqlite3', -# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), -# } -# } -# else: -# print('DATABASE: POSTGRESQL') -# DATABASES = { -# 'default': dj_database_url.parse(os.environ.get('DATABASE_URL')) -# } if "DATABASE_URL" in os.environ and development == False: print('Database URL found. Using POSTGRESQL') @@ -143,7 +127,6 @@ # Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.11/howto/static-files/ AWS_S3_OBJECT_PARAMETERS = { 'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT', @@ -154,6 +137,7 @@ AWS_S3_REGION_NAME = 'eu-west-1' AWS_ACCESS_KEY = os.environ.get("AWS_ACCESS_KEY_ID") AWS_SECRET_ACCESS = os.environ.get("AWS_SECRET_ACCESS_KEY") + AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME STATICFILES_LOCATION = 'static' @@ -162,8 +146,6 @@ STATIC_URL = '/static/' STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), ) -# STATIC_ROOT = (os.path.join(BASE_DIR, 'staticfiles')) - MEDIAFILES_LOCATION = 'media' DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage' From c8341140bde942cbda55beb07b79f1c81e70f988 Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Fri, 10 Apr 2020 11:58:59 +0100 Subject: [PATCH 10/26] Edit django rest api fetch statement to work with heroku hostname --- static/js/dashboard.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/js/dashboard.js b/static/js/dashboard.js index 9545a3b..a28880c 100644 --- a/static/js/dashboard.js +++ b/static/js/dashboard.js @@ -1,5 +1,5 @@ -// Fetch data from Django REST API -fetch('http://localhost:8000/tickets/api/tickets') +// Fetch source data for charts from Django REST API +fetch(document.location.origin + '/tickets/api/tickets') .then((response) => { return response.json(); }) From 55fd91f5bb44c9d889627ec2f7f72f85d0f6c4c8 Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Fri, 10 Apr 2020 13:44:40 +0100 Subject: [PATCH 11/26] Hardcode django rest api fetch value for heroku --- static/js/dashboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/js/dashboard.js b/static/js/dashboard.js index a28880c..a62a5b0 100644 --- a/static/js/dashboard.js +++ b/static/js/dashboard.js @@ -1,5 +1,5 @@ // Fetch source data for charts from Django REST API -fetch(document.location.origin + '/tickets/api/tickets') +fetch('https://django-ecommerce1.herokuapp.com/tickets/api/tickets') .then((response) => { return response.json(); }) From 930761414daa0db312fa8f3e69f0af52a0c68c7c Mon Sep 17 00:00:00 2001 From: tdunn891 Date: Sun, 12 Apr 2020 20:12:53 +0100 Subject: [PATCH 12/26] Add Assignee to Kanban cards --- tickets/templates/kanban.html | 150 ++++++++++++++++++++-------------- 1 file changed, 88 insertions(+), 62 deletions(-) diff --git a/tickets/templates/kanban.html b/tickets/templates/kanban.html index 093b514..306f120 100644 --- a/tickets/templates/kanban.html +++ b/tickets/templates/kanban.html @@ -21,8 +21,9 @@
-
local_activity New - ({{ new_tickets|length }})
+
local_activity + New ({{ new_tickets|length }}) +
{% for ticket in new_tickets %}
@@ -31,18 +32,9 @@
title="{{ ticket.description }}">{{ ticket.summary }} - - - {{ ticket.priority }} - + + + {{ ticket.assigned_to }}
@@ -55,6 +47,20 @@
data-placement="left">build {% endif %} + + + {{ ticket.priority }} + + + {% if ticket.tags.names %} @@ -67,8 +73,9 @@
{% if request.user == ticket.submitted_by or request.user.is_staff %}
-
{% endif %} +
{% endfor %} @@ -102,30 +110,35 @@
title="{{ ticket.description }}">{{ ticket.summary }} - - - {{ ticket.priority }} - + + {{ ticket.assigned_to }} +
{% if ticket.ticket_type == "Bug" %} - bug_report {% elif ticket.ticket_type == "Feature" %} - build {% endif %} + + + {{ ticket.priority }} + + + {% if ticket.tags.names %} @@ -138,8 +151,9 @@
{% if request.user == ticket.submitted_by or request.user.is_staff %}
-