Merge branch 'psql'
This commit is contained in:
commit
9f33c16619
8
.gitignore
vendored
8
.gitignore
vendored
|
@ -1,2 +1,10 @@
|
|||
static
|
||||
data
|
||||
*.pyc
|
||||
__pycache__
|
||||
venv
|
||||
local_settings.py
|
||||
camp.json
|
||||
*.swp
|
||||
*.swo
|
||||
secret.txt
|
||||
|
|
|
@ -15,7 +15,6 @@ 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/1.11/howto/deployment/checklist/
|
||||
|
||||
|
@ -34,12 +33,20 @@ INSTALLED_APPS = [
|
|||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'django.contrib.sites',
|
||||
|
||||
'braces',
|
||||
'django_extensions',
|
||||
'markdownx',
|
||||
'photologue',
|
||||
'sortedm2m',
|
||||
|
||||
'camp',
|
||||
'content',
|
||||
]
|
||||
|
||||
SITE_ID = 1
|
||||
|
||||
MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
|
@ -56,13 +63,19 @@ TEMPLATES = [
|
|||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [],
|
||||
'APP_DIRS': True,
|
||||
'APP_DIRS': False,
|
||||
'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',
|
||||
'django.template.context_processors.media',
|
||||
],
|
||||
'loaders': [
|
||||
'app_namespace.Loader',
|
||||
'django.template.loaders.filesystem.Loader',
|
||||
'django.template.loaders.app_directories.Loader',
|
||||
],
|
||||
},
|
||||
},
|
||||
|
@ -76,10 +89,9 @@ WSGI_APPLICATION = 'camp.wsgi.application'
|
|||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql',
|
||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||
'NAME': 'camp',
|
||||
'USER': 'root',
|
||||
'PASSWORD': 'sqlsql'
|
||||
'USER': '',
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -116,12 +128,19 @@ USE_L10N = True
|
|||
|
||||
USE_TZ = True
|
||||
|
||||
PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
# Static files (CSS, JavaScript, Images)
|
||||
# https://docs.djangoproject.com/en/1.11/howto/static-files/
|
||||
STATIC_URL = '/static/'
|
||||
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
|
||||
|
||||
MARKDOWNX_MEDIA_PATH = 'images/markdown'
|
||||
MARKDOWNX_EDITOR_RESIZABLE = True
|
||||
|
||||
MEDIA_URL = '/static/images/'
|
||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'data/images')
|
||||
|
||||
IMAGE_PREFIX = 'http://studio.camp/images/'
|
||||
|
||||
|
|
BIN
camp/static/css/controls.png
Normal file
BIN
camp/static/css/controls.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
|
@ -14,6 +14,8 @@
|
|||
* 3. Prevent adjustments of font size after orientation changes in
|
||||
* IE on Windows Phone and in iOS.
|
||||
*/
|
||||
|
||||
|
||||
html {
|
||||
font-family: sans-serif;
|
||||
/* 1 */
|
||||
|
@ -3528,16 +3530,14 @@ table {
|
|||
text-align: left; }
|
||||
table tbody th,
|
||||
table tbody td {
|
||||
padding: 0.5rem 0.625rem 0.625rem; }
|
||||
padding: 0.25rem 0.25rem 0.25rem; }
|
||||
table tbody tr:nth-child(even) {
|
||||
border-bottom: 0;
|
||||
background-color: #f1f1f1; }
|
||||
table.unstriped tbody {
|
||||
background-color: #fefefe; }
|
||||
}
|
||||
table.unstriped tbody tr {
|
||||
border-bottom: 0;
|
||||
border-bottom: 1px solid #f1f1f1;
|
||||
background-color: #fefefe; }
|
||||
border-bottom: 1px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 63.9375em) {
|
||||
table.stack thead {
|
||||
|
@ -3636,10 +3636,7 @@ table.hover:not(.unstriped) tr:nth-of-type(even):hover {
|
|||
.thumbnail {
|
||||
display: inline-block;
|
||||
max-width: 100%;
|
||||
margin-bottom: 1rem;
|
||||
border: solid 4px #fefefe;
|
||||
border-radius: 0;
|
||||
box-shadow: 0 0 0 1px rgba(10, 10, 10, 0.2);
|
||||
margin-bottom: 0.2rem;
|
||||
line-height: 0; }
|
||||
|
||||
a.thumbnail {
|
170
camp/static/css/jquery.bxslider.css
Normal file
170
camp/static/css/jquery.bxslider.css
Normal file
|
@ -0,0 +1,170 @@
|
|||
/** VARIABLES
|
||||
===================================*/
|
||||
/** RESET AND LAYOUT
|
||||
===================================*/
|
||||
.bx-wrapper {
|
||||
position: relative;
|
||||
margin-bottom: 60px;
|
||||
padding: 0;
|
||||
*zoom: 1;
|
||||
-ms-touch-action: pan-y;
|
||||
touch-action: pan-y;
|
||||
}
|
||||
.bx-wrapper img {
|
||||
max-width: 100%;
|
||||
display: block;
|
||||
}
|
||||
.bxslider {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
ul.bxslider {
|
||||
list-style: none;
|
||||
}
|
||||
.bx-viewport {
|
||||
/*fix other elements on the page moving (on Chrome)*/
|
||||
-webkit-transform: translatez(0);
|
||||
}
|
||||
/** THEME
|
||||
===================================*/
|
||||
|
||||
.bx-wrapper .bx-pager,
|
||||
.bx-wrapper .bx-controls-auto {
|
||||
position: absolute;
|
||||
bottom: -30px;
|
||||
width: 100%;
|
||||
}
|
||||
/* LOADER */
|
||||
.bx-wrapper .bx-loading {
|
||||
min-height: 50px;
|
||||
height: auto;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 2000;
|
||||
}
|
||||
/* PAGER */
|
||||
.bx-wrapper .bx-pager {
|
||||
text-align: center;
|
||||
font-size: .85em;
|
||||
font-family: Arial;
|
||||
font-weight: bold;
|
||||
color: #666;
|
||||
padding-top: 20px;
|
||||
}
|
||||
.bx-wrapper .bx-pager.bx-default-pager a {
|
||||
background: #666;
|
||||
text-indent: -9999px;
|
||||
display: block;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
margin: 0 5px;
|
||||
outline: 0;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.bx-wrapper .bx-pager.bx-default-pager a:hover,
|
||||
.bx-wrapper .bx-pager.bx-default-pager a.active,
|
||||
.bx-wrapper .bx-pager.bx-default-pager a:focus {
|
||||
background: #000;
|
||||
}
|
||||
.bx-wrapper .bx-pager-item,
|
||||
.bx-wrapper .bx-controls-auto .bx-controls-auto-item {
|
||||
display: inline-block;
|
||||
vertical-align: bottom;
|
||||
*zoom: 1;
|
||||
*display: inline;
|
||||
}
|
||||
.bx-wrapper .bx-pager-item {
|
||||
font-size: 0;
|
||||
line-height: 0;
|
||||
}
|
||||
/* DIRECTION CONTROLS (NEXT / PREV) */
|
||||
.bx-wrapper .bx-prev {
|
||||
left: 10px;
|
||||
background: url('controls.png') no-repeat 0 -32px;
|
||||
}
|
||||
.bx-wrapper .bx-prev:hover,
|
||||
.bx-wrapper .bx-prev:focus {
|
||||
background-position: 0 0;
|
||||
}
|
||||
.bx-wrapper .bx-next {
|
||||
right: 30px;
|
||||
background: url('controls.png') no-repeat -43px -32px;
|
||||
}
|
||||
.bx-wrapper .bx-next:hover,
|
||||
.bx-wrapper .bx-next:focus {
|
||||
background-position: -43px 0;
|
||||
}
|
||||
.bx-wrapper .bx-controls-direction a {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
margin-top: -16px;
|
||||
outline: 0;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
text-indent: -9999px;
|
||||
z-index: 9999;
|
||||
}
|
||||
.bx-wrapper .bx-controls-direction a.disabled {
|
||||
display: none;
|
||||
}
|
||||
/* AUTO CONTROLS (START / STOP) */
|
||||
.bx-wrapper .bx-controls-auto {
|
||||
text-align: center;
|
||||
}
|
||||
.bx-wrapper .bx-controls-auto .bx-start {
|
||||
display: block;
|
||||
text-indent: -9999px;
|
||||
width: 10px;
|
||||
height: 11px;
|
||||
outline: 0;
|
||||
background: url('images/controls.png') -86px -11px no-repeat;
|
||||
margin: 0 3px;
|
||||
}
|
||||
.bx-wrapper .bx-controls-auto .bx-start:hover,
|
||||
.bx-wrapper .bx-controls-auto .bx-start.active,
|
||||
.bx-wrapper .bx-controls-auto .bx-start:focus {
|
||||
background-position: -86px 0;
|
||||
}
|
||||
.bx-wrapper .bx-controls-auto .bx-stop {
|
||||
display: block;
|
||||
text-indent: -9999px;
|
||||
width: 9px;
|
||||
height: 11px;
|
||||
outline: 0;
|
||||
background: url('images/controls.png') -86px -44px no-repeat;
|
||||
margin: 0 3px;
|
||||
}
|
||||
.bx-wrapper .bx-controls-auto .bx-stop:hover,
|
||||
.bx-wrapper .bx-controls-auto .bx-stop.active,
|
||||
.bx-wrapper .bx-controls-auto .bx-stop:focus {
|
||||
background-position: -86px -33px;
|
||||
}
|
||||
/* PAGER WITH AUTO-CONTROLS HYBRID LAYOUT */
|
||||
.bx-wrapper .bx-controls.bx-has-controls-auto.bx-has-pager .bx-pager {
|
||||
text-align: left;
|
||||
width: 80%;
|
||||
}
|
||||
.bx-wrapper .bx-controls.bx-has-controls-auto.bx-has-pager .bx-controls-auto {
|
||||
right: 0;
|
||||
width: 35px;
|
||||
}
|
||||
/* IMAGE CAPTIONS */
|
||||
.bx-wrapper .bx-caption {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
background: #666;
|
||||
background: rgba(80, 80, 80, 0.75);
|
||||
width: 100%;
|
||||
}
|
||||
.bx-wrapper .bx-caption span {
|
||||
color: #fff;
|
||||
font-family: Arial;
|
||||
display: block;
|
||||
font-size: .85em;
|
||||
padding: 10px;
|
||||
}
|
144
camp/static/css/main.css
Normal file
144
camp/static/css/main.css
Normal file
|
@ -0,0 +1,144 @@
|
|||
body {
|
||||
background-color: #000000 !important;
|
||||
font-size: 14px !important;
|
||||
color: #ffffff !important;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.content_detail {
|
||||
width: 70%;
|
||||
padding-left: 5%;
|
||||
}
|
||||
|
||||
.right-items {
|
||||
padding-bottom: 0.5em;
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
|
||||
body, h1, h2, h3, h4, h5, h6 {
|
||||
font-family: Open Sans !important;
|
||||
}
|
||||
|
||||
|
||||
.sidebar-h4 {
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
font-size: 14px;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.sidebar-title {
|
||||
text-transform: capitalize;
|
||||
font-weight: 800;
|
||||
font-style: italic;
|
||||
font-size: 14px;
|
||||
color: #1779ba;
|
||||
}
|
||||
|
||||
.sidebar-title :hover {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
a:focus, a:hover {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
.sidebar-date {
|
||||
text-transform: uppercase;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.news {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.special-column {
|
||||
padding-left: 0em !important;
|
||||
}
|
||||
|
||||
.index-text {
|
||||
padding-left: 3%;
|
||||
padding-right: 1%;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.index-text p {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.title-bar-right {
|
||||
margin-right: 2em;
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
.menu-icon::after{
|
||||
background: #ffffff none repeat scroll 0 0 !important;
|
||||
box-shadow: 0 7px 0 #ffffff, 0 14px 0 #ffffff !important;
|
||||
}
|
||||
|
||||
.big-title {
|
||||
color: #ffffff;
|
||||
font-weight: 600;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.big-date {
|
||||
font-size: 1em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.vertical-menu li {
|
||||
list-style: none;
|
||||
padding-top: 2em;
|
||||
padding-left: 1em;
|
||||
font-weight: 600;
|
||||
font-size: 1em;
|
||||
color: #ef4e5c;
|
||||
background-color: #dddddd;
|
||||
}
|
||||
|
||||
.off-canvas {
|
||||
background-color: #dddddd !important;
|
||||
}
|
||||
|
||||
.position-right.is-transition-push::after {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
ul.clearing-thumbs li {
|
||||
list-style: none;
|
||||
display: inline;
|
||||
padding-right: 3px;
|
||||
}
|
||||
|
||||
|
||||
.page-header {
|
||||
margin-top: 30px;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
.thumbnail {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.results {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.results-title {
|
||||
padding-top: 20px;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
.pagination a, .pagination button {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
.pagination a:hover,
|
||||
.pagination button:hover {
|
||||
background: #1779ba !important; }
|
||||
|
33
camp/static/css/unslider-dots.css
Executable file
33
camp/static/css/unslider-dots.css
Executable file
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
* Here's where everything gets included. You don't need
|
||||
* to change anything here, and doing so might break
|
||||
* stuff. Here be dragons and all that.
|
||||
*/
|
||||
/**
|
||||
* Default variables
|
||||
*
|
||||
* While these can be set with JavaScript, it's probably
|
||||
* better and faster to just set them here, compile to
|
||||
* CSS and include that instead to use some of that
|
||||
* hardware-accelerated goodness.
|
||||
*/
|
||||
.unslider-nav ol {
|
||||
list-style: none;
|
||||
text-align: center;
|
||||
}
|
||||
.unslider-nav ol li {
|
||||
display: inline-block;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
margin: 0 4px;
|
||||
background: transparent;
|
||||
border-radius: 5px;
|
||||
overflow: hidden;
|
||||
text-indent: -999em;
|
||||
border: 2px solid #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
.unslider-nav ol li.unslider-active {
|
||||
background: #fff;
|
||||
cursor: default;
|
||||
}
|
1
camp/static/css/unslider.css
Executable file
1
camp/static/css/unslider.css
Executable file
|
@ -0,0 +1 @@
|
|||
.unslider{overflow:auto;margin:0;padding:0}.unslider-wrap{position:relative}.unslider-wrap.unslider-carousel>li{float:left}.unslider-vertical>ul{height:100%}.unslider-vertical li{float:none;width:100%}.unslider-fade{position:relative}.unslider-fade .unslider-wrap li{position:absolute;left:0;top:0;right:0;z-index:8}.unslider-fade .unslider-wrap li.unslider-active{z-index:10}.unslider li,.unslider ol,.unslider ul{list-style:none;margin:0;padding:0;border:none}.unslider-arrow{position:absolute;left:20px;z-index:2;cursor:pointer}.unslider-arrow.next{left:auto;right:20px}
|
1607
camp/static/js/jquery.bxslider.js
Normal file
1607
camp/static/js/jquery.bxslider.js
Normal file
File diff suppressed because it is too large
Load Diff
1
camp/static/js/unslider.min.js
vendored
Executable file
1
camp/static/js/unslider.min.js
vendored
Executable file
|
@ -0,0 +1 @@
|
|||
(function(e,t){if(!e)return t;var n=function(){this.el=t;this.items=t;this.sizes=[];this.max=[0,0];this.current=0;this.interval=t;this.opts={speed:500,delay:3e3,complete:t,keys:!t,dots:t,fluid:t};var n=this;this.init=function(t,n){this.el=t;this.ul=t.children("ul");this.max=[t.outerWidth(),t.outerHeight()];this.items=this.ul.children("li").each(this.calculate);this.opts=e.extend(this.opts,n);this.setup();return this};this.calculate=function(t){var r=e(this),i=r.outerWidth(),s=r.outerHeight();n.sizes[t]=[i,s];if(i>n.max[0])n.max[0]=i;if(s>n.max[1])n.max[1]=s};this.setup=function(){this.el.css({overflow:"hidden",width:n.max[0],height:this.items.first().outerHeight()});this.ul.css({width:this.items.length*100+"%",position:"relative"});this.items.css("width",100/this.items.length+"%");if(this.opts.delay!==t){this.start();this.el.hover(this.stop,this.start)}this.opts.keys&&e(document).keydown(this.keys);this.opts.dots&&this.dots();if(this.opts.fluid){var r=function(){n.el.css("width",Math.min(Math.round(n.el.outerWidth()/n.el.parent().outerWidth()*100),100)+"%")};r();e(window).resize(r)}if(this.opts.arrows){this.el.parent().append('<p class="arrows"><span class="prev">â†</span><span class="next">→</span></p>').find(".arrows span").click(function(){e.isFunction(n[this.className])&&n[this.className]()})}if(e.event.swipe){this.el.on("swipeleft",n.prev).on("swiperight",n.next)}};this.move=function(t,r){if(!this.items.eq(t).length)t=0;if(t<0)t=this.items.length-1;var i=this.items.eq(t);var s={height:i.outerHeight()};var o=r?5:this.opts.speed;if(!this.ul.is(":animated")){n.el.find(".dot:eq("+t+")").addClass("active").siblings().removeClass("active");this.el.animate(s,o)&&this.ul.animate(e.extend({left:"-"+t+"00%"},s),o,function(i){n.current=t;e.isFunction(n.opts.complete)&&!r&&n.opts.complete(n.el)})}};this.start=function(){n.interval=setInterval(function(){n.move(n.current+1)},n.opts.delay)};this.stop=function(){n.interval=clearInterval(n.interval);return n};this.keys=function(t){var r=t.which;var i={37:n.prev,39:n.next,27:n.stop};if(e.isFunction(i[r])){i[r]()}};this.next=function(){return n.stop().move(n.current+1)};this.prev=function(){return n.stop().move(n.current-1)};this.dots=function(){var t='<ol class="dots">';e.each(this.items,function(e){t+='<li class="dot'+(e<1?" active":"")+'">'+(e+1)+"</li>"});t+="</ol>";this.el.addClass("has-dots").append(t).find(".dot").click(function(){n.move(e(this).index())})}};e.fn.unslider=function(t){var r=this.length;return this.each(function(i){var s=e(this);var u=(new n).init(s,t);s.data("unslider"+(r>1?"-"+(i+1):""),u)})}})(window.jQuery,false)
|
38
camp/urls.py
38
camp/urls.py
|
@ -13,13 +13,19 @@ Including another URLconf
|
|||
1. Import the include() function: from django.conf.urls import url, include
|
||||
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.conf.urls import url
|
||||
from django.conf import settings
|
||||
from django.conf.urls import url, include
|
||||
from django.conf.urls.static import static
|
||||
from django.contrib import admin
|
||||
from django.views.generic import RedirectView
|
||||
|
||||
from markdownx import urls as markdownx
|
||||
from photologue.views import GalleryListView
|
||||
|
||||
from content import views
|
||||
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^admin/', admin.site.urls),
|
||||
url(r'^$', views.index, name='index'),
|
||||
|
@ -28,16 +34,26 @@ urlpatterns = [
|
|||
url(r'^.*event.php$', views.redirect_event, name='redirect_event'),
|
||||
url(r'^.*(/images/.*)$', views.redirect_images, name='redirect_images'),
|
||||
url(r'directions.html', RedirectView.as_view(url='/directions/')),
|
||||
url(r'campstudio.html', RedirectView.as_view(url='/directions/')),
|
||||
|
||||
url(r'^projects/', views.projects, name='projects'),
|
||||
url(r'^events/', views.events, name='events'),
|
||||
url(r'^works/', views.works, name='works'),
|
||||
url(r'^texts/', views.texts, name='texts'),
|
||||
|
||||
url(r'^about/', views.about, name='about'),
|
||||
url(r'^contact/', views.contact, name='contact'),
|
||||
|
||||
|
||||
url(r'^(?P<shortname>.+)/$', views.content, name='content'),
|
||||
url(r'^texts/(?P<shortname>.+)/$', views.texts, name='texts'),
|
||||
url(r'^events/(?P<shortname>.+)/$', views.events, name='events'),
|
||||
url(r'^projects/(?P<shortname>.+)/$', views.projects, name='projects'),
|
||||
url(r'^works/(?P<shortname>.+)/$', views.works, name='works'),
|
||||
url(r'^works/$', views.works),
|
||||
url(r'^projects/$', views.projects),
|
||||
url(r'^events/$', views.events),
|
||||
url(r'^texts/$', views.texts),
|
||||
url(r'^search/$', views.search),
|
||||
url(r'^markdownx/', include(markdownx)),
|
||||
url(r'^photologue/', include('photologue.urls', namespace='photologue')),
|
||||
url(r'^gallerylist/$', GalleryListView.as_view(), name='gallery-list'),
|
||||
]
|
||||
|
||||
if settings.DEBUG:
|
||||
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
||||
|
||||
urlpatterns += [
|
||||
url(r'^(?P<shortname>\w+)/$', views.page, name='page')
|
||||
]
|
||||
|
||||
|
|
|
@ -1,10 +1,29 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django import forms
|
||||
from django.contrib import admin
|
||||
|
||||
from markdownx.admin import MarkdownxModelAdmin
|
||||
from markdownx.widgets import AdminMarkdownxWidget
|
||||
# Register your models here.
|
||||
from . import models
|
||||
from models import *
|
||||
|
||||
from photologue.admin import GalleryAdmin as GalleryAdminDefault
|
||||
from photologue.models import Gallery
|
||||
|
||||
|
||||
class ContentParentsInline(admin.TabularInline):
|
||||
model = ContentContent
|
||||
fk_name = 'contentid2'
|
||||
raw_id_fields = ['contentid1']
|
||||
|
||||
class ImagesInline(admin.StackedInline):
|
||||
model = Image
|
||||
|
||||
class FileInline(admin.StackedInline):
|
||||
model = File
|
||||
|
||||
class LinkInline(admin.StackedInline):
|
||||
model = Link
|
||||
|
||||
'''
|
||||
class SubdomainInline(admin.StackedInline):
|
||||
|
@ -17,31 +36,34 @@ class ServerAdmin(admin.ModelAdmin):
|
|||
pass
|
||||
'''
|
||||
|
||||
class ResourcesAdmin(admin.ModelAdmin):
|
||||
list_display = ('__unicode__', 'type', 'mime')
|
||||
search_fields = ['href']
|
||||
list_filter = ['type', 'mime']
|
||||
class GalleryAdminForm(forms.ModelForm):
|
||||
"""Users never need to enter a description on a gallery."""
|
||||
|
||||
admin.site.register(models.Resources, ResourcesAdmin)
|
||||
class Meta:
|
||||
model = Gallery
|
||||
exclude = ['description']
|
||||
|
||||
|
||||
class ResourcesInline(admin.StackedInline):
|
||||
model = models.ContentResource
|
||||
extra = 2 # how many rows to show
|
||||
|
||||
class GalleryAdmin(GalleryAdminDefault):
|
||||
form = GalleryAdminForm
|
||||
|
||||
class ContentAdmin(admin.ModelAdmin):
|
||||
save_on_top = True
|
||||
list_display = ('__unicode__', 'datestart', 'type')
|
||||
list_filter = ['datestart', 'type', 'view', 'published']
|
||||
search_fields = ['title', 'body', 'header']
|
||||
raw_id_fields = ['parent']
|
||||
list_display = ('__unicode__', 'datestart', 'shortname', 'type')
|
||||
list_filter = ['datestart', 'type']
|
||||
search_fields = ['title', 'body', 'header', 'shortname']
|
||||
inlines = [ContentParentsInline, ImagesInline, FileInline, LinkInline]
|
||||
formfield_overrides = {
|
||||
models.TextField: {'widget': AdminMarkdownxWidget},
|
||||
}
|
||||
|
||||
inlines = (ResourcesInline,)
|
||||
|
||||
# inlines = [SubdomainInline, DomainAliasInline]
|
||||
# list_display = ('url', 'server', 'manage_nameserver', 'domain_registrar', 'email', 'is_active')
|
||||
# list_editable = ('server', 'manage_nameserver', 'domain_registrar', 'email', 'is_active')
|
||||
|
||||
|
||||
admin.site.register(models.Content, ContentAdmin)
|
||||
admin.site.register(Content, ContentAdmin)
|
||||
admin.site.unregister(Gallery)
|
||||
admin.site.register(Gallery, GalleryAdmin)
|
||||
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.1 on 2017-05-23 09:35
|
||||
# Generated by Django 1.11.1 on 2017-06-10 11:51
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -21,7 +22,6 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'acrolike',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -36,7 +36,6 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'acronym',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -49,7 +48,6 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'audios',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -68,6 +66,35 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'comments',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Content',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('shortname', models.CharField(db_column='shortName', max_length=255)),
|
||||
('title', models.CharField(max_length=255)),
|
||||
('header', models.TextField(blank=True, null=True)),
|
||||
('body', models.TextField(blank=True, null=True)),
|
||||
('schedule', models.TextField(blank=True, null=True)),
|
||||
('schedulebutton', models.CharField(blank=True, db_column='scheduleButton', max_length=255, null=True)),
|
||||
('optbtn2', models.CharField(blank=True, db_column='optBtn2', max_length=127, null=True)),
|
||||
('opttext2', models.TextField(blank=True, db_column='optText2', null=True)),
|
||||
('optbtn3', models.CharField(blank=True, db_column='optBtn3', max_length=127, null=True)),
|
||||
('opttext3', models.TextField(blank=True, db_column='optText3', null=True)),
|
||||
('technotes', models.TextField(blank=True, db_column='technotes', null=True)),
|
||||
('image', models.CharField(blank=True, max_length=150, null=True)),
|
||||
('postedby', models.CharField(blank=True, db_column='postedBy', max_length=50, null=True)),
|
||||
('datestart', models.DateField(blank=True, db_column='dateStart', null=True)),
|
||||
('dateend', models.DateField(blank=True, db_column='dateEnd', null=True)),
|
||||
('dateadded', models.DateTimeField(db_column='dateAdded')),
|
||||
('datemodified', models.DateTimeField(blank=True, db_column='dateModified', null=True)),
|
||||
('published', models.IntegerField()),
|
||||
('place', models.CharField(blank=True, max_length=255, null=True)),
|
||||
('parentid', models.IntegerField(blank=True, db_column='parentID', null=True)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'content',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
|
@ -75,12 +102,11 @@ class Migration(migrations.Migration):
|
|||
name='ContentContent',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('contentid1', models.IntegerField(db_column='contentID1')),
|
||||
('contentid2', models.IntegerField(db_column='contentID2')),
|
||||
('contentid1', models.ForeignKey(db_column='contentID1', on_delete=django.db.models.deletion.CASCADE, related_name='child', to='content.Content')),
|
||||
('contentid2', models.ForeignKey(db_column='contentID2', on_delete=django.db.models.deletion.CASCADE, related_name='parent', to='content.Content')),
|
||||
],
|
||||
options={
|
||||
'db_table': 'content_content',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -92,7 +118,6 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'content_keyword',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -104,7 +129,6 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'content_resource',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -116,9 +140,30 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'content_types',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='File',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('fil', models.FileField(upload_to='files')),
|
||||
('description', models.TextField(blank=True, null=True)),
|
||||
('date', models.DateTimeField(auto_now_add=True)),
|
||||
('order', models.IntegerField(blank=True, null=True)),
|
||||
('content', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='content.Content')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Image',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('image', models.ImageField(upload_to='images')),
|
||||
('description', models.TextField(blank=True, null=True)),
|
||||
('date', models.DateTimeField(auto_now_add=True)),
|
||||
('order', models.IntegerField(blank=True, null=True)),
|
||||
('content', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='content.Content')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Keywords',
|
||||
fields=[
|
||||
|
@ -128,9 +173,19 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'keywords',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Link',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('url', models.URLField()),
|
||||
('description', models.TextField(blank=True, null=True)),
|
||||
('date', models.DateTimeField(auto_now_add=True)),
|
||||
('order', models.IntegerField(blank=True, null=True)),
|
||||
('content', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='content.Content')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='People',
|
||||
fields=[
|
||||
|
@ -146,7 +201,6 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'people',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -159,7 +213,6 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'person_content',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -171,7 +224,6 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'person_resource',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -185,12 +237,11 @@ class Migration(migrations.Migration):
|
|||
('width', models.IntegerField(blank=True, null=True)),
|
||||
('height', models.IntegerField(blank=True, null=True)),
|
||||
('istech', models.IntegerField(db_column='isTech')),
|
||||
('dateadded', models.DateTimeField(db_column='dateAdded')),
|
||||
('dateadded', models.DateTimeField(blank=True, db_column='dateAdded', null=True)),
|
||||
('orderno', models.IntegerField(blank=True, db_column='orderNo', null=True)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'resources',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -210,7 +261,6 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'videos',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
|
@ -222,39 +272,21 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'db_table': 'views',
|
||||
'managed': True,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Content',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('shortname', models.CharField(db_column='shortName', max_length=255)),
|
||||
('title', models.CharField(max_length=255)),
|
||||
('header', models.TextField(blank=True, null=True)),
|
||||
('body', models.TextField(blank=True, null=True)),
|
||||
('schedule', models.TextField(blank=True, null=True)),
|
||||
('schedulebutton', models.CharField(blank=True, db_column='scheduleButton', max_length=255, null=True)),
|
||||
('optbtn2', models.CharField(blank=True, db_column='optBtn2', max_length=127, null=True)),
|
||||
('opttext2', models.TextField(blank=True, db_column='optText2', null=True)),
|
||||
('optbtn3', models.CharField(blank=True, db_column='optBtn3', max_length=127, null=True)),
|
||||
('opttext3', models.TextField(blank=True, db_column='optText3', null=True)),
|
||||
('technotes', models.TextField()),
|
||||
('image', models.CharField(blank=True, max_length=150, null=True)),
|
||||
('postedby', models.CharField(blank=True, db_column='postedBy', max_length=50, null=True)),
|
||||
('datestart', models.DateField(blank=True, db_column='dateStart', null=True)),
|
||||
('dateend', models.DateField(blank=True, db_column='dateEnd', null=True)),
|
||||
('dateadded', models.DateTimeField(db_column='dateAdded')),
|
||||
('datemodified', models.DateTimeField(blank=True, db_column='dateModified', null=True)),
|
||||
('type', models.IntegerField()),
|
||||
('published', models.IntegerField()),
|
||||
('view', models.IntegerField(blank=True, null=True)),
|
||||
('place', models.CharField(max_length=255)),
|
||||
('parentid', models.IntegerField(db_column='parentId')),
|
||||
],
|
||||
options={
|
||||
'db_table': 'content',
|
||||
'managed': True,
|
||||
},
|
||||
migrations.AddField(
|
||||
model_name='content',
|
||||
name='parents',
|
||||
field=models.ManyToManyField(related_name='children', through='content.ContentContent', to='content.Content'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='content',
|
||||
name='type',
|
||||
field=models.ForeignKey(db_column='type', on_delete=django.db.models.deletion.CASCADE, to='content.ContentTypes'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='content',
|
||||
name='view',
|
||||
field=models.ForeignKey(blank=True, db_column='view', null=True, on_delete=django.db.models.deletion.CASCADE, to='content.Views'),
|
||||
),
|
||||
]
|
||||
|
|
38
content/migrations/0002_auto_20170621_0915.py
Normal file
38
content/migrations/0002_auto_20170621_0915.py
Normal file
|
@ -0,0 +1,38 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.1 on 2017-06-21 09:15
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import markdownx.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('content', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='MyModel',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('myfield', markdownx.models.MarkdownxField()),
|
||||
],
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='content',
|
||||
name='body',
|
||||
field=markdownx.models.MarkdownxField(),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='content',
|
||||
name='header',
|
||||
field=markdownx.models.MarkdownxField(),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='image',
|
||||
name='image',
|
||||
field=models.ImageField(upload_to='camp/static/images'),
|
||||
),
|
||||
]
|
42
content/migrations/0003_auto_20171218_1103.py
Normal file
42
content/migrations/0003_auto_20171218_1103.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.8 on 2017-12-18 11:03
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('content', '0002_auto_20170621_0915'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='content',
|
||||
name='teaser',
|
||||
field=models.TextField(blank=True, null=True, validators=[django.core.validators.MaxLengthValidator(200)]),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='content',
|
||||
name='dateadded',
|
||||
field=models.DateTimeField(auto_now_add=True, db_column='dateAdded'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='content',
|
||||
name='datemodified',
|
||||
field=models.DateTimeField(auto_now=True, db_column='dateModified', null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='content',
|
||||
name='published',
|
||||
field=models.IntegerField(default=0),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='content',
|
||||
name='view',
|
||||
field=models.ForeignKey(blank=True, db_column='view', editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='content.Views'),
|
||||
),
|
||||
]
|
31
content/migrations/0004_auto_20171218_1149.py
Normal file
31
content/migrations/0004_auto_20171218_1149.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.8 on 2017-12-18 11:49
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import markdownx.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('content', '0003_auto_20171218_1103'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='content',
|
||||
name='featured',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='content',
|
||||
name='header',
|
||||
field=markdownx.models.MarkdownxField(blank=True, default='', null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='content',
|
||||
name='published',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
]
|
85
content/migrations/0005_auto_20171219_1032.py
Normal file
85
content/migrations/0005_auto_20171219_1032.py
Normal file
|
@ -0,0 +1,85 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.7 on 2017-12-19 10:32
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import markdownx.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('content', '0004_auto_20171218_1149'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunSQL(
|
||||
[
|
||||
('delete from content_resource where "resourceID" not in (select id from resources);', None),
|
||||
('delete from content_resource where "contentID" not in (select id from content);', None),
|
||||
('delete from person_content where "personID" not in (select id from people);', None),
|
||||
('delete from person_content where "contentID" not in (select id from content);', None),
|
||||
]
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='content',
|
||||
name='resources',
|
||||
field=models.ManyToManyField(related_name='content', through='content.ContentResource', to='content.Resources'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='people',
|
||||
name='content',
|
||||
field=models.ManyToManyField(related_name='people', through='content.PersonContent', to='content.Content'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='people',
|
||||
name='resources',
|
||||
field=models.ManyToManyField(related_name='people', through='content.PersonResource', to='content.Resources'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='content',
|
||||
name='body',
|
||||
field=markdownx.models.MarkdownxField(blank=True, default='', null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='content',
|
||||
name='parentid',
|
||||
field=models.IntegerField(blank=True, db_column='parentID', editable=False, null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='contentresource',
|
||||
name='contentid',
|
||||
field=models.ForeignKey(db_column='contentID', on_delete=django.db.models.deletion.CASCADE, to='content.Content'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='contentresource',
|
||||
name='resourceid',
|
||||
field=models.ForeignKey(db_column='resourceID', on_delete=django.db.models.deletion.CASCADE, to='content.Resources'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='personcontent',
|
||||
name='contentid',
|
||||
field=models.ForeignKey(db_column='contentID', on_delete=django.db.models.deletion.CASCADE, to='content.Content'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='personcontent',
|
||||
name='personid',
|
||||
field=models.ForeignKey(db_column='personID', on_delete=django.db.models.deletion.CASCADE, to='content.People'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='personresource',
|
||||
name='personid',
|
||||
field=models.ForeignKey(db_column='personID', on_delete=django.db.models.deletion.CASCADE, to='content.People'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='personresource',
|
||||
name='resourceid',
|
||||
field=models.ForeignKey(db_column='resourceID', on_delete=django.db.models.deletion.CASCADE, to='content.Resources'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='resources',
|
||||
name='type',
|
||||
field=models.IntegerField(choices=[(1, 'Resources'), (2, 'Images'), (3, 'Links')]),
|
||||
),
|
||||
]
|
|
@ -2,59 +2,264 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.validators import MaxLengthValidator
|
||||
from django.db import models
|
||||
from django.urls import reverse
|
||||
from django.utils.html import mark_safe
|
||||
|
||||
from photologue.models import Photo, Gallery
|
||||
from markdownx.models import MarkdownxField
|
||||
from markdownx.utils import markdownify
|
||||
import ox
|
||||
|
||||
# Create your models here.
|
||||
|
||||
class Acrolike(models.Model):
|
||||
title = models.CharField(max_length=255)
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'acrolike'
|
||||
|
||||
|
||||
class Acronym(models.Model):
|
||||
name = models.CharField(max_length=255, blank=True, null=True)
|
||||
c = models.CharField(max_length=50, blank=True, null=True)
|
||||
a = models.CharField(max_length=50, blank=True, null=True)
|
||||
m = models.CharField(max_length=50, blank=True, null=True)
|
||||
p = models.CharField(max_length=50, blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'acronym'
|
||||
|
||||
|
||||
class Audios(models.Model):
|
||||
filename = models.CharField(max_length=255)
|
||||
title = models.CharField(max_length=255, blank=True, null=True)
|
||||
description = models.TextField(blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'audios'
|
||||
|
||||
|
||||
|
||||
class Comments(models.Model): #not used
|
||||
comment = models.TextField()
|
||||
name = models.CharField(max_length=150, blank=True, null=True)
|
||||
email = models.CharField(max_length=255, blank=True, null=True)
|
||||
personid = models.IntegerField(db_column='personID', blank=True, null=True) # Field name made lowercase.
|
||||
dateadded = models.DateTimeField(db_column='dateAdded') # Field name made lowercase.
|
||||
datemodified = models.DateTimeField(db_column='dateModified', blank=True, null=True) # Field name made lowercase.
|
||||
parentid = models.IntegerField(db_column='parentID', blank=True, null=True) # Field name made lowercase.
|
||||
contentid = models.IntegerField(db_column='contentID') # Field name made lowercase.
|
||||
ip = models.CharField(db_column='IP', max_length=50, blank=True, null=True) # Field name made lowercase.
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'comments'
|
||||
|
||||
|
||||
class Content(models.Model):
|
||||
published = models.BooleanField(default=False)
|
||||
view = models.ForeignKey("Views", null=True, blank=True, db_column="view")
|
||||
parent = models.ForeignKey('Content', null=True, blank=True, related_name='children', db_index=True, db_column='parentId')
|
||||
|
||||
type = models.ForeignKey("ContentTypes", db_column="type")
|
||||
shortname = models.CharField(db_column='shortName', max_length=255)
|
||||
shortname = models.CharField(db_column='shortName', max_length=255) # Field name made lowercase.
|
||||
title = models.CharField(max_length=255)
|
||||
header = models.TextField(blank=True, null=True)
|
||||
body = models.TextField(blank=True, null=True)
|
||||
header = MarkdownxField(blank=True, null=True, default='')
|
||||
body = MarkdownxField(blank=True, null=True, default='')
|
||||
teaser = models.TextField(blank=True, null=True, validators=[MaxLengthValidator(200)])
|
||||
schedule = models.TextField(blank=True, null=True)
|
||||
schedulebutton = models.CharField(db_column='scheduleButton', max_length=255, blank=True, null=True)
|
||||
optbtn2 = models.CharField(db_column='optBtn2', max_length=127, blank=True, null=True)
|
||||
opttext2 = models.TextField(db_column='optText2', blank=True, null=True)
|
||||
optbtn3 = models.CharField(db_column='optBtn3', max_length=127, blank=True, null=True)
|
||||
opttext3 = models.TextField(db_column='optText3', blank=True, null=True)
|
||||
schedulebutton = models.CharField(db_column='scheduleButton', max_length=255, blank=True, null=True) # Field name made lowercase.
|
||||
optbtn2 = models.CharField(db_column='optBtn2', max_length=127, blank=True, null=True) # Field name made lowercase.
|
||||
opttext2 = models.TextField(db_column='optText2', blank=True, null=True) # Field name made lowercase.
|
||||
optbtn3 = models.CharField(db_column='optBtn3', max_length=127, blank=True, null=True) # Field name made lowercase.
|
||||
opttext3 = models.TextField(db_column='optText3', blank=True, null=True) # Field name made lowercase.
|
||||
technotes = models.TextField(db_column='technotes', blank=True, null=True)
|
||||
image = models.CharField(max_length=150, blank=True, null=True)
|
||||
postedby = models.CharField(db_column='postedBy', max_length=50, blank=True, null=True)
|
||||
datestart = models.DateField(db_column='dateStart', blank=True, null=True)
|
||||
dateend = models.DateField(db_column='dateEnd', blank=True, null=True)
|
||||
dateadded = models.DateTimeField(db_column='dateAdded', auto_now_add=True, null=True)
|
||||
datemodified = models.DateTimeField(db_column='dateModified', blank=True, null=True, auto_now=True)
|
||||
|
||||
postedby = models.CharField(db_column='postedBy', max_length=50, blank=True, null=True) # Field name made lowercase.
|
||||
datestart = models.DateField(db_column='dateStart', blank=True, null=True) # Field name made lowercase.
|
||||
dateend = models.DateField(db_column='dateEnd', blank=True, null=True) # Field name made lowercase.
|
||||
dateadded = models.DateTimeField(db_column='dateAdded', auto_now_add=True, editable=True) # Field name made lowercase.
|
||||
datemodified = models.DateTimeField(db_column='dateModified', blank=True, null=True, auto_now=True) # Field name made lowercase.
|
||||
published = models.BooleanField(default=False)
|
||||
featured = models.BooleanField(default=False)
|
||||
view = models.ForeignKey("Views", null=True, blank=True, db_column="view", editable=False)
|
||||
place = models.CharField(max_length=255, null=True, blank=True)
|
||||
parents = models.ManyToManyField('Content', through='ContentContent', related_name="children")
|
||||
|
||||
resources = models.ManyToManyField('Resources', through='ContentResource', related_name="content")
|
||||
|
||||
def __unicode__(self):
|
||||
return self.title or 'Untitled'
|
||||
# delete after migration
|
||||
parentid = models.IntegerField(null=True, db_column='parentID', blank=True, editable=False)
|
||||
|
||||
class Meta:
|
||||
db_table = 'content'
|
||||
# end of delte
|
||||
|
||||
def __unicode__(self):
|
||||
return self.title
|
||||
|
||||
@property
|
||||
def formatted_header(self):
|
||||
return mark_safe(markdownify(self.header))
|
||||
|
||||
@property
|
||||
def formatted_body(self):
|
||||
return mark_safe(markdownify(self.body))
|
||||
|
||||
@property
|
||||
def formatted_teaser(self):
|
||||
if self.teaser:
|
||||
value = self.teaser
|
||||
elif self.header:
|
||||
value = ox.strip_tags(ox.decode_html(markdownify(self.header)))[:100]
|
||||
else:
|
||||
value = ''
|
||||
return mark_safe(value)
|
||||
|
||||
@property
|
||||
def typefilter(self):
|
||||
return self.type
|
||||
|
||||
@property
|
||||
def image_url(self):
|
||||
if self.image:
|
||||
return settings.IMAGE_PREFIX + self.image
|
||||
|
||||
def get_absolute_url(self):
|
||||
if self.shortname:
|
||||
return reverse('content', kwargs={'shortname': self.shortname})
|
||||
|
||||
def links(self):
|
||||
return self.resources.filter(type=3).order_by('orderno')
|
||||
|
||||
def images(self):
|
||||
return self.resources.filter(type=2).exclude(href=self.image).order_by('orderno')
|
||||
|
||||
def get_absolute_url(self):
|
||||
if self.shortname:
|
||||
parts = []
|
||||
section = self.type.name
|
||||
if section == 'news':
|
||||
section = 'events'
|
||||
if section == 'page':
|
||||
parts = [self.shortname]
|
||||
else:
|
||||
parts = [section, self.shortname]
|
||||
return '/' + '/'.join(parts)
|
||||
|
||||
def get_gallery(self):
|
||||
gallery, created = Gallery.objects.get_or_create(slug=self.shortname)
|
||||
if created:
|
||||
title = self.title
|
||||
n = 1
|
||||
while Gallery.objects.filter(title=title).exclude(pk=gallery.pk).exists():
|
||||
n += 1
|
||||
title = '%s [%s]' % (self.title, n)
|
||||
gallery.title = title
|
||||
gallery.save()
|
||||
return gallery
|
||||
|
||||
class Meta:
|
||||
managed = True
|
||||
db_table = 'content'
|
||||
|
||||
|
||||
class ContentContent(models.Model):
|
||||
contentid1 = models.ForeignKey("content", db_column='contentID1', related_name="child") # Field name made lowercase.
|
||||
contentid2 = models.ForeignKey("content", db_column='contentID2', related_name="parent") # Field name made lowercase.
|
||||
|
||||
def __unicode__(self):
|
||||
return self.contentid1.title
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'content_content'
|
||||
|
||||
def reverse(self):
|
||||
r, created = ContentContent.objects.get_or_create(contentid1=self.contentid2, contentid2=self.contentid1)
|
||||
return r
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
super(ContentContent, self).save(*args, **kwargs)
|
||||
self.reverse()
|
||||
|
||||
class ContentKeyword(models.Model):
|
||||
contentid = models.IntegerField(db_column='contentID') # Field name made lowercase.
|
||||
keywordid = models.IntegerField(db_column='keywordID') # Field name made lowercase.
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'content_keyword'
|
||||
|
||||
|
||||
class ContentResource(models.Model):
|
||||
contentid = models.ForeignKey('Content', db_column='contentID')
|
||||
resourceid = models.ForeignKey('Resources', db_column='resourceID')
|
||||
|
||||
def __unicode__(self):
|
||||
return self.resource.href
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'content_resource'
|
||||
|
||||
|
||||
class ContentTypes(models.Model):
|
||||
id = models.IntegerField(primary_key=True)
|
||||
name = models.CharField(max_length=255)
|
||||
description = models.TextField(blank=True, null=True)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'content_types'
|
||||
|
||||
|
||||
class Keywords(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
description = models.TextField(blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'keywords'
|
||||
|
||||
|
||||
class People(models.Model): #not used
|
||||
name = models.CharField(max_length=255, blank=True, null=True)
|
||||
email = models.CharField(max_length=255, blank=True, null=True)
|
||||
location = models.CharField(max_length=255, blank=True, null=True)
|
||||
login = models.CharField(max_length=100, blank=True, null=True)
|
||||
password = models.CharField(max_length=16, blank=True, null=True)
|
||||
href = models.CharField(max_length=255, blank=True, null=True)
|
||||
bio = models.TextField(blank=True, null=True)
|
||||
type = models.IntegerField()
|
||||
|
||||
resources = models.ManyToManyField('Resources', through='PersonResource', related_name='people')
|
||||
content = models.ManyToManyField('Content', through='PersonContent', related_name='people')
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'people'
|
||||
|
||||
|
||||
class PersonContent(models.Model):
|
||||
personid = models.ForeignKey("people", db_column="personID")
|
||||
contentid = models.ForeignKey("content", db_column="contentID")
|
||||
level = models.IntegerField()
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'person_content'
|
||||
|
||||
|
||||
class PersonResource(models.Model):
|
||||
personid = models.ForeignKey("people", db_column="personID")
|
||||
resourceid = models.ForeignKey("resources", db_column="resourceID")
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'person_resource'
|
||||
|
||||
|
||||
class Resources(models.Model):
|
||||
|
||||
TYPE_CHOICES = (
|
||||
|
@ -69,12 +274,9 @@ class Resources(models.Model):
|
|||
mime = models.CharField(max_length=10, blank=True, null=True)
|
||||
width = models.IntegerField(blank=True, null=True)
|
||||
height = models.IntegerField(blank=True, null=True)
|
||||
istech = models.BooleanField(db_column='isTech')
|
||||
dateadded = models.DateTimeField(db_column='dateAdded', auto_now_add=True, null=True)
|
||||
orderno = models.IntegerField(db_column='orderNo', blank=True, null=True)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.href
|
||||
istech = models.IntegerField(db_column='isTech') # Field name made lowercase.
|
||||
dateadded = models.DateTimeField(db_column='dateAdded', null=True, blank=True) # Field name made lowercase.
|
||||
orderno = models.IntegerField(db_column='orderNo', blank=True, null=True) # Field name made lowercase.
|
||||
|
||||
def get_absolute_url(self):
|
||||
href = self.href
|
||||
|
@ -100,42 +302,45 @@ class Resources(models.Model):
|
|||
return self.mime.lower() in ('ogv', 'mp4')
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'resources'
|
||||
|
||||
'''
|
||||
class ContentContent(models.Model):
|
||||
contentid1 = models.ForeignKey('Content', db_column='contentID1', related_name='child')
|
||||
contentid2 = models.ForeignKey('Content', db_column='contentID2', related_name='parent')
|
||||
|
||||
def __unicode__(self):
|
||||
return "%s is child of %s" % (self.contentid1.title, self.contentid2.title,)
|
||||
|
||||
class Meta:
|
||||
managed = False
|
||||
db_table = 'content_content'
|
||||
'''
|
||||
|
||||
class ContentResource(models.Model):
|
||||
content = models.ForeignKey('Content', db_column='contentID')
|
||||
resource = models.ForeignKey('Resources', db_column='resourceID')
|
||||
|
||||
def __unicode__(self):
|
||||
return self.resource.href
|
||||
|
||||
class Meta:
|
||||
db_table = 'content_resource'
|
||||
|
||||
|
||||
class ContentTypes(models.Model):
|
||||
id = models.IntegerField(primary_key=True)
|
||||
name = models.CharField(max_length=255)
|
||||
class File(models.Model):
|
||||
content = models.ForeignKey('Content')
|
||||
fil = models.FileField(upload_to='files')
|
||||
description = models.TextField(blank=True, null=True)
|
||||
date = models.DateTimeField(auto_now_add=True)
|
||||
order = models.IntegerField(blank=True, null=True)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
class Image(models.Model):
|
||||
content = models.ForeignKey('Content', related_name='images')
|
||||
image = models.ImageField(upload_to='camp/static/images')
|
||||
description = models.TextField(blank=True, null=True)
|
||||
date = models.DateTimeField(auto_now_add=True)
|
||||
order = models.IntegerField(blank=True, null=True)
|
||||
|
||||
class Link(models.Model):
|
||||
content = models.ForeignKey('Content')
|
||||
url = models.URLField()
|
||||
description = models.TextField(blank=True, null=True)
|
||||
date = models.DateTimeField(auto_now_add=True)
|
||||
order = models.IntegerField(blank=True, null=True)
|
||||
|
||||
class Videos(models.Model): # not used
|
||||
sha1 = models.CharField(max_length=50)
|
||||
href = models.CharField(max_length=255)
|
||||
title = models.TextField(blank=True, null=True)
|
||||
description = models.TextField(blank=True, null=True)
|
||||
width = models.IntegerField(blank=True, null=True)
|
||||
height = models.IntegerField(blank=True, null=True)
|
||||
duration = models.IntegerField(blank=True, null=True)
|
||||
thumbno = models.IntegerField(db_column='thumbNo') # Field name made lowercase.
|
||||
image = models.CharField(max_length=255, blank=True, null=True)
|
||||
contentid = models.IntegerField(blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
db_table = 'content_types'
|
||||
# managed = False
|
||||
db_table = 'videos'
|
||||
|
||||
|
||||
class Views(models.Model):
|
||||
|
@ -146,122 +351,12 @@ class Views(models.Model):
|
|||
return self.name
|
||||
|
||||
class Meta:
|
||||
# managed = False
|
||||
db_table = 'views'
|
||||
|
||||
# unused but has values in db
|
||||
|
||||
class Acrolike(models.Model):
|
||||
title = models.CharField(max_length=255)
|
||||
|
||||
class Meta:
|
||||
db_table = 'acrolike'
|
||||
class MyModel(models.Model):
|
||||
myfield = MarkdownxField()
|
||||
|
||||
|
||||
class Acronym(models.Model):
|
||||
name = models.CharField(max_length=255, blank=True, null=True)
|
||||
c = models.CharField(max_length=50, blank=True, null=True)
|
||||
a = models.CharField(max_length=50, blank=True, null=True)
|
||||
m = models.CharField(max_length=50, blank=True, null=True)
|
||||
p = models.CharField(max_length=50, blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
db_table = 'acronym'
|
||||
|
||||
class People(models.Model):
|
||||
name = models.CharField(max_length=255, blank=True, null=True)
|
||||
email = models.CharField(max_length=255, blank=True, null=True)
|
||||
location = models.CharField(max_length=255, blank=True, null=True)
|
||||
login = models.CharField(max_length=100, blank=True, null=True)
|
||||
password = models.CharField(max_length=16, blank=True, null=True)
|
||||
href = models.CharField(max_length=255, blank=True, null=True)
|
||||
bio = models.TextField(blank=True, null=True)
|
||||
type = models.IntegerField()
|
||||
|
||||
resources = models.ManyToManyField('Resources', through='PersonResource', related_name='people')
|
||||
content = models.ManyToManyField('Content', through='PersonContent', related_name='people')
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
db_table = 'people'
|
||||
|
||||
|
||||
class PersonContent(models.Model):
|
||||
personid = models.ForeignKey("people", db_column="personID")
|
||||
contentid = models.ForeignKey("content", db_column="contentID")
|
||||
level = models.IntegerField()
|
||||
|
||||
class Meta:
|
||||
db_table = 'person_content'
|
||||
|
||||
|
||||
class PersonResource(models.Model):
|
||||
personid = models.ForeignKey("people", db_column="personID")
|
||||
resourceid = models.ForeignKey("resources", db_column="resourceID")
|
||||
|
||||
class Meta:
|
||||
db_table = 'person_resource'
|
||||
|
||||
|
||||
class Videos(models.Model):
|
||||
sha1 = models.CharField(max_length=50)
|
||||
href = models.CharField(max_length=255)
|
||||
title = models.TextField(blank=True, null=True)
|
||||
description = models.TextField(blank=True, null=True)
|
||||
width = models.IntegerField(blank=True, null=True)
|
||||
height = models.IntegerField(blank=True, null=True)
|
||||
duration = models.IntegerField(blank=True, null=True)
|
||||
thumbno = models.IntegerField(db_column='thumbNo')
|
||||
image = models.CharField(max_length=255, blank=True, null=True)
|
||||
contentid = models.IntegerField(blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
db_table = 'videos'
|
||||
|
||||
def image_url(self):
|
||||
return settings.IMAGE_PREFIX + self.image
|
||||
|
||||
|
||||
# UNUSED
|
||||
|
||||
class Audios(models.Model):
|
||||
filename = models.CharField(max_length=255)
|
||||
title = models.CharField(max_length=255, blank=True, null=True)
|
||||
description = models.TextField(blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
db_table = 'audios'
|
||||
|
||||
|
||||
class Comments(models.Model):
|
||||
comment = models.TextField()
|
||||
name = models.CharField(max_length=150, blank=True, null=True)
|
||||
email = models.CharField(max_length=255, blank=True, null=True)
|
||||
personid = models.IntegerField(db_column='personID', blank=True, null=True)
|
||||
dateadded = models.DateTimeField(db_column='dateAdded', auto_now_add=True, null=True)
|
||||
datemodified = models.DateTimeField(db_column='dateModified', blank=True, null=True, auto_now=True)
|
||||
parentid = models.IntegerField(db_column='parentID', blank=True, null=True)
|
||||
parent = models.ForeignKey('Comments', null=True, blank=True, related_name='comments', db_index=True, db_column='parentId')
|
||||
content = models.ForeignKey('Content', null=True, blank=True, related_name='comments', db_index=True, db_column='contentID')
|
||||
ip = models.CharField(db_column='IP', max_length=50, blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
db_table = 'comments'
|
||||
|
||||
|
||||
class Keywords(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
description = models.TextField(blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
db_table = 'keywords'
|
||||
|
||||
class ContentKeyword(models.Model):
|
||||
content = models.ForeignKey('Content', db_column='contentID')
|
||||
keyword = models.ForeignKey('Keywords', db_column='keywordID')
|
||||
|
||||
class Meta:
|
||||
db_table = 'content_keyword'
|
||||
|
||||
|
||||
|
|
|
@ -1,92 +0,0 @@
|
|||
body {
|
||||
background-color: #ffffff !important;
|
||||
font-size: 14px !important;
|
||||
}
|
||||
|
||||
.content_detail {
|
||||
width: 70%;
|
||||
padding-left: 5%;
|
||||
}
|
||||
|
||||
.right-items {
|
||||
padding-bottom: 0.5em;
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
|
||||
body, h1, h2, h3, h4, h5, h6 {
|
||||
font-family: Open Sans !important;
|
||||
}
|
||||
|
||||
|
||||
.sidebar-h4 {
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.sidebar-title {
|
||||
text-transform: capitalize;
|
||||
font-weight: 800;
|
||||
font-style: italic;
|
||||
font-size: 1em;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.sidebar-date {
|
||||
text-transform: uppercase;
|
||||
font-size: 0.7em;
|
||||
font-weight: bold;
|
||||
color: #ef4e5c;
|
||||
}
|
||||
|
||||
.special-column {
|
||||
padding-left: 0em !important;
|
||||
}
|
||||
|
||||
.index-text {
|
||||
padding-left: 3%;
|
||||
padding-right: 1%;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.index-text p {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.title-bar-right {
|
||||
margin-right: 2em;
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
.menu-icon::after{
|
||||
background: #111111 none repeat scroll 0 0 !important;
|
||||
box-shadow: 0 7px 0 #111111, 0 14px 0 #111111 !important;
|
||||
}
|
||||
|
||||
.vertical-menu li {
|
||||
list-style: none;
|
||||
padding-top: 2em;
|
||||
padding-left: 1em;
|
||||
font-weight: 600;
|
||||
font-size: 1em;
|
||||
color: #ef4e5c;
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
|
||||
.off-canvas {
|
||||
background-color: #eeeeee !important;
|
||||
}
|
||||
|
||||
.position-right.is-transition-push::after {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.admin-menu {
|
||||
position: absolute;
|
||||
top: 45px;
|
||||
right: 25px;
|
||||
}
|
||||
|
||||
.context ul, .links ul {
|
||||
list-style: none;
|
||||
}
|
|
@ -10,6 +10,7 @@
|
|||
<link rel="stylesheet" type="text/css" href="{% static "css/main.css" %}">
|
||||
<link rel="stylesheet" type="text/css" href="{% static "css/app.css" %}">
|
||||
<link rel="stylesheet" type="text/css" href="{% static "css/foundation.css" %}">
|
||||
<link rel="stylesheet" type="text/css" href="{% static "css/jquery.bxslider.css" %}">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
@ -18,13 +19,13 @@
|
|||
|
||||
<div class="off-canvas position-right" id="offCanvasRight" data-off-canvas data-position="right">
|
||||
<ul class="vertical-menu">
|
||||
<li><a href="{% url 'index' %}">HOME</a></li>
|
||||
<li><a href="{% url 'about' %}">ABOUT</a></li>
|
||||
<li><a href="{% url 'projects' %}">PROJECTS</a></li>
|
||||
<li><a href="{% url 'events' %}">EVENTS</a></li>
|
||||
<li><a href="{% url 'works' %}">WORKS</a></li>
|
||||
<li><a href="{% url 'texts' %}">TEXTS</a></li>
|
||||
<li><a href="{% url 'contact' %}">CONTACT</a></li>
|
||||
<li><a href="/">HOME</a></li>
|
||||
<li><a href="/about">ABOUT</a></li>
|
||||
<li><a href="/projects">PROJECTS</a></li>
|
||||
<li><a href="/events">EVENTS</a></li>
|
||||
<li><a href="/works">WORKS</a></li>
|
||||
<li><a href="/texts">TEXTS</a></li>
|
||||
<li><a href="/contact">CONTACT</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
@ -40,11 +41,34 @@
|
|||
{% endblock %}
|
||||
|
||||
|
||||
|
||||
{% load static %}
|
||||
<script src="{% static "js/jquery.js" %}"></script>
|
||||
<script src="{% static "js/foundation.js" %}"></script>
|
||||
<script src="{% static "js/app.js" %}"></script>
|
||||
<script src="{% static "js/what-input.js" %}"></script>
|
||||
<script src="{% static "js/jquery.bxslider.js" %}"></script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
var slider = $('.slider1').bxSlider({
|
||||
adaptiveHeight : true,
|
||||
pager : false,
|
||||
});
|
||||
|
||||
|
||||
$(document).keydown(function(e){
|
||||
if (e.keyCode == 39) // Right arrow
|
||||
{
|
||||
slider.goToNextSlide();
|
||||
return false;
|
||||
}
|
||||
else if (e.keyCode == 37) // left arrow
|
||||
{
|
||||
slider.goToPrevSlide();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1,157 +0,0 @@
|
|||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
{% if request.user.is_staff %}
|
||||
<div class="admin-menu">
|
||||
<a href="{% url 'admin:content_content_change' content.id %}">Edit</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if content.image_url %}
|
||||
<img src="{{ content.image_url }}" width="75%">
|
||||
{% endif %}
|
||||
<div class="content_detail">
|
||||
<h1>{{ content.title }}</h1>
|
||||
|
||||
<h4>{{ content.header|safe }} </h4>
|
||||
<p>{{ content.body|safe }}</p>
|
||||
|
||||
{% if content.optbtn2 and content.opttext2 %}
|
||||
<div class="part2">
|
||||
<h4>{{ content.optbtn2|safe }} </h4>
|
||||
<p>{{ content.opttext2|safe|linebreaks }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if content.optbtn3 and content.opttext3 %}
|
||||
<div class="part3">
|
||||
<h4>{{ content.optbtn3|safe }} </h4>
|
||||
<p>{{ content.opttext3|safe|linebreaks }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if content.schedule %}
|
||||
<div class="schedule">
|
||||
<h4>{{content.schedulebutton|default:"Schedule"}}</h4>
|
||||
<p>{{ content.schedule|safe|linebreaks }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if content.parent or content.children.exists %}
|
||||
<div class="context">
|
||||
<b>In This Event</b>:
|
||||
<ul>
|
||||
{% if content.parent and content.parent.title %}
|
||||
<li><a href="{{content.parent.get_absolute_url}}">{{content.parent.title}}</a></li>
|
||||
<li><ul>
|
||||
{% for node in content.parent.children.all %}
|
||||
{% if node.shortname and node.published %}
|
||||
<li>
|
||||
{% if node == content %}
|
||||
{{node.title}}
|
||||
{% else %}
|
||||
<a href="{{node.get_absolute_url}}">{{ node.title }}</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ul><li>
|
||||
{% elif content.children.exists %}
|
||||
<li>{{content.title}}</li>
|
||||
<li><ul>
|
||||
{% for node in content.children.all %}
|
||||
{% if node.shortname and node.published %}
|
||||
<li>
|
||||
<a href="{{node.get_absolute_url}}">{{ node.title }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ul><li>
|
||||
{% else %}
|
||||
<li>{{content.title}}</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if content.resources.exists %}
|
||||
{% if content.links.exists %}
|
||||
<div class="links">
|
||||
<b>Links:</b>
|
||||
<ul>
|
||||
{% for res in content.links %}
|
||||
<li>
|
||||
<a href="{{res.get_absolute_url}}">{{res.description|default:res.href}}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if content.images.exists %}
|
||||
<style>
|
||||
.images {
|
||||
display: grid;
|
||||
grid-template-columns: 128px 128px 128px 128px 128px 128px 128px 128px;
|
||||
grid-gap: 10px;
|
||||
}
|
||||
.images > div {
|
||||
width: 128px;
|
||||
height: 128px;
|
||||
padding: 8px;
|
||||
display: table-cell;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
}
|
||||
.images > div > img {
|
||||
transition: width,height 2s;
|
||||
max-width: 92%;
|
||||
max-height: 92%;
|
||||
position: absolute;
|
||||
top:0;
|
||||
bottom:0;
|
||||
left:0;
|
||||
right:0;
|
||||
margin:auto;
|
||||
}
|
||||
.images > div > img.active {
|
||||
max-width: 92%;
|
||||
max-height: 92%;
|
||||
position: fixed;
|
||||
top:0;
|
||||
bottom:0;
|
||||
left:0;
|
||||
right:0;
|
||||
margin:auto;
|
||||
z-index: 1;
|
||||
}
|
||||
</style>
|
||||
<b>Images:</b> <br>
|
||||
<div class="images">
|
||||
{% for res in content.images %}
|
||||
<div>
|
||||
{% if res.is_image %}
|
||||
<img src="{{res.get_absolute_url}}">
|
||||
{% elif res.is_audio %}
|
||||
<audio controls src="{{res.get_absolute_url}}"></audio>
|
||||
{% elif res.is_video %}
|
||||
<video controls src="{{res.get_absolute_url}}"></video>
|
||||
{% else %}
|
||||
<a href="{{res.get_absolute_url}}">{{res.description|default:res.href}}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<script>
|
||||
document.querySelectorAll('.images > div > img').forEach(function(img) {
|
||||
img.addEventListener('click', function() {
|
||||
if (this.classList.contains('active')) {
|
||||
this.classList.remove('active');
|
||||
} else {
|
||||
this.classList.add('active');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
21
content/templates/event.html
Normal file
21
content/templates/event.html
Normal file
|
@ -0,0 +1,21 @@
|
|||
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
{% include "featured.html" %}
|
||||
<div class="large-4 medium-4 columns">
|
||||
{% if upcoming_events.exists %}
|
||||
<h4 class="sidebar-h4"> Upcoming Events </h4>
|
||||
{% include "event_preview.html" with events=upcoming_events %}
|
||||
{% endif %}
|
||||
{% if ongoing_events.exists %}
|
||||
<h4 class="sidebar-h4"> Ongoing Events </h4>
|
||||
{% include "event_preview.html" with events=ongoing_events %}
|
||||
{% endif %}
|
||||
{% if past_events.exists %}
|
||||
<h4 class="sidebar-h4"> Past Events </h4>
|
||||
{% include "event_preview.html" with events=past_events %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
38
content/templates/event_preview.html
Normal file
38
content/templates/event_preview.html
Normal file
|
@ -0,0 +1,38 @@
|
|||
<div class="row">
|
||||
{% for content in events %}
|
||||
{% if content.type.name == 'news' %}
|
||||
<div class="row right-items">
|
||||
<div class= "small-12 columns">
|
||||
<h6 class="sidebar-date">
|
||||
<font color="#ef4e5c"> <b> {{content.datestart}} </b>
|
||||
{{ content.title }} <br />
|
||||
{{ content.formatted_header }}
|
||||
</font>
|
||||
</h6>
|
||||
</div>
|
||||
</div>
|
||||
{% elif content.type.name == 'events' %}
|
||||
<div class="row right-items">
|
||||
{% if content.image_url %}
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ content.get_absolute_url }}">
|
||||
<img src="{{ content.image_url }}">
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ content.get_absolute_url }}" class="sidebar-title">{{ content.title }}</a>
|
||||
<h6 class="sidebar-date">
|
||||
<font color="#ef4e5c">
|
||||
<b>{{ content.datestart }} {% if content.dateend %} - {{content.dateend}} {% endif %}</b>
|
||||
</font>
|
||||
{%if content.place %}<br>{{content.place}}{% endif %}
|
||||
</h6>
|
||||
<p> {{content.formatted_teaser}} </p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<br>
|
||||
<br>
|
||||
</div>
|
52
content/templates/events.html
Normal file
52
content/templates/events.html
Normal file
|
@ -0,0 +1,52 @@
|
|||
|
||||
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="large-8 medium-8 columns special-column">
|
||||
{% if events.image %}
|
||||
<img src="{{events.image_url}}">
|
||||
{% endif %}
|
||||
<div class="index-text">
|
||||
<h4><a href="{{ events.get_absolute_url }}/" class="big-title">{{events.title}} </a></h4>
|
||||
<p> {{events.formatted_header|safe}} </p>
|
||||
<p> {{events.formatted_body|safe}} </p>
|
||||
{% include "opt.html" with content=events %}
|
||||
{% include "links.html" with content=events %}
|
||||
{% include "gallery.html" with gallery=gallery %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="large-4 medium-4 columns">
|
||||
{% include "related.html" with related=events.children.all %}
|
||||
<h4 class="sidebar-h4">Events </h4>
|
||||
<div class="row">
|
||||
|
||||
{% for events in latest_content_list %}
|
||||
|
||||
<div class="row right-items">
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ events.get_absolute_url }}/"> <img src="{{ events.image_url }}"> </a>
|
||||
</div>
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ events.get_absolute_url }}/" class="sidebar-title" >{{ events.title }}</a>
|
||||
<h6 class="sidebar-date">
|
||||
<font color="#ef4e5c">
|
||||
<b> {{ events.datestart }} {% if events.dateend %} - {{events.dateend}} {% endif %} </b>
|
||||
</font>
|
||||
{% if events.place %}<br/>{{events.place}}{% endif%}
|
||||
</h6>
|
||||
<p> {{ events.formatted_teaser }} </p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
21
content/templates/featured.html
Normal file
21
content/templates/featured.html
Normal file
|
@ -0,0 +1,21 @@
|
|||
{% for content in featured %}
|
||||
<div class="large-8 medium-8 columns special-column">
|
||||
{% if content.image %}
|
||||
<img src="{{ content.image_url }}">
|
||||
{% endif %}
|
||||
<div class="index-text">
|
||||
<h4><a href="{{ content.get_absolute_url }}" class="big-title">{{content.title}} </a></h4>
|
||||
{% if content.datestart %}
|
||||
<h6 class="big-date"> <font color="#ef4e5c"> <b> {{ content.datestart }} </b></font>
|
||||
{% if content.place %}<br/>{{content.place}}{% endif%}
|
||||
</h6>
|
||||
{% endif %}
|
||||
{% if content.header %}
|
||||
<p> {{content.formatted_header}} </p>
|
||||
{% else %}
|
||||
<p> {{content.formatted_body}} </p>
|
||||
{% endif %}
|
||||
<a href="{{ content.get_absolute_url }}">read more</a> </p>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
8
content/templates/gallery.html
Normal file
8
content/templates/gallery.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
{% if gallery %}
|
||||
<h6><strong>Gallery: {{gallery.title}}</strong></h6>
|
||||
<ul class="clearing-thumbs" data-clearing>
|
||||
{% for photo in gallery.public %}
|
||||
<li><a href="{{ photo.get_absolute_url }}"><img src="{{ photo.get_thumbnail_url }}"></a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
|
@ -3,41 +3,29 @@
|
|||
|
||||
{% block content %}
|
||||
|
||||
{% if latest_content_list %}
|
||||
{% for content in latest_content_list %}
|
||||
{% if forloop.counter == 3 %}
|
||||
{% for content in homepage %}
|
||||
<div class="large-8 medium-8 columns special-column">
|
||||
<img src="{{ content.image_url }}">
|
||||
<div class="index-text">
|
||||
<h4><a href="{{ content.get_absolute_url }}">{{content.title}}</a></h4>
|
||||
<p>
|
||||
{{content.body|striptags|truncatechars:250}} <a href="{{ content.get_absolute_url }}">read more</a>
|
||||
</p>
|
||||
<h4 class="big-title">{{content.title}} </a></h4>
|
||||
<p> {{content.formatted_header}} </p>
|
||||
<p> {{content.formatted_body}} </p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
<div class="large-4 medium-4 columns">
|
||||
{% if upcoming_events.exists %}
|
||||
<h4 class="sidebar-h4"> Upcoming Events </h4>
|
||||
<div class="row">
|
||||
|
||||
{% for content in latest_content_list %}
|
||||
<div class="row right-items">
|
||||
<div class="small-6 columns">
|
||||
<img src="{{ content.image_url }}">
|
||||
</div>
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ content.get_absolute_url }}" class="sidebar-title">{{ content.title }}</a>
|
||||
<h6 class="sidebar-date">{{ content.datestart }}</h6>
|
||||
{{ conntent.header }}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p>No polls are available.</p>
|
||||
{% include "event_preview.html" with events=upcoming_events %}
|
||||
{% endif %}
|
||||
{% if ongoing_events.exists %}
|
||||
<h4 class="sidebar-h4"> Ongoing Events </h4>
|
||||
{% include "event_preview.html" with events=ongoing_events %}
|
||||
{% endif %}
|
||||
{% if past_events.exists %}
|
||||
<h4 class="sidebar-h4"> Past Events </h4>
|
||||
{% include "event_preview.html" with events=past_events %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
|
12
content/templates/links.html
Normal file
12
content/templates/links.html
Normal file
|
@ -0,0 +1,12 @@
|
|||
{% if content.links.exists %}
|
||||
<div class="links">
|
||||
<b>Links:</b>
|
||||
<ul>
|
||||
{% for res in content.links %}
|
||||
<li>
|
||||
<a href="{{res.get_absolute_url}}">{{res.description|default:res.href}}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
18
content/templates/opt.html
Normal file
18
content/templates/opt.html
Normal file
|
@ -0,0 +1,18 @@
|
|||
{% if content.optbtn2 and content.opttext2 %}
|
||||
<div class="part2">
|
||||
<h4>{{ content.optbtn2|safe }} </h4>
|
||||
<p>{{ content.opttext2|safe|linebreaks }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if content.optbtn3 and content.opttext3 %}
|
||||
<div class="part3">
|
||||
<h4>{{ content.optbtn3|safe }} </h4>
|
||||
<p>{{ content.opttext3|safe|linebreaks }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if content.schedule %}
|
||||
<div class="schedule">
|
||||
<h4>{{content.schedulebutton|default:"Schedule"}}</h4>
|
||||
<p>{{ content.schedule|safe|linebreaks }}</p>
|
||||
</div>
|
||||
{% endif %}
|
17
content/templates/page.html
Normal file
17
content/templates/page.html
Normal file
|
@ -0,0 +1,17 @@
|
|||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="large-8 medium-8 columns special-column">
|
||||
<div class="index-text">
|
||||
<h4>{{content.title}}</h4>
|
||||
{% if content.header %}
|
||||
<p>
|
||||
{{content.formatted_header|safe}}
|
||||
</p>
|
||||
{% endif %}
|
||||
<p>
|
||||
{{content.formatted_body|safe}}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
20
content/templates/photologue/gallery_detail.html
Normal file
20
content/templates/photologue/gallery_detail.html
Normal file
|
@ -0,0 +1,20 @@
|
|||
{% extends "photologue:photologue/gallery_detail.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block title %}{{ gallery.title }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row col-lg-12">
|
||||
<h1 class="page-header">{{ gallery.title }}</h1>
|
||||
<p class="muted"><small>{% trans "Published" %} {{ gallery.date_added }}</small>WHYYYYYY</p>
|
||||
{% if gallery.description %}{{ gallery.description|safe }}{% endif %}
|
||||
{% for photo in gallery.public %}
|
||||
<a href="{{ photo.get_absolute_url }}">
|
||||
<img src="{{ photo.get_thumbnail_url }}" class="thumbnail" alt="{{ photo.title }}">
|
||||
</a>
|
||||
{% endfor %}
|
||||
<div><a href="{% url 'photologue:gallery-list' %}" class="btn btn-default">{% trans "View all galleries" %}</a></div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
46
content/templates/photologue/photo_detail.html
Normal file
46
content/templates/photologue/photo_detail.html
Normal file
|
@ -0,0 +1,46 @@
|
|||
{% extends "photologue:photologue/photo_detail.html" %}
|
||||
{% load photologue_tags i18n %}
|
||||
|
||||
{% block title %}{{ object.title }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% for gallery in object.public_galleries %}
|
||||
|
||||
<div class="row">
|
||||
<div class="medium-9 columns">
|
||||
<h5 class="page-header">From gallery {{ gallery.title }}</h5>
|
||||
<ul class="slider1">
|
||||
{% for photo.pk in gallery.public %}
|
||||
<li>
|
||||
<img src="{{ photo.get_display_url }}" alt="{{ photo.title }}">
|
||||
<br /> <p>{{ photo.caption|safe }} <a href="{{ photo.image.url }}"> Link to original file </a> </p>
|
||||
</li>
|
||||
{% for photo in gallery.public %}
|
||||
<li>
|
||||
<img src="{{ photo.get_display_url }}" alt="{{ photo.title }}">
|
||||
<br /> <p>{{ photo.caption|safe }} <a href="{{ photo.image.url }}" target="_blank" > Link to original file </a> </p>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="medium-3 columns">
|
||||
{% if object.public_galleries %}
|
||||
<p>{% trans "Other photos in the gallery" %}:</p>
|
||||
<table>
|
||||
{% for photo in gallery.public %}
|
||||
<tr>
|
||||
<td><a href="{{ photo.get_absolute_url }}">
|
||||
<img src="{{ photo.get_thumbnail_url }}" class="thumbnail" alt="{{ photo.title }}"></a></td>
|
||||
<td>
|
||||
<p>{{ photo.caption|safe }} {{ photo.count }} </p>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
21
content/templates/preview.html
Normal file
21
content/templates/preview.html
Normal file
|
@ -0,0 +1,21 @@
|
|||
<div class="row">
|
||||
<div class="row right-items">
|
||||
<div class="small-6 columns">
|
||||
{% if content.image_url %}
|
||||
<img src="{{ content.image_url }}">
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ content.get_absolute_url }}" class="sidebar-title"> {{content.title}} </a>
|
||||
{% if content.type.name == 'events' %}
|
||||
<h6 class="sidebar-date">
|
||||
<font color="#ef4e5c">
|
||||
<b> {{ content.datestart }} {% if content.dateend %} - {{content.dateend}} {% endif %} </b>
|
||||
</font>
|
||||
{% if content.place %}<br/>{{content.place}}{% endif%}
|
||||
</h6>
|
||||
{% endif %}
|
||||
<p> {{ content.formatted_teaser }} </p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,22 +1,45 @@
|
|||
|
||||
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="large-4 medium-4 columns">
|
||||
<h4 class="sidebar-h4">{{ title }}</h4>
|
||||
|
||||
<div class="large-8 medium-8 columns special-column">
|
||||
{% if projects.image %}
|
||||
<img src="{{ projects.image_url }}">
|
||||
{% endif %}
|
||||
<div class="index-text">
|
||||
<h4><a href="{{ projects.get_absolute_url }}/" class="big-title">{{projects.title}} </a></h4>
|
||||
<p> {{projects.formatted_header|safe}} </p>
|
||||
<p> {{projects.formatted_body|safe}} </p>
|
||||
{% include "opt.html" with content=projects %}
|
||||
{% include "links.html" with content=projects %}
|
||||
{% include "gallery.html" with gallery=gallery %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if latest_content_list %}
|
||||
|
||||
<div class="large-4 medium-4 columns">
|
||||
{% include "related.html" with related=projects.children.all %}
|
||||
<h4 class="sidebar-h4">Projects </h4>
|
||||
<div class="row">
|
||||
{% for content in content %}
|
||||
|
||||
{% for projects in latest_content_list %}
|
||||
<div class="row right-items">
|
||||
<div class="small-6 columns">
|
||||
<img src="{{ content.image_url }}">
|
||||
<a href="{{ projects.get_absolute_url }}"> <img src="{{ projects.image_url }}"> </a>
|
||||
</div>
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ content.get_absolute_url }}" class="sidebar-title">{{ content.title }}</a>
|
||||
<h6 class="sidebar-date">{{ content.datestart }}</h6>
|
||||
{{content.header|striptags|truncatechars:150|safe}} <a href="{{ content.get_absolute_url }}">read more</a>
|
||||
<a href="{{ projects.get_absolute_url }}" class="sidebar-title">{{ projects.title }}</a>
|
||||
<p> {{projects.formatted_teaser}} </p>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p>No projects.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
|
8
content/templates/related.html
Normal file
8
content/templates/related.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
{% if related %}
|
||||
<h4 class="sidebar-h4"> Related </h4>
|
||||
{% for content in related %}
|
||||
{% include "preview.html" %}
|
||||
{% endfor %}
|
||||
<br>
|
||||
<br>
|
||||
{% endif %}
|
71
content/templates/results.html
Normal file
71
content/templates/results.html
Normal file
|
@ -0,0 +1,71 @@
|
|||
{% extends 'base.html' %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="row">
|
||||
<div class="small-4 small-offset-2 columns results-title">
|
||||
<h3> Search results </h3>
|
||||
</div>
|
||||
</div>
|
||||
{% for content in results %}
|
||||
{% if content.type.name == 'news' %}
|
||||
<div class="row">
|
||||
<div class= "small-4 small-offset-2 columns">
|
||||
<h6 class="sidebar-date"> <font color="#ef4e5c"> <b> {{content.datestart}} </b>
|
||||
{{ content.title }} <br />
|
||||
{{ content.formatted_header|striptags|safe }} </font>
|
||||
</h6>
|
||||
</div>
|
||||
</div>
|
||||
{% elif content.type.name == 'events' %}
|
||||
<div class="row results">
|
||||
<div class="small-4 small-offset-2 columns">
|
||||
<img src="{{ content.image_url }}">
|
||||
</div>
|
||||
<div class="small-4 end columns">
|
||||
<a href="{{ content.get_absolute_url }}" class="sidebar-title">{{ content.title }}</a>
|
||||
<h6 class="sidebar-date"> <font color="#ef4e5c"> <b> {{ content.datestart }} {% if content.dateend %} - {{content.dateend}} {% endif %} </b></font>
|
||||
{% if content.place %}<br/> {{content.place}} {% endif%}</h6>
|
||||
<p> {{content.header|striptags|safe}} </p>
|
||||
<a href="{{ content.get_absolute_url }}">read more</a> </p>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="row">
|
||||
<div class="small-4 small-offset-2 columns">
|
||||
Add view for content type: {{content.type}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<br>
|
||||
<br>
|
||||
{% if results.has_other_pages %}
|
||||
<div class="row">
|
||||
<div class="small-4 small-offset-4 columns">
|
||||
<ul class="pagination">
|
||||
{% if results.has_previous %}
|
||||
<li><a href="?q={{ query }}&page={{ results.previous_page_number }}">«</a></li>
|
||||
{% else %}
|
||||
<li class="disabled"><span>«</span></li>
|
||||
{% endif %}
|
||||
{% for i in results.paginator.page_range %}
|
||||
{% if results.number == i %}
|
||||
<li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
|
||||
{% else %}
|
||||
<li><a href="?q={{ query }}&page={{ i }}">{{ i }}</a></li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if results.has_next %}
|
||||
<li><a href="?q={{ query }}&page={{ results.next_page_number }}">»</a></li>
|
||||
{% else %}
|
||||
<li class="disabled"><span>»</span></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
25
content/templates/section_index.html
Normal file
25
content/templates/section_index.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
{% include "featured.html" %}
|
||||
|
||||
<div class="large-4 medium-4 columns">
|
||||
<h4 class="sidebar-h4"> {{ section }} </h4>
|
||||
<div class="row">
|
||||
{% for content in content %}
|
||||
<div class="row right-items">
|
||||
{% if content.image_url %}
|
||||
<div class="small-6 columns">
|
||||
<img src="{{ content.image_url }}">
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ content.get_absolute_url }}/" class="sidebar-title">{{ content.title }}</a>
|
||||
<p> {{content.formatted_teaser}} </p>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
57
content/templates/texts.html
Normal file
57
content/templates/texts.html
Normal file
|
@ -0,0 +1,57 @@
|
|||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="large-8 medium-8 columns special-column">
|
||||
{% if texts.image %}
|
||||
<img src="{{ texts.image_url }}">
|
||||
{% endif %}
|
||||
<div class="index-text">
|
||||
<h4><a href="{{ texts.get_absolute_url }}/" class="big-title">{{texts.title}} </a></h4>
|
||||
<p> {{texts.formatted_header|safe}} </p>
|
||||
<p> {{texts.formatted_body|safe}} </p>
|
||||
{% include "opt.html" with content=texts %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if latest_content_list %}
|
||||
|
||||
<div class="large-4 medium-4 columns">
|
||||
{% if texts.children.all %}
|
||||
<h4 class="sidebar-h4"> Related </h4>
|
||||
{% for child in texts.children.all %}
|
||||
<div class="row related-row">
|
||||
{% if child.image %}
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ child.get_absolute_url }}"> <img src="{{ child.image_url }}"> </a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="small-6 columns">
|
||||
<h6><a href="{{ child.get_absolute_url }}" class="sidebar-title"> {{child}} </a> </h6>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<h4 class="sidebar-h4"> Texts </h4>
|
||||
<div class="row">
|
||||
|
||||
{% for texts in latest_content_list %}
|
||||
<div class="row right-items">
|
||||
{% if texts.image %}
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ texts.get_absolute_url }}"> <img src="{{ texts.image_url }}"></a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ texts.get_absolute_url }}" class="sidebar-title">{{ texts.title }}</a>
|
||||
<p> {{texts.header|striptags|truncatechars:100}} </p>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p>No texts.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
52
content/templates/works.html
Normal file
52
content/templates/works.html
Normal file
|
@ -0,0 +1,52 @@
|
|||
|
||||
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="large-8 medium-8 columns special-column">
|
||||
<img src="{{ works.image_url }}">
|
||||
<div class="index-text">
|
||||
<h4><a href="{{ works.get_absolute_url }}" class="big-title">{{works.title}} </a></h4>
|
||||
<p> {{works.formatted_header|safe}} </p>
|
||||
<p> {{works.formatted_body|safe}} </p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if latest_content_list %}
|
||||
|
||||
<div class="large-4 medium-4 columns">
|
||||
{% if works.children.all %}
|
||||
<h4 class="sidebar-h4"> Related </h4>
|
||||
{% for child in works.children.all %}
|
||||
<div class="row related-row">
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ child.get_absolute_url }}"> <img src="{{ child.image_url }}"> </a>
|
||||
</div>
|
||||
<div class="small-6 columns">
|
||||
<h6><a href="{{ child.get_absolute_url }}" class="sidebar-title"> {{child}} </a> </h6>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<h4 class="sidebar-h4"> Works </h4>
|
||||
<div class="row">
|
||||
|
||||
{% for works in latest_content_list %}
|
||||
<div class="row right-items">
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ works.get_absolute_url }}"> <img src="{{ works.image_url }}"></a>
|
||||
</div>
|
||||
<div class="small-6 columns">
|
||||
<a href="{{ works.get_absolute_url }}" class="sidebar-title">{{ works.title }}</a>
|
||||
<p> {{works.header|striptags|truncatechars:100}} </p>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p>No works.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
177
content/views.py
177
content/views.py
|
@ -1,66 +1,156 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
from django.http import HttpResponse
|
||||
from datetime import datetime
|
||||
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.db.models import Q
|
||||
from django.http import HttpResponse, Http404
|
||||
from django.shortcuts import get_object_or_404, render, redirect
|
||||
from django.urls import reverse
|
||||
from django.views.generic.list import ListView
|
||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||
|
||||
from .models import Content
|
||||
from photologue.views import GalleryListView
|
||||
from photologue.models import Photo, Gallery
|
||||
|
||||
from .models import Content, ContentContent
|
||||
|
||||
# Create your views here.
|
||||
|
||||
def index(request):
|
||||
content = Content.objects.all()
|
||||
content = content.filter(published=True)
|
||||
latest_content_list = content.order_by('-datestart')[:5]
|
||||
context = {'latest_content_list': latest_content_list}
|
||||
now = datetime.now()
|
||||
display_events = ['news', 'events']
|
||||
base = Content.objects.filter(type__name__in=display_events).order_by('-datestart')
|
||||
base = base.filter(published=True)
|
||||
upcoming_events = base.filter(datestart__gt=now)[:12]
|
||||
ongoing_events = base.filter(datestart__lt=now, dateend__gte=now)[:12]
|
||||
past_events = base.filter(Q(dateend__lt=now)|Q(dateend=None, datestart__lt=now))[:12]
|
||||
|
||||
homepage = Content.objects.filter(type__name='homepage').order_by('-datestart')[:1]
|
||||
context = {
|
||||
'upcoming_events': upcoming_events,
|
||||
'ongoing_events': ongoing_events,
|
||||
'past_events': past_events,
|
||||
'homepage': homepage}
|
||||
return render(request, 'index.html', context)
|
||||
|
||||
def content(request, shortname):
|
||||
if request.user.is_staff:
|
||||
content = get_object_or_404(Content, shortname=shortname)
|
||||
else:
|
||||
content = get_object_or_404(Content, shortname=shortname, published=True)
|
||||
return render(request, 'detail.html', {'content': content})
|
||||
|
||||
def projects(request):
|
||||
content = Content.objects.filter(type__name='ongoing').exclude(shortname='').order_by('-datestart')
|
||||
def section_index(request, types, section):
|
||||
featured = Content.objects.filter(type__name__in=types, featured=True).order_by('-datestart')[:1]
|
||||
content = Content.objects.filter(type__name__in=types).order_by('-datestart')
|
||||
if featured:
|
||||
content = content.exclude(pk=featured[0].pk)
|
||||
content = content.filter(published=True)
|
||||
return render(request, 'projects.html', {
|
||||
'content': content,
|
||||
'title': 'Projects'
|
||||
return render(request, 'section_index.html', {
|
||||
'section': section,
|
||||
'featured': featured,
|
||||
'content': content
|
||||
})
|
||||
|
||||
def events(request):
|
||||
content = Content.objects.filter(type__name='events').exclude(shortname='')
|
||||
content = Content.objects.filter(type__name='events').exclude(shortname='').order_by('-datestart')
|
||||
content = content.filter(published=True)
|
||||
def event(request):
|
||||
now = datetime.now()
|
||||
display_events = ['events']
|
||||
featured = Content.objects.filter(type__name='events', featured=True).order_by('-datestart')[:1]
|
||||
base = Content.objects.filter(type__name__in=display_events).order_by('-datestart')
|
||||
base = base.filter(published=True)
|
||||
if featured:
|
||||
base = base.exclude(pk=featured[0].pk)
|
||||
|
||||
upcoming_events = base.filter(datestart__gt=now).order_by('-datestart')
|
||||
ongoing_events = base.filter(datestart__lt=now, dateend__gte=now).order_by('-datestart')
|
||||
past_events = base.filter(Q(dateend__lt=now)|Q(dateend=None, datestart__lt=now))[:10]
|
||||
|
||||
context = {
|
||||
'upcoming_events': upcoming_events,
|
||||
'ongoing_events': ongoing_events,
|
||||
'past_events': past_events,
|
||||
'featured': featured,
|
||||
}
|
||||
return render(request, 'event.html', context)
|
||||
|
||||
|
||||
def events(request, shortname=None):
|
||||
if not shortname:
|
||||
return event(request)
|
||||
events = get_object_or_404(Content, shortname=shortname, type__name__in=['news', 'events'])
|
||||
if not events.published and not request.user.is_staff:
|
||||
raise Http404
|
||||
gallery = get_or_none(Gallery, slug=shortname)
|
||||
latest_content_list = Content.objects.filter(type__name='events').order_by('-datestart')[:10]
|
||||
return render(request, 'events.html', {'events': events, 'latest_content_list': latest_content_list, 'gallery': gallery})
|
||||
|
||||
def projects(request, shortname=None):
|
||||
if not shortname:
|
||||
return section_index(request, ['projects'], 'Projects')
|
||||
projects = get_object_or_404(Content, shortname=shortname, type__name='projects')
|
||||
if not projects.published and not request.user.is_staff:
|
||||
raise Http404
|
||||
gallery = get_or_none(Gallery, slug=shortname)
|
||||
latest_content_list = Content.objects.filter(type__name='projects').order_by('-datestart')
|
||||
return render(request, 'projects.html', {
|
||||
'content': content,
|
||||
'title': 'Upcoming Events'
|
||||
'projects': projects,
|
||||
'latest_content_list': latest_content_list,
|
||||
'gallery': gallery
|
||||
})
|
||||
|
||||
def works(request):
|
||||
content = Content.objects.filter(type__name='works').exclude(shortname='').order_by('-datestart')
|
||||
content = content.filter(published=True)
|
||||
return render(request, 'projects.html', {
|
||||
'content': content,
|
||||
'title': 'Works'
|
||||
def works(request, shortname=None):
|
||||
if not shortname:
|
||||
return section_index(request, ['works'], 'Works')
|
||||
works = get_object_or_404(Content, shortname=shortname, type__name='works')
|
||||
if not works.published and not request.user.is_staff:
|
||||
raise Http404
|
||||
gallery = get_or_none(Gallery, slug=shortname)
|
||||
latest_content_list = Content.objects.filter(type__name='works')
|
||||
return render(request, 'works.html', {'works': works, 'latest_content_list': latest_content_list, 'gallery':gallery})
|
||||
|
||||
def texts(request, shortname=None):
|
||||
if not shortname:
|
||||
return section_index(request, ['texts'], 'Texts')
|
||||
texts = get_object_or_404(Content, shortname=shortname, type__name='texts')
|
||||
gallery = get_or_none(Gallery, slug=shortname)
|
||||
latest_content_list = Content.objects.filter(type__name='texts')
|
||||
return render(request, 'texts.html', {
|
||||
'texts': texts,
|
||||
'latest_content_list': latest_content_list,
|
||||
'gallery': gallery
|
||||
})
|
||||
|
||||
def texts(request):
|
||||
content = Content.objects.filter(type__name='texts').exclude(shortname='')
|
||||
content = content.filter(published=True)
|
||||
return render(request, 'projects.html', {
|
||||
'content': content,
|
||||
'title': 'Texts'
|
||||
|
||||
def page(request, shortname):
|
||||
content = get_object_or_404(Content, shortname=shortname, type__name='page')
|
||||
if not content.published and not request.user.is_staff:
|
||||
raise Http404
|
||||
return render(request, 'page.html', {'content': content})
|
||||
|
||||
|
||||
def search(request):
|
||||
q = request.GET.get('q')
|
||||
results = Content.objects.filter(body__contains=q).order_by('-datestart')
|
||||
page = request.GET.get('page', 1)
|
||||
paginator = Paginator(results, 5)
|
||||
try:
|
||||
results = paginator.page(page)
|
||||
except PageNotAnInteger:
|
||||
results = paginator.page(1)
|
||||
except EmptyPage:
|
||||
results = paginator.page(paginator.num_pages)
|
||||
|
||||
return render(request, 'results.html', {
|
||||
'results': results,
|
||||
'query': q
|
||||
})
|
||||
|
||||
def about(request):
|
||||
content = get_object_or_404(Content, shortname='about')
|
||||
return render(request, 'detail.html', {'content': content})
|
||||
|
||||
def contact(request):
|
||||
content = get_object_or_404(Content, shortname='contact')
|
||||
return render(request, 'detail.html', {'content': content})
|
||||
class GalleryListViews(ListView):
|
||||
queryset = Gallery.objects.on_site().is_public()
|
||||
paginate_by = 20
|
||||
template_name = 'gallery_list.html'
|
||||
|
||||
def get_or_none(classmodel, **kwargs):
|
||||
try:
|
||||
return classmodel.objects.get(**kwargs)
|
||||
except classmodel.DoesNotExist:
|
||||
return None
|
||||
|
||||
|
||||
def redirect_index(request):
|
||||
|
@ -74,11 +164,12 @@ def redirect_index(request):
|
|||
def redirect_event(request):
|
||||
shortname = request.GET.get('this')
|
||||
if shortname:
|
||||
return redirect(reverse('content', kwargs={'shortname': shortname}))
|
||||
content = get_object_or_404(Content, shortname=shortname)
|
||||
return redirect(content.get_absolute_url())
|
||||
id = request.GET.get('id')
|
||||
if id:
|
||||
content = get_object_or_404(Content, id=id)
|
||||
return redirect(reverse('content', kwargs={'shortname': content.shortname}))
|
||||
return redirect(content.get_absolute_url())
|
||||
|
||||
return redirect(reverse('events'))
|
||||
|
||||
|
|
42
etc/apache2/sites-available/studio.camp.conf
Normal file
42
etc/apache2/sites-available/studio.camp.conf
Normal file
|
@ -0,0 +1,42 @@
|
|||
<VirtualHost *:80>
|
||||
ServerName studio.camp
|
||||
Redirect / https://studio.camp/
|
||||
</VirtualHost>
|
||||
|
||||
<VirtualHost *:443>
|
||||
SSLCertificateFile /etc/letsencrypt/studio.camp/cert.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/studio.camp/key.pem
|
||||
Include /etc/letsencrypt/options-ssl-apache.conf
|
||||
SSLCertificateChainFile /etc/letsencrypt/studio.camp/chain.pem
|
||||
|
||||
ServerName studio.camp
|
||||
|
||||
<Location />
|
||||
Options -Indexes
|
||||
</Location>
|
||||
<Directory /srv/camp>
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
</Directory>
|
||||
|
||||
Alias /static /srv/camp/static
|
||||
Alias /static/images /srv/camp/data/images
|
||||
|
||||
LogLevel warn
|
||||
ErrorLog /var/log/apache2/studio.camp.error.log
|
||||
CustomLog /var/log/apache2/studio.camp.log combined
|
||||
ServerSignature Off
|
||||
|
||||
ProxyRequests Off
|
||||
<Proxy *>
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
</Proxy>
|
||||
ProxyPass /static !
|
||||
ProxyPass /images !
|
||||
|
||||
RequestHeader unset Proxy
|
||||
|
||||
ProxyPass / http://127.0.0.1:8087/
|
||||
ProxyPassReverse / http://127.0.0.1:8087/
|
||||
</VirtualHost>
|
12
etc/init/camp.conf
Normal file
12
etc/init/camp.conf
Normal file
|
@ -0,0 +1,12 @@
|
|||
start on (filesystem and net-device-up IFACE=lo)
|
||||
stop on runlevel [!2345]
|
||||
|
||||
# give time to send info to trackers
|
||||
kill timeout 30
|
||||
|
||||
setuid campdjango
|
||||
setgid campdjango
|
||||
|
||||
respawn
|
||||
chdir /srv/camp
|
||||
exec /srv/camp/venv/bin/gunicorn -b 127.0.0.1:8087 camp.wsgi:application
|
14
etc/systemd/system/camp.service
Normal file
14
etc/systemd/system/camp.service
Normal file
|
@ -0,0 +1,14 @@
|
|||
[Unit]
|
||||
Description=studio.camp
|
||||
After=postgresql.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
Restart=always
|
||||
User=campdjango
|
||||
Group=campdjango
|
||||
WorkingDirectory=/srv/camp
|
||||
ExeccStart=/srv/camp/venv/bin/gunicorn -b 127.0.0.1:8087 camp.wsgi:application
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -1,3 +1,8 @@
|
|||
django<2.0
|
||||
django_extensions
|
||||
django-markdownx
|
||||
django-photologue
|
||||
django-braces
|
||||
django-app-namespace-template-loader
|
||||
ox
|
||||
gunicorn
|
||||
django_extensions
|
||||
|
|
Loading…
Reference in New Issue
Block a user