init basic project
This commit is contained in:
commit
d6f337c274
36 changed files with 506 additions and 0 deletions
3
.babelrc
Normal file
3
.babelrc
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"presets": ["es2015"]
|
||||
}
|
3
.buildpacks
Normal file
3
.buildpacks
Normal file
|
@ -0,0 +1,3 @@
|
|||
https://github.com/heroku/heroku-buildpack-nodejs
|
||||
https://github.com/romeovs/heroku-buildpack-npm-build
|
||||
https://github.com/heroku/heroku-buildpack-python
|
9
.eslintrc
Normal file
9
.eslintrc
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"extends": "./node_modules/eslint-config/.eslintrc",
|
||||
"rules": {
|
||||
"no-unused-vars": [2, {"vars": "all", "args": "none"}]
|
||||
},
|
||||
"globals": {
|
||||
"$": true
|
||||
}
|
||||
}
|
64
.gitignore
vendored
Normal file
64
.gitignore
vendored
Normal file
|
@ -0,0 +1,64 @@
|
|||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
env/
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
coverage/
|
||||
.tox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*,cover
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
collected-static/
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
|
||||
node_modules/
|
||||
media/
|
||||
database.db
|
1
.nvmrc
Normal file
1
.nvmrc
Normal file
|
@ -0,0 +1 @@
|
|||
5.11.1
|
1
.python-version
Normal file
1
.python-version
Normal file
|
@ -0,0 +1 @@
|
|||
3.4.2
|
1
Procfile
Normal file
1
Procfile
Normal file
|
@ -0,0 +1 @@
|
|||
web: waitress-serve --port $PORT project.wsgi:application
|
0
README.md
Normal file
0
README.md
Normal file
29
build
Executable file
29
build
Executable file
|
@ -0,0 +1,29 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ -z "$NVM_DIR" ]
|
||||
then
|
||||
NVM_DIR="$HOME/.nvm"
|
||||
fi
|
||||
|
||||
. $NVM_DIR/nvm.sh
|
||||
nvm install
|
||||
nvm use
|
||||
|
||||
set -e
|
||||
|
||||
if hash pyenv 2>/dev/null;
|
||||
then
|
||||
echo "using pyenv wrapper"
|
||||
pyenv install --skip-existing
|
||||
pyenv exec pyvenv env
|
||||
else
|
||||
echo "using pyvenv (Built in python)"
|
||||
pyvenv env
|
||||
fi
|
||||
|
||||
env/bin/pip install -r requirements.txt
|
||||
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
env/bin/python manage.py collectstatic --noinput
|
22
circle.yml
Normal file
22
circle.yml
Normal file
|
@ -0,0 +1,22 @@
|
|||
machine:
|
||||
python:
|
||||
version: 3.4.2
|
||||
node:
|
||||
version: 5.11.1
|
||||
environment:
|
||||
DEBUG: true
|
||||
DATABASE_URL: postgres://localhost/static-share
|
||||
EMAIL_BACKEND: django.core.mail.backends.console.EmailBackend
|
||||
SECRET_KEY: 123
|
||||
IN_TEST: true
|
||||
|
||||
dependencies:
|
||||
pre:
|
||||
- ./build
|
||||
cache_directories:
|
||||
- env
|
||||
- node_modules
|
||||
|
||||
test:
|
||||
override:
|
||||
- ./runtests
|
4
etc/environments/development/env
Normal file
4
etc/environments/development/env
Normal file
|
@ -0,0 +1,4 @@
|
|||
DEBUG=true
|
||||
DATABASE_URL=sqlite://./database.db
|
||||
EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
|
||||
SECRET_KEY=%*v!183hd8(4j)hg6ylyor34iq_um^&k!0pk_1efn_$j76=so2
|
1
etc/environments/development/procfile
Normal file
1
etc/environments/development/procfile
Normal file
|
@ -0,0 +1 @@
|
|||
web: manage.py runserver 0.0.0.0:$PORT
|
10
manage.py
Executable file
10
manage.py
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/env python
|
||||
import os
|
||||
import sys
|
||||
|
||||
if __name__ == "__main__":
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
|
||||
|
||||
from django.core.management import execute_from_command_line
|
||||
|
||||
execute_from_command_line(sys.argv)
|
43
package.json
Normal file
43
package.json
Normal file
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"name": "share-static",
|
||||
"version": "0.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "npm run lint",
|
||||
"lint": "eslint 'static/src/js/'",
|
||||
"create-build-dirs": "mkdir -p static/build/js static/build/css static/build/fonts static/build/img",
|
||||
"build-scss": "bash scripts/build-scss.sh",
|
||||
"build-js": "bash scripts/build-js.sh",
|
||||
"build-fonts": "cp -R node_modules/bootstrap-sass/assets/fonts/bootstrap/* static/build/fonts/ && cp -R node_modules/font-awesome/fonts static/build",
|
||||
"build": "npm run create-build-dirs && npm run build-scss && npm run build-js && npm run build-fonts"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/RealOrangeOne/static-share.git"
|
||||
},
|
||||
"author": "TheOrangeOne",
|
||||
"license": "ISC",
|
||||
"bugs": {
|
||||
"url": "https://github.com/RealOrangeOne/static-share/issues"
|
||||
},
|
||||
"homepage": "https://github.com/RealOrangeOne/static-share#readme",
|
||||
"dependencies": {
|
||||
"bootstrap-sass": "=3.3.7",
|
||||
"font-awesome": "=4.6.3",
|
||||
"jquery": "=2.1.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "=6.3.7",
|
||||
"babel-preset-es2015": "=6.9.0",
|
||||
"babelify": "=7.3.0",
|
||||
"browserify": "=13.1.0",
|
||||
"clean-css": "=3.4.19",
|
||||
"eslint": "=1.5.0",
|
||||
"eslint-config": "git://github.com/dabapps/eslint-config.git",
|
||||
"node-sass": "=3.8.0",
|
||||
"postcss-cli": "=2.5.2",
|
||||
"sass-lint": "=1.8.2",
|
||||
"uglify-js": "=2.7.0"
|
||||
}
|
||||
}
|
0
project/__init__.py
Normal file
0
project/__init__.py
Normal file
0
project/files/__init__.py
Normal file
0
project/files/__init__.py
Normal file
7
project/files/admin.py
Normal file
7
project/files/admin.py
Normal file
|
@ -0,0 +1,7 @@
|
|||
from django.contrib import admin
|
||||
from .models import SharedFile
|
||||
|
||||
|
||||
@admin.register(SharedFile)
|
||||
class SharedFileAdmin(admin.ModelAdmin):
|
||||
pass
|
0
project/files/migrations/__init__.py
Normal file
0
project/files/migrations/__init__.py
Normal file
3
project/files/tests.py
Normal file
3
project/files/tests.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
3
project/files/views.py
Normal file
3
project/files/views.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
0
project/pages/__init__.py
Normal file
0
project/pages/__init__.py
Normal file
8
project/pages/tests.py
Normal file
8
project/pages/tests.py
Normal file
|
@ -0,0 +1,8 @@
|
|||
from django.core.urlresolvers import reverse
|
||||
from django.test import TestCase
|
||||
|
||||
|
||||
class IndexPageTestCase(TestCase):
|
||||
def test_accessable(self):
|
||||
response = self.client.get(reverse("pages:index"))
|
||||
self.assertEqual(response.status_code, 200)
|
6
project/pages/urls.py
Normal file
6
project/pages/urls.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.IndexView.as_view(), name="index")
|
||||
]
|
5
project/pages/views.py
Normal file
5
project/pages/views.py
Normal file
|
@ -0,0 +1,5 @@
|
|||
from django.views.generic import TemplateView
|
||||
|
||||
|
||||
class IndexView(TemplateView):
|
||||
template_name = 'index.html'
|
156
project/settings.py
Normal file
156
project/settings.py
Normal file
|
@ -0,0 +1,156 @@
|
|||
import dj_database_url
|
||||
import os
|
||||
import logging
|
||||
|
||||
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['SECRET_KEY']
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = os.environ.get('DEBUG', True)
|
||||
|
||||
ALLOWED_HOSTS = []
|
||||
|
||||
|
||||
# Application definition
|
||||
|
||||
INSTALLED_APPS = (
|
||||
'flat',
|
||||
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
|
||||
'project.files',
|
||||
'project.pages'
|
||||
)
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'django.middleware.security.SecurityMiddleware'
|
||||
)
|
||||
|
||||
ROOT_URLCONF = 'project.urls'
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [os.path.join(BASE_DIR, '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 = 'project.wsgi.application'
|
||||
|
||||
if 'OPBEAT_SECRET_TOKEN' in os.environ and 'IN_TEST' not in os.environ:
|
||||
OPBEAT = {
|
||||
'ORGANIZATION_ID': os.environ['OPBEAT_ORGANIZATION_ID'],
|
||||
'APP_ID': os.environ['OPBEAT_APP_ID'],
|
||||
'SECRET_TOKEN': os.environ['OPBEAT_SECRET_TOKEN'],
|
||||
}
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
'opbeat.contrib.django.middleware.OpbeatAPMMiddleware',
|
||||
) + MIDDLEWARE_CLASSES
|
||||
|
||||
INSTALLED_APPS = (
|
||||
"opbeat.contrib.django",
|
||||
) + INSTALLED_APPS
|
||||
|
||||
|
||||
# Database
|
||||
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
|
||||
|
||||
DATABASES = {
|
||||
'default': dj_database_url.config(default=os.environ['DATABASE_URL'])
|
||||
}
|
||||
|
||||
EMAIL_BACKEND = os.environ['EMAIL_BACKEND']
|
||||
|
||||
|
||||
LANGUAGE_CODE = 'en-gb'
|
||||
|
||||
TIME_ZONE = 'UTC'
|
||||
|
||||
USE_I18N = True
|
||||
|
||||
USE_L10N = True
|
||||
|
||||
USE_TZ = True
|
||||
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': True,
|
||||
'filters': {
|
||||
'request_id': {
|
||||
'()': 'log_request_id.filters.RequestIDFilter'
|
||||
}
|
||||
},
|
||||
'formatters': {
|
||||
'standard': {
|
||||
'format': 'at=%(levelname)s request_id=%(request_id)s logger=%(name)s %(message)s',
|
||||
},
|
||||
},
|
||||
'handlers': {
|
||||
'console': {
|
||||
'level': 'DEBUG',
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'standard',
|
||||
'filters': ['request_id'],
|
||||
},
|
||||
},
|
||||
'root': {
|
||||
'handlers': ['console'],
|
||||
'level': 'INFO',
|
||||
},
|
||||
'loggers': {
|
||||
'django.request': {
|
||||
'handlers': ['console'],
|
||||
'level': 'ERROR',
|
||||
'propagate': False,
|
||||
},
|
||||
'log_request_id.middleware': {
|
||||
'level': 'INFO',
|
||||
'propagate': True,
|
||||
},
|
||||
'project': {
|
||||
'level': 'DEBUG',
|
||||
'propagate': True,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
if 'IN_TEST' in os.environ:
|
||||
logging.disable(logging.ERROR)
|
||||
|
||||
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
STATIC_ROOT = os.path.join(BASE_DIR, 'collected-static')
|
||||
|
||||
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
|
||||
|
||||
STATICFILES_DIRS = (
|
||||
os.path.join(BASE_DIR, 'static', 'build'),
|
||||
)
|
||||
|
||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
||||
MEDIA_URL = '/media/'
|
12
project/urls.py
Normal file
12
project/urls.py
Normal file
|
@ -0,0 +1,12 @@
|
|||
from django.conf.urls import include, url
|
||||
from django.contrib import admin
|
||||
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^admin/', include(admin.site.urls)),
|
||||
url(r'', include("project.pages.urls", namespace="pages"))
|
||||
]
|
||||
|
||||
|
||||
urlpatterns += staticfiles_urlpatterns()
|
15
project/wsgi.py
Normal file
15
project/wsgi.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
"""
|
||||
WSGI config for twm 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/1.8/howto/deployment/wsgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
from whitenoise.django import DjangoWhiteNoise
|
||||
|
||||
application = get_wsgi_application()
|
||||
application = DjangoWhiteNoise(application)
|
11
requirements.txt
Normal file
11
requirements.txt
Normal file
|
@ -0,0 +1,11 @@
|
|||
coverage==3.7.1
|
||||
dj-database-url==0.4.1
|
||||
django==1.8.13
|
||||
django-shortuuidfield==0.1.3
|
||||
django-flat-theme==1.1.3
|
||||
django-log-request-id==1.1.0
|
||||
flake8==2.5.4
|
||||
opbeat==3.3.4
|
||||
psycopg2==2.6.1
|
||||
waitress==0.9.0
|
||||
whitenoise==3.2.0
|
16
runtests
Executable file
16
runtests
Executable file
|
@ -0,0 +1,16 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
TEST_ARGS=$@
|
||||
|
||||
export PATH=env/bin:${PATH}
|
||||
|
||||
export IN_TEST=true
|
||||
|
||||
coverage run --source=project --omit='*/wsgi.py,*/settings.py,*/migrations/*.py,*__init__*,*/tests.py' manage.py test $TEST_ARGS
|
||||
flake8 project --ignore=E128,E501 --exclude="migrations,*/wsgi.py"
|
||||
coverage report
|
||||
coverage html
|
||||
|
||||
npm test
|
21
scripts/build-js.sh
Normal file
21
scripts/build-js.sh
Normal file
|
@ -0,0 +1,21 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
if [ "$NODE_ENV" = "production" ]
|
||||
then
|
||||
echo ">>> WARNING: Building in Production Mode!"
|
||||
fi
|
||||
|
||||
uglifyjs node_modules/jquery/dist/jquery.js --compress --screw-ie8 --define --stats --keep-fnames -o static/build/js/jquery.js
|
||||
|
||||
echo ">> Building Application JS..."
|
||||
browserify -t [ babelify ] static/src/js/app.js -o static/build/js/app.js
|
||||
|
||||
if [ "$NODE_ENV" = "production" ]
|
||||
then
|
||||
echo ">> Compressing Application..."
|
||||
uglifyjs static/build/js/app.js --compress --screw-ie8 --define --stats --keep-fnames -o static/build/js/app.js
|
||||
fi
|
||||
|
||||
echo "> JS Built!"
|
20
scripts/build-scss.sh
Normal file
20
scripts/build-scss.sh
Normal file
|
@ -0,0 +1,20 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
if [ "$NODE_ENV" = "production" ]
|
||||
then
|
||||
echo ">>> WARNING: Building in Production Mode!"
|
||||
fi
|
||||
|
||||
echo ">> Building SCSS..."
|
||||
node-sass static/src/scss/index.scss static/build/css/index.css --source-map-embed
|
||||
|
||||
echo ">> Post-Processing..."
|
||||
postcss -u autoprefixer -o static/build/css/index.css static/build/css/index.css
|
||||
|
||||
if [ "$NODE_ENV" = "production" ]
|
||||
then
|
||||
echo ">> Compressing CSS..."
|
||||
cleancss -d --s0 -o static/build/css/index.css static/build/css/index.css
|
||||
fi
|
1
static/src/js/app.js
Normal file
1
static/src/js/app.js
Normal file
|
@ -0,0 +1 @@
|
|||
import 'bootstrap-sass/assets/javascripts/bootstrap.js';
|
9
static/src/scss/index.scss
Normal file
9
static/src/scss/index.scss
Normal file
|
@ -0,0 +1,9 @@
|
|||
@import "variables"; // Import variables before anything else
|
||||
|
||||
$icon-font-path: "../fonts/";
|
||||
@import "node_modules/bootstrap-sass/assets/stylesheets/_bootstrap";
|
||||
|
||||
$fa-font-path: $icon-font-path;
|
||||
@import "node_modules/font-awesome/scss/font-awesome";
|
||||
|
||||
@import url("https://fonts.googleapis.com/css?family=Roboto:400,700,300,300italic,400italic,700italic");
|
1
static/src/scss/variables.scss
Normal file
1
static/src/scss/variables.scss
Normal file
|
@ -0,0 +1 @@
|
|||
$font-family-base: "Roboto", "Helvetica Neue", Arial, sans-serif;
|
14
templates/base.html
Normal file
14
templates/base.html
Normal file
|
@ -0,0 +1,14 @@
|
|||
{% load staticfiles %}
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
|
||||
<title>{% block title %}{% endblock %} | StaticShare</title>
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/index.css' %}" />
|
||||
<script src="{% static 'js/jquery.js' %}"></script>
|
||||
</head>
|
||||
<body>
|
||||
{% block content %}{% endblock %}
|
||||
<script src="{% static 'js/app.js' %}"></script>
|
||||
</body>
|
||||
</html>
|
7
templates/index.html
Normal file
7
templates/index.html
Normal file
|
@ -0,0 +1,7 @@
|
|||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Homepage{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Index</h1>
|
||||
{% endblock %}
|
Reference in a new issue