Browse Source

Merge branch 'psql'

master
j 7 years ago
parent
commit
9f33c16619
  1. 8
      .gitignore
  2. 4
      README.md
  3. 29
      camp/settings.py
  4. 0
      camp/static/css/app.css
  5. BIN
      camp/static/css/controls.png
  6. 17
      camp/static/css/foundation.css
  7. 0
      camp/static/css/foundation.min.css
  8. 170
      camp/static/css/jquery.bxslider.css
  9. 144
      camp/static/css/main.css
  10. 33
      camp/static/css/unslider-dots.css
  11. 1
      camp/static/css/unslider.css
  12. 0
      camp/static/js/app.js
  13. 0
      camp/static/js/foundation.js
  14. 0
      camp/static/js/foundation.min.js
  15. 1607
      camp/static/js/jquery.bxslider.js
  16. 0
      camp/static/js/jquery.js
  17. 1
      camp/static/js/unslider.min.js
  18. 0
      camp/static/js/what-input.js
  19. 36
      camp/urls.py
  20. 58
      content/admin.py
  21. 130
      content/migrations/0001_initial.py
  22. 38
      content/migrations/0002_auto_20170621_0915.py
  23. 42
      content/migrations/0003_auto_20171218_1103.py
  24. 31
      content/migrations/0004_auto_20171218_1149.py
  25. 85
      content/migrations/0005_auto_20171219_1032.py
  26. 371
      content/models.py
  27. 92
      content/static/css/main.css
  28. 40
      content/templates/base.html
  29. 157
      content/templates/detail.html
  30. 21
      content/templates/event.html
  31. 38
      content/templates/event_preview.html
  32. 52
      content/templates/events.html
  33. 21
      content/templates/featured.html
  34. 8
      content/templates/gallery.html
  35. 44
      content/templates/index.html
  36. 12
      content/templates/links.html
  37. 18
      content/templates/opt.html
  38. 17
      content/templates/page.html
  39. 20
      content/templates/photologue/gallery_detail.html
  40. 46
      content/templates/photologue/photo_detail.html
  41. 21
      content/templates/preview.html
  42. 59
      content/templates/projects.html
  43. 8
      content/templates/related.html
  44. 71
      content/templates/results.html
  45. 25
      content/templates/section_index.html
  46. 57
      content/templates/texts.html
  47. 52
      content/templates/works.html
  48. 177
      content/views.py
  49. 42
      etc/apache2/sites-available/studio.camp.conf
  50. 12
      etc/init/camp.conf
  51. 14
      etc/systemd/system/camp.service
  52. 7
      requirements.txt

8
.gitignore

@ -1,2 +1,10 @@
static
data
*.pyc
__pycache__
venv
local_settings.py
camp.json
*.swp
*.swo
secret.txt

4
README.md

@ -0,0 +1,4 @@
setup venv:
virtualenv --system-site-packages venv

29
camp/settings.py

@ -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/'

0
content/static/css/app.css → camp/static/css/app.css

BIN
camp/static/css/controls.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

17
content/static/css/foundation.css → camp/static/css/foundation.css

@ -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 {

0
content/static/css/foundation.min.css → camp/static/css/foundation.min.css

170
camp/static/css/jquery.bxslider.css

@ -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

@ -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

@ -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

@ -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}

0
content/static/js/app.js → camp/static/js/app.js

0
content/static/js/foundation.js → camp/static/js/foundation.js

0
content/static/js/foundation.min.js → camp/static/js/foundation.min.js

1607
camp/static/js/jquery.bxslider.js

File diff suppressed because it is too large

0
content/static/js/jquery.js → camp/static/js/jquery.js

1
camp/static/js/unslider.min.js

@ -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)

0
content/static/js/what-input.js → camp/static/js/what-input.js

36
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'^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'),
]
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'),
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
url(r'^(?P<shortname>.+)/$', views.content, name='content'),
urlpatterns += [
url(r'^(?P<shortname>\w+)/$', views.page, name='page')
]

58
content/admin.py

@ -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)

130
content/migrations/0001_initial.py

@ -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

@ -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

@ -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

@ -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

@ -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')]),
),
]

371
content/models.py

@ -2,127 +2,199 @@
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 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')
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):
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")
# delete after migration
parentid = models.IntegerField(null=True, db_column='parentID', blank=True, editable=False)
# end of delte
def __unicode__(self):
return self.title or 'Untitled'
return self.title
class Meta:
db_table = 'content'
@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')
class Resources(models.Model):
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
TYPE_CHOICES = (
(1, "Resources"),
(2, "Images"),
(3, "Links"),
)
class Meta:
managed = True
db_table = 'content'
type = models.IntegerField(choices=TYPE_CHOICES)
href = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
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)
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.href
return self.contentid1.title
def get_absolute_url(self):
href = self.href
if not href.startswith('http') and not href.startswith('/'):
href = '/' + href
if href.startswith('/'):
href = 'https://studio.camp' + href
return href
class Meta:
# managed = False
db_table = 'content_content'
@property
def is_image(self):
if self.mime:
return self.mime.lower() in ('gif', 'jpeg', 'jpg', 'png')
def reverse(self):
r, created = ContentContent.objects.get_or_create(contentid1=self.contentid2, contentid2=self.contentid1)
return r
@property
def is_audio(self):
if self.mime:
return self.mime.lower() in ('mp3', 'ogg')
def save(self, *args, **kwargs):
super(ContentContent, self).save(*args, **kwargs)
self.reverse()
@property
def is_video(self):
if self.mime:
return self.mime.lower() in ('ogv', 'mp4')
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:
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')
# managed = False
db_table = 'content_keyword'
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')
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'
@ -135,39 +207,20 @@ class ContentTypes(models.Model):
return self.name
class Meta:
# managed = False
db_table = 'content_types'
class Views(models.Model):
class Keywords(models.Model):
name = models.CharField(max_length=255)
href = models.CharField(max_length=255, blank=True, null=True)
def __unicode__(self):
return self.name
class Meta:
db_table = 'views'
# unused but has values in db
class Acrolike(models.Model):
title = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
class Meta:
db_table = 'acrolike'
# managed = False
db_table = 'keywords'
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):
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)
@ -184,6 +237,7 @@ class People(models.Model):
return self.name
class Meta:
# managed = False
db_table = 'people'
@ -193,6 +247,7 @@ class PersonContent(models.Model):
level = models.IntegerField()
class Meta:
# managed = False
db_table = 'person_content'
@ -201,67 +256,107 @@ class PersonResource(models.Model):
resourceid = models.ForeignKey("resources", db_column="resourceID")
class Meta:
# managed = False
db_table = 'person_resource'
class Videos(models.Model):
sha1 = models.CharField(max_length=50)
class Resources(models.Model):
TYPE_CHOICES = (
(1, "Resources"),
(2, "Images"),
(3, "Links"),
)
type = models.IntegerField(choices=TYPE_CHOICES)
href = models.CharField(max_length=255)
title = models.TextField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
mime = models.CharField(max_length=10, 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)
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.
class Meta:
db_table = 'videos'
def get_absolute_url(self):
href = self.href
if not href.startswith('http') and not href.startswith('/'):
href = '/' + href
if href.startswith('/'):
href = 'https://studio.camp' + href
return href
def image_url(self):
return settings.IMAGE_PREFIX + self.image
@property
def is_image(self):
if self.mime:
return self.mime.lower() in ('gif', 'jpeg', 'jpg', 'png')
@property
def is_audio(self):
if self.mime:
return self.mime.lower() in ('mp3', 'ogg')
# UNUSED
@property
def is_video(self):
if self.mime:
return self.mime.lower() in ('ogv', 'mp4')
class Audios(models.Model):
filename = models.CharField(max_length=255)
title = models.CharField(max_length=255, blank=True, null=True)
class Meta:
# managed = False
db_table = 'resources'
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)
class Meta:
db_table = 'audios'
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 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 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 = 'comments'
# managed = False
db_table = 'videos'
class Keywords(models.Model):
class Views(models.Model):
name = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
href = models.CharField(max_length=255, blank=True, null=True)
def __unicode__(self):
return self.name
class Meta:
db_table = 'keywords'
# managed = False
db_table = 'views'
class ContentKeyword(models.Model):
content = models.ForeignKey('Content', db_column='contentID')
keyword = models.ForeignKey('Keywords', db_column='keywordID')
class Meta:
db_table = 'content_keyword'
class MyModel(models.Model):
myfield = MarkdownxField()

92
content/static/css/main.css

@ -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;
}

40
content/templates/base.html

@ -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>

157
content/templates/detail.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

@ -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

@ -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

@ -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

@ -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

@ -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 %}

44
content/templates/index.html

@ -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>
{% endif %}
</div>
</div>
{% 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>
{% endblock %}

12
content/templates/links.html

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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>

59
content/templates/projects.html

@ -1,22 +1,45 @@
{% extends 'base.html' %}
{% block content %}
<div class="large-4 medium-4 columns">
<h4 class="sidebar-h4">{{ title }}</h4>
<div class="row">
{% for content in content %}
<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>
{{content.header|striptags|truncatechars:150|safe}} <a href="{{ content.get_absolute_url }}">read more</a>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}
<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 projects in latest_content_list %}
<div class="row right-items">
<div class="small-6 columns">
<a href="{{ projects.get_absolute_url }}"> <img src="{{ projects.image_url }}"> </a>
</div>
<div class="small-6 columns">
<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 %}

8
content/templates/related.html

@ -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

@ -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 }}">&laquo;</a></li>
{% else %}
<li class="disabled"><span>&laquo;</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 }}">&raquo;</a></li>
{% else %}
<li class="disabled"><span>&raquo;</span></li>
{% endif %}
</ul>
</div>
</div>
{% endif %}
</div>
{% endblock %}

25
content/templates/section_index.html

@ -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

@ -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

@ -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

@ -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 photologue.views import GalleryListView
from photologue.models import Photo, Gallery
from .models import Content
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

@ -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

@ -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

@ -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

7
requirements.txt

@ -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…
Cancel
Save