summaryrefslogtreecommitdiff
path: root/coding_assignment_project
diff options
context:
space:
mode:
authorworkmai <iain.workman@lightsource.ca>2018-10-04 12:14:39 -0600
committerworkmai <iain.workman@lightsource.ca>2018-10-04 12:14:39 -0600
commit12d1f9fd979c11b9e3a3a89b1595b07569b88f79 (patch)
treeaf591040768b104f4bb840a21a92968848a0ffe6 /coding_assignment_project
downloadcoding-assignment-12d1f9fd979c11b9e3a3a89b1595b07569b88f79.zip
coding-assignment-12d1f9fd979c11b9e3a3a89b1595b07569b88f79.tar.gz
coding-assignment-12d1f9fd979c11b9e3a3a89b1595b07569b88f79.tar.bz2
Initial commit of the coding assignment base project
Diffstat (limited to 'coding_assignment_project')
-rw-r--r--coding_assignment_project/__init__.py0
-rw-r--r--coding_assignment_project/settings.py125
-rw-r--r--coding_assignment_project/static/css/lightsource-styles.css16
-rw-r--r--coding_assignment_project/static/css/sb-admin-2.css354
-rw-r--r--coding_assignment_project/static/js/sb-admin-2.js31
-rw-r--r--coding_assignment_project/templates/__init__.py0
-rw-r--r--coding_assignment_project/templates/base.html114
-rw-r--r--coding_assignment_project/urls.py7
-rw-r--r--coding_assignment_project/wsgi.py16
9 files changed, 663 insertions, 0 deletions
diff --git a/coding_assignment_project/__init__.py b/coding_assignment_project/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/coding_assignment_project/__init__.py
diff --git a/coding_assignment_project/settings.py b/coding_assignment_project/settings.py
new file mode 100644
index 0000000..9afeb50
--- /dev/null
+++ b/coding_assignment_project/settings.py
@@ -0,0 +1,125 @@
+"""
+Django settings for coding_assignment_project project.
+
+Generated by 'django-admin startproject' using Django 2.1.2.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.1/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/2.1/ref/settings/
+"""
+
+import os
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = '6e+_000iv_ee1gv)^ls6%%x(=veqnx^k!))0t12x!^p&mou@1i'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.messages',
+ 'django.contrib.staticfiles',
+ 'rest_framework',
+ 'procurement.apps.ProcurementConfig',
+]
+
+MIDDLEWARE = [
+ 'django.middleware.security.SecurityMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.common.CommonMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.middleware.clickjacking.XFrameOptionsMiddleware',
+]
+
+ROOT_URLCONF = 'coding_assignment_project.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': ['coding_assignment_project/templates'],
+ 'APP_DIRS': True,
+ 'OPTIONS': {
+ 'context_processors': [
+ 'django.template.context_processors.debug',
+ 'django.template.context_processors.request',
+ 'django.contrib.auth.context_processors.auth',
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ },
+ },
+]
+
+WSGI_APPLICATION = 'coding_assignment_project.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+ {
+ 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+ },
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/2.1/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'Canada/Saskatchewan'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/2.1/howto/static-files/
+
+STATIC_URL = '/static/'
+STATICFILES_DIRS = [
+ os.path.join(BASE_DIR, 'coding_assignment_project', 'static')
+]
diff --git a/coding_assignment_project/static/css/lightsource-styles.css b/coding_assignment_project/static/css/lightsource-styles.css
new file mode 100644
index 0000000..7ada411
--- /dev/null
+++ b/coding_assignment_project/static/css/lightsource-styles.css
@@ -0,0 +1,16 @@
+.lightsource-header {
+ background-color: #008080;
+}
+.navbar-default .navbar-brand,
+.navbar-default .navbar-brand:focus,
+.navbar-default .navbar-brand:hover {
+ color: #fff;
+}
+.panel-default>.panel-heading {
+ background-color: #008080;
+ color: #fff;
+}
+
+.btn-primary {
+ background-color: #008080;
+} \ No newline at end of file
diff --git a/coding_assignment_project/static/css/sb-admin-2.css b/coding_assignment_project/static/css/sb-admin-2.css
new file mode 100644
index 0000000..e8be396
--- /dev/null
+++ b/coding_assignment_project/static/css/sb-admin-2.css
@@ -0,0 +1,354 @@
+/*!
+ * Start Bootstrap - SB Admin 2 Bootstrap Admin Theme (http://startbootstrap.com)
+ * Code licensed under the Apache License v2.0.
+ * For details, see http://www.apache.org/licenses/LICENSE-2.0.
+ */
+
+body {
+ background-color: #f8f8f8;
+}
+
+#wrapper {
+ width: 100%;
+}
+
+#page-wrapper {
+ padding: 0 15px;
+ min-height: 568px;
+ background-color: #fff;
+}
+
+@media(min-width:768px) {
+ #page-wrapper {
+ position: inherit;
+ margin: 0 0 0 250px;
+ padding: 0 30px;
+ border-left: 1px solid #e7e7e7;
+ }
+}
+
+.navbar-top-links {
+ margin-right: 0;
+}
+
+.navbar-top-links li {
+ display: inline-block;
+}
+
+.navbar-top-links li:last-child {
+ margin-right: 15px;
+}
+
+.navbar-top-links li a {
+ padding: 15px;
+ min-height: 50px;
+}
+
+.navbar-top-links .dropdown-menu li {
+ display: block;
+}
+
+.navbar-top-links .dropdown-menu li:last-child {
+ margin-right: 0;
+}
+
+.navbar-top-links .dropdown-menu li a {
+ padding: 3px 20px;
+ min-height: 0;
+}
+
+.navbar-top-links .dropdown-menu li a div {
+ white-space: normal;
+}
+
+.navbar-top-links .dropdown-messages,
+.navbar-top-links .dropdown-tasks,
+.navbar-top-links .dropdown-alerts {
+ width: 310px;
+ min-width: 0;
+}
+
+.navbar-top-links .dropdown-messages {
+ margin-left: 5px;
+}
+
+.navbar-top-links .dropdown-tasks {
+ margin-left: -59px;
+}
+
+.navbar-top-links .dropdown-alerts {
+ margin-left: -123px;
+}
+
+.navbar-top-links .dropdown-user {
+ right: 0;
+ left: auto;
+}
+
+.sidebar .sidebar-nav.navbar-collapse {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.sidebar .sidebar-search {
+ padding: 15px;
+}
+
+.sidebar ul li {
+ border-bottom: 1px solid #e7e7e7;
+}
+
+.sidebar ul li a.active {
+ background-color: #eee;
+}
+
+.sidebar .arrow {
+ float: right;
+}
+
+.sidebar .fa.arrow:before {
+ content: "\f104";
+}
+
+.sidebar .active>a>.fa.arrow:before {
+ content: "\f107";
+}
+
+.sidebar .nav-second-level li,
+.sidebar .nav-third-level li {
+ border-bottom: 0!important;
+}
+
+.sidebar .nav-second-level li a {
+ padding-left: 37px;
+}
+
+.sidebar .nav-third-level li a {
+ padding-left: 52px;
+}
+
+@media(min-width:768px) {
+ .sidebar {
+ z-index: 1;
+ position: absolute;
+ width: 250px;
+ margin-top: 51px;
+ }
+
+ .navbar-top-links .dropdown-messages,
+ .navbar-top-links .dropdown-tasks,
+ .navbar-top-links .dropdown-alerts {
+ margin-left: auto;
+ }
+}
+
+.btn-outline {
+ color: inherit;
+ background-color: transparent;
+ transition: all .5s;
+}
+
+.btn-primary.btn-outline {
+ color: #428bca;
+}
+
+.btn-success.btn-outline {
+ color: #5cb85c;
+}
+
+.btn-info.btn-outline {
+ color: #5bc0de;
+}
+
+.btn-warning.btn-outline {
+ color: #f0ad4e;
+}
+
+.btn-danger.btn-outline {
+ color: #d9534f;
+}
+
+.btn-primary.btn-outline:hover,
+.btn-success.btn-outline:hover,
+.btn-info.btn-outline:hover,
+.btn-warning.btn-outline:hover,
+.btn-danger.btn-outline:hover {
+ color: #fff;
+}
+
+.chat {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.chat li {
+ margin-bottom: 10px;
+ padding-bottom: 5px;
+ border-bottom: 1px dotted #999;
+}
+
+.chat li.left .chat-body {
+ margin-left: 60px;
+}
+
+.chat li.right .chat-body {
+ margin-right: 60px;
+}
+
+.chat li .chat-body p {
+ margin: 0;
+}
+
+.panel .slidedown .glyphicon,
+.chat .glyphicon {
+ margin-right: 5px;
+}
+
+.chat-panel .panel-body {
+ height: 350px;
+ overflow-y: scroll;
+}
+
+.login-panel {
+ margin-top: 25%;
+}
+
+.flot-chart {
+ display: block;
+ height: 400px;
+}
+
+.flot-chart-content {
+ width: 100%;
+ height: 100%;
+}
+
+.dataTables_wrapper {
+ position: relative;
+ clear: both;
+}
+
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+ background: 0 0;
+}
+
+table.dataTable thead .sorting_asc:after {
+ content: "\f0de";
+ float: right;
+ font-family: fontawesome;
+}
+
+table.dataTable thead .sorting_desc:after {
+ content: "\f0dd";
+ float: right;
+ font-family: fontawesome;
+}
+
+table.dataTable thead .sorting:after {
+ content: "\f0dc";
+ float: right;
+ font-family: fontawesome;
+ color: rgba(50,50,50,.5);
+}
+
+.btn-circle {
+ width: 30px;
+ height: 30px;
+ padding: 6px 0;
+ border-radius: 15px;
+ text-align: center;
+ font-size: 12px;
+ line-height: 1.428571429;
+}
+
+.btn-circle.btn-lg {
+ width: 50px;
+ height: 50px;
+ padding: 10px 16px;
+ border-radius: 25px;
+ font-size: 18px;
+ line-height: 1.33;
+}
+
+.btn-circle.btn-xl {
+ width: 70px;
+ height: 70px;
+ padding: 10px 16px;
+ border-radius: 35px;
+ font-size: 24px;
+ line-height: 1.33;
+}
+
+.show-grid [class^=col-] {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ border: 1px solid #ddd;
+ background-color: #eee!important;
+}
+
+.show-grid {
+ margin: 15px 0;
+}
+
+.huge {
+ font-size: 40px;
+}
+
+.panel-green {
+ border-color: #5cb85c;
+}
+
+.panel-green .panel-heading {
+ border-color: #5cb85c;
+ color: #fff;
+ background-color: #5cb85c;
+}
+
+.panel-green a {
+ color: #5cb85c;
+}
+
+.panel-green a:hover {
+ color: #3d8b3d;
+}
+
+.panel-red {
+ border-color: #d9534f;
+}
+
+.panel-red .panel-heading {
+ border-color: #d9534f;
+ color: #fff;
+ background-color: #d9534f;
+}
+
+.panel-red a {
+ color: #d9534f;
+}
+
+.panel-red a:hover {
+ color: #b52b27;
+}
+
+.panel-yellow {
+ border-color: #f0ad4e;
+}
+
+.panel-yellow .panel-heading {
+ border-color: #f0ad4e;
+ color: #fff;
+ background-color: #f0ad4e;
+}
+
+.panel-yellow a {
+ color: #f0ad4e;
+}
+
+.panel-yellow a:hover {
+ color: #df8a13;
+} \ No newline at end of file
diff --git a/coding_assignment_project/static/js/sb-admin-2.js b/coding_assignment_project/static/js/sb-admin-2.js
new file mode 100644
index 0000000..96bc576
--- /dev/null
+++ b/coding_assignment_project/static/js/sb-admin-2.js
@@ -0,0 +1,31 @@
+
+//Loads the correct sidebar on window load,
+//collapses the sidebar on window resize.
+// Sets the min-height of #page-wrapper to window size
+$(function() {
+ $(window).bind("load resize", function() {
+ topOffset = 50;
+ width = (this.window.innerWidth > 0) ? this.window.innerWidth : this.screen.width;
+ if (width < 768) {
+ $('div.navbar-collapse').addClass('collapse');
+ topOffset = 100; // 2-row-menu
+ } else {
+ $('div.navbar-collapse').removeClass('collapse');
+ }
+
+ height = ((this.window.innerHeight > 0) ? this.window.innerHeight : this.screen.height) - 1;
+ height = height - topOffset;
+ if (height < 1) height = 1;
+ if (height > topOffset) {
+ $("#page-wrapper").css("min-height", (height) + "px");
+ }
+ });
+
+ var url = window.location;
+ var element = $('ul.nav a').filter(function() {
+ return this.href == url || url.href.indexOf(this.href) == 0;
+ }).addClass('active').parent().parent().addClass('in').parent();
+ if (element.is('li')) {
+ element.addClass('active');
+ }
+});
diff --git a/coding_assignment_project/templates/__init__.py b/coding_assignment_project/templates/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/coding_assignment_project/templates/__init__.py
diff --git a/coding_assignment_project/templates/base.html b/coding_assignment_project/templates/base.html
new file mode 100644
index 0000000..231c385
--- /dev/null
+++ b/coding_assignment_project/templates/base.html
@@ -0,0 +1,114 @@
+{% load static %}
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="description" content="">
+ <meta name="author" content="">
+
+ <title>Procurement Dashboard</title>
+
+ <!-- Bootstrap Core CSS -->
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
+
+ <!-- Custom CSS -->
+ <link href="{% static 'css/sb-admin-2.css' %}" rel="stylesheet">
+
+ <!-- Font Awesome -->
+ <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">
+
+ <!-- Lightsource Custom Styles -->
+ <link href="{% static 'css/lightsource-styles.css' %}" rel="stylesheet" type="text/css">
+
+ {% block additional_css %}
+ {% endblock %}
+</head>
+
+<body>
+
+ <div id="wrapper">
+
+ <!-- Navigation -->
+ <nav class="navbar navbar-default navbar-static-top lightsource-header" role="navigation" style="margin-bottom: 0">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="{% url 'component-search' %}">Light Source</a>
+ </div>
+ <!-- /.navbar-header -->
+
+
+ <div class="navbar-default sidebar" role="navigation">
+ <div class="sidebar-nav navbar-collapse">
+ <ul class="nav" id="side-menu">
+ <li class="sidebar-search">
+ <div class="input-group">
+ <h4><small></small></h4>
+ </div>
+ <!-- /input-group -->
+ </li>
+ <li>
+ <a href="{% url 'documentation' %}" {% if page_name == "documentation" %} class="active"{% endif %}><i class="fa fa-info-circle fa-fw"></i> Documentation</a>
+ </li>
+ <li>
+ <a href="{% url 'component-search' %}" {% if page_name == "source components" %} class="active"{% endif %}><i class="fa fa-th-list fa-fw"></i> Source Components</a>
+ </li>
+
+ </ul>
+ </div>
+ <!-- /.sidebar-collapse -->
+ </div>
+ <!-- /.navbar-static-side -->
+ </nav>
+
+ <div id="page-wrapper">
+ <div class="row" id="title-bar">
+ <div class="col-lg-12">
+ <h1 class="page-header">{{ page_name | title }}</h1>
+ </div>
+ <!-- /.col-lg-12 -->
+ </div>
+
+ <!-- /.row -->
+ <div class="row">
+ {% block main_content_area %}
+ {% endblock %}
+ </div>
+ <!-- /.row -->
+ </div>
+ <!-- /#page-wrapper -->
+
+ </div>
+ <!-- /#wrapper -->
+
+ <!-- jQuery -->
+ <script
+ src="https://code.jquery.com/jquery-3.3.1.min.js"
+ integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
+ crossorigin="anonymous"></script>
+
+ <script
+ src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"
+ integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU="
+ crossorigin="anonymous"></script>
+
+ <!-- Bootstrap Core JavaScript -->
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
+
+ <!-- Custom Theme JavaScript -->
+ <script src="{% static 'js/sb-admin-2.js' %}"></script>
+
+ {% block additional_js %}
+ {% endblock %}
+
+</body>
+
+</html>
diff --git a/coding_assignment_project/urls.py b/coding_assignment_project/urls.py
new file mode 100644
index 0000000..7fcafc7
--- /dev/null
+++ b/coding_assignment_project/urls.py
@@ -0,0 +1,7 @@
+from django.contrib import admin
+from django.urls import path, include
+
+urlpatterns = [
+ path('admin/', admin.site.urls),
+ path('', include('procurement.urls'))
+]
diff --git a/coding_assignment_project/wsgi.py b/coding_assignment_project/wsgi.py
new file mode 100644
index 0000000..3057f8d
--- /dev/null
+++ b/coding_assignment_project/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for coding_assignment_project project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'coding_assignment_project.settings')
+
+application = get_wsgi_application()