Changeset - 04f246d85071
[Not reviewed]
0 0 125
Patrick Altman - 9 years ago 2015-10-16 17:53:02
paltman@gmail.com
Initial commit of the PinaxCon demo site
125 files changed with 4805 insertions and 0 deletions:
0 comments (0 inline, 0 general)
.gitignore
Show inline comments
 
new file 100644
 
*.pyc
 
node_modules/
README.md
Show inline comments
 
new file 100644
 
# PinaxCon
 

	
 
A working demo of Symposion and the Symposion Starter Project.  Online at:
 

	
 
http://conference.pinaxproject.com/
 

	
 

	
 

	
 
## Getting Started
 

	
 
Make sure you are using a virtual environment of some sort (e.g. `virtualenv` or
 
`pyenv`).
 

	
 
```
 
createdb pinaxcon
 
pip install -r requirements.txt
 
./manage.py migrate
 
./manage.py loaddata sites conference proposal_base sitetree sponsor_benefits sponsor_levels
 
./manage.py runserver
 
```
 

	
 

	
 
pinax-boxes
 
pinax-pages
fixtures/conference.json
Show inline comments
 
new file 100644
 
[
 
    {
 
        "pk": 1,
 
        "model": "symposion_conference.conference",
 
        "fields": {
 
            "timezone": "US/Eastern",
 
            "start_date": "2040-01-01",
 
            "end_date": "2040-01-04",
 
            "title": "PinaxCon"
 
        }
 
    },
 
    {
 
        "pk": 1,
 
        "model": "symposion_conference.section",
 
        "fields": {
 
            "conference": 1,
 
            "start_date": "2040-01-01",
 
            "name": "General Sessions",
 
            "end_date": "2040-01-01",
 
            "slug": "general-sessions"
 
        }
 
    }
 
]
fixtures/proposal_base.json
Show inline comments
 
new file 100644
 
[
 
    {
 
        "pk": 1,
 
        "model": "symposion_proposals.proposalsection",
 
        "fields": {
 
            "start": null,
 
            "section": 1,
 
            "end": null,
 
            "closed": null,
 
            "published": null
 
        }
 
    },
 
    {
 
        "pk": 1,
 
        "model": "symposion_proposals.proposalkind",
 
        "fields": {
 
            "section": 1,
 
            "name": "talk",
 
            "slug": "talk"
 
        }
 
    }
 
]
fixtures/sites.json
Show inline comments
 
new file 100644
 
[
 
    {
 
        "pk": 1,
 
        "model": "sites.site",
 
        "fields": {
 
            "domain": "localhost:8000",
 
            "name": "PinaxCon"
 
        }
 
    },
 
    {
 
        "pk": 2,
 
        "model": "sites.site",
 
        "fields": {
 
            "domain": "conference.pinaxproject.com",
 
            "name": "PinaxCon"
 
        }
 
    }
 
]
fixtures/sitetree.json
Show inline comments
 
new file 100644
 
[
 
    {
 
        "pk": 1,
 
        "model": "sitetree.tree",
 
        "fields": {
 
            "alias": "main",
 
            "title": "main"
 
        }
 
    },
 
    {
 
        "pk": 1,
 
        "model": "sitetree.treeitem",
 
        "fields": {
 
            "parent": null,
 
            "access_restricted": false,
 
            "access_permissions": [],
 
            "description": "",
 
            "insitetree": true,
 
            "hint": "",
 
            "url": "pages_page \"about/\"",
 
            "inbreadcrumbs": true,
 
            "title": "About",
 
            "tree": 1,
 
            "access_perm_type": 1,
 
            "alias": null,
 
            "sort_order": 2,
 
            "inmenu": true,
 
            "access_loggedin": false,
 
            "hidden": false,
 
            "urlaspattern": true
 
        }
 
    },
 
    {
 
        "pk": 2,
 
        "model": "sitetree.treeitem",
 
        "fields": {
 
            "parent": null,
 
            "access_restricted": false,
 
            "access_permissions": [],
 
            "description": "",
 
            "insitetree": true,
 
            "hint": "",
 
            "url": "pages_page \"venue/\"",
 
            "inbreadcrumbs": true,
 
            "title": "Venue",
 
            "tree": 1,
 
            "access_perm_type": 1,
 
            "alias": null,
 
            "sort_order": 3,
 
            "inmenu": true,
 
            "access_loggedin": false,
 
            "hidden": false,
 
            "urlaspattern": true
 
        }
 
    },
 
    {
 
        "pk": 3,
 
        "model": "sitetree.treeitem",
 
        "fields": {
 
            "parent": null,
 
            "access_restricted": false,
 
            "access_permissions": [],
 
            "description": "",
 
            "insitetree": true,
 
            "hint": "",
 
            "url": "#",
 
            "inbreadcrumbs": true,
 
            "title": "Sponsors",
 
            "tree": 1,
 
            "access_perm_type": 1,
 
            "alias": null,
 
            "sort_order": 4,
 
            "inmenu": true,
 
            "access_loggedin": false,
 
            "hidden": false,
 
            "urlaspattern": false
 
        }
 
    },
 
    {
 
        "pk": 4,
 
        "model": "sitetree.treeitem",
 
        "fields": {
 
            "parent": null,
 
            "access_restricted": false,
 
            "access_permissions": [],
 
            "description": "",
 
            "insitetree": true,
 
            "hint": "",
 
            "url": "home",
 
            "inbreadcrumbs": true,
 
            "title": "Home",
 
            "tree": 1,
 
            "access_perm_type": 1,
 
            "alias": null,
 
            "sort_order": 1,
 
            "inmenu": true,
 
            "access_loggedin": false,
 
            "hidden": false,
 
            "urlaspattern": true
 
        }
 
    },
 
    {
 
        "pk": 5,
 
        "model": "sitetree.treeitem",
 
        "fields": {
 
            "parent": 3,
 
            "access_restricted": false,
 
            "access_permissions": [],
 
            "description": "",
 
            "insitetree": true,
 
            "hint": "",
 
            "url": "sponsor_apply",
 
            "inbreadcrumbs": true,
 
            "title": "Apply to be a Sponsor",
 
            "tree": 1,
 
            "access_perm_type": 1,
 
            "alias": null,
 
            "sort_order": 6,
 
            "inmenu": true,
 
            "access_loggedin": false,
 
            "hidden": false,
 
            "urlaspattern": true
 
        }
 
    },
 
    {
 
        "pk": 6,
 
        "model": "sitetree.treeitem",
 
        "fields": {
 
            "parent": 3,
 
            "access_restricted": false,
 
            "access_permissions": [],
 
            "description": "",
 
            "insitetree": true,
 
            "hint": "",
 
            "url": "sponsor_list",
 
            "inbreadcrumbs": true,
 
            "title": "{{ SITE_NAME }} Sponsors",
 
            "tree": 1,
 
            "access_perm_type": 1,
 
            "alias": null,
 
            "sort_order": 5,
 
            "inmenu": true,
 
            "access_loggedin": false,
 
            "hidden": false,
 
            "urlaspattern": true
 
        }
 
    }
 
]
fixtures/sponsor_benefits.json
Show inline comments
 
new file 100644
 
[
 
    {
 
        "pk": 2,
 
        "model": "symposion_sponsorship.benefit",
 
        "fields": {
 
            "type": "weblogo",
 
            "name": "Web Logo",
 
            "description": "Logo to appear on the website"
 
        }
 
    },
 
    {
 
        "pk": 3,
 
        "model": "symposion_sponsorship.benefit",
 
        "fields": {
 
            "type": "file",
 
            "name": "Print Logo",
 
            "description": "Logo to appear in print"
 
        }
 
    },
 
    {
 
        "pk": 4,
 
        "model": "symposion_sponsorship.benefit",
 
        "fields": {
 
            "type": "text",
 
            "name": "Sponsor Description",
 
            "description": "Description to appear on website and in print"
 
        }
 
    },
 
    {
 
        "pk": 9,
 
        "model": "symposion_sponsorship.benefitlevel",
 
        "fields": {
 
            "other_limits": "",
 
            "benefit": 4,
 
            "max_words": null,
 
            "level": 1
 
        }
 
    },
 
    {
 
        "pk": 5,
 
        "model": "symposion_sponsorship.benefitlevel",
 
        "fields": {
 
            "other_limits": "",
 
            "benefit": 3,
 
            "max_words": null,
 
            "level": 1
 
        }
 
    },
 
    {
 
        "pk": 1,
 
        "model": "symposion_sponsorship.benefitlevel",
 
        "fields": {
 
            "other_limits": "",
 
            "benefit": 2,
 
            "max_words": null,
 
            "level": 1
 
        }
 
    },
 
    {
 
        "pk": 10,
 
        "model": "symposion_sponsorship.benefitlevel",
 
        "fields": {
 
            "other_limits": "",
 
            "benefit": 4,
 
            "max_words": null,
 
            "level": 2
 
        }
 
    },
 
    {
 
        "pk": 6,
 
        "model": "symposion_sponsorship.benefitlevel",
 
        "fields": {
 
            "other_limits": "",
 
            "benefit": 3,
 
            "max_words": null,
 
            "level": 2
 
        }
 
    },
 
    {
 
        "pk": 2,
 
        "model": "symposion_sponsorship.benefitlevel",
 
        "fields": {
 
            "other_limits": "",
 
            "benefit": 2,
 
            "max_words": null,
 
            "level": 2
 
        }
 
    },
 
    {
 
        "pk": 11,
 
        "model": "symposion_sponsorship.benefitlevel",
 
        "fields": {
 
            "other_limits": "",
 
            "benefit": 4,
 
            "max_words": null,
 
            "level": 3
 
        }
 
    },
 
    {
 
        "pk": 7,
 
        "model": "symposion_sponsorship.benefitlevel",
 
        "fields": {
 
            "other_limits": "",
 
            "benefit": 3,
 
            "max_words": null,
 
            "level": 3
 
        }
 
    },
 
    {
 
        "pk": 3,
 
        "model": "symposion_sponsorship.benefitlevel",
 
        "fields": {
 
            "other_limits": "",
 
            "benefit": 2,
 
            "max_words": null,
 
            "level": 3
 
        }
 
    }
 
]
fixtures/sponsor_levels.json
Show inline comments
 
new file 100644
 
[
 
    {
 
        "pk": 1,
 
        "model": "symposion_sponsorship.sponsorlevel",
 
        "fields": {
 
            "conference": 1,
 
            "description": "",
 
            "cost": 10000,
 
            "name": "Gold",
 
            "order": 0
 
        }
 
    },
 
    {
 
        "pk": 2,
 
        "model": "symposion_sponsorship.sponsorlevel",
 
        "fields": {
 
            "conference": 1,
 
            "description": "",
 
            "cost": 5000,
 
            "name": "Silver",
 
            "order": 1
 
        }
 
    },
 
    {
 
        "pk": 3,
 
        "model": "symposion_sponsorship.sponsorlevel",
 
        "fields": {
 
            "conference": 1,
 
            "description": "",
 
            "cost": 2000,
 
            "name": "Bronze",
 
            "order": 2
 
        }
 
    }
 
]
gondor.yml
Show inline comments
 
new file 100644
 
site: eldarion-conferences/pinaxcon
 
exec:
 
  web: gunicorn --bind=0.0.0.0 --log-file - --workers=4 pinaxcon.wsgi
 
branches:
 
  master: primary
manage.py
Show inline comments
 
new file 100755
 
#!/usr/bin/env python
 

	
 
import os
 
import sys
 

	
 

	
 
if __name__ == "__main__":
 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pinaxcon.settings")
 

	
 
    from django.core.management import execute_from_command_line
 

	
 
    execute_from_command_line(sys.argv)
package.json
Show inline comments
 
new file 100644
 
{
 
  "repository": {
 
    "type": "git",
 
    "url": "https://github.com/pinax/pinax-project"
 
  },
 
  "scripts": {
 
     "build": "./node_modules/.bin/webpack --config=static/webpack.config.js -p",
 
     "watch": "./node_modules/.bin/webpack --config=static/webpack.config.js -w"
 
  },
 
  "dependencies": {
 
    "babel-core": "^5.8.23",
 
    "babel-loader": "^5.3.2",
 
    "bootstrap": "^3.3.5",
 
    "css-loader": "^0.17.0",
 
    "extract-text-webpack-plugin": "^0.8.2",
 
    "file-loader": "^0.8.4",
 
    "font-awesome": "^4.4.0",
 
    "html-webpack-plugin": "^1.6.1",
 
    "jquery": "^2.1.4",
 
    "less": "^2.5.1",
 
    "less-loader": "^2.2.0",
 
    "style-loader": "^0.12.3",
 
    "webpack": "^1.12.1"
 
  }
 
}
pinaxcon/__init__.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 

	
 
__about__ = """
 
In addition to what is provided by the "zero" project, this project
 
provides thorough integration with django-user-accounts, adding
 
comprehensive account management functionality. It is a foundation
 
suitable for most sites that have user accounts.
 
"""
 

	
 
default_app_config = "pinaxcon.apps.AppConfig"
pinaxcon/apps.py
Show inline comments
 
new file 100644
 
from importlib import import_module
 

	
 
from django.apps import AppConfig as BaseAppConfig
 

	
 

	
 
class AppConfig(BaseAppConfig):
 

	
 
    name = "pinaxcon"
 

	
 
    def ready(self):
 
        import_module("pinaxcon.receivers")
pinaxcon/hooks.py
Show inline comments
 
new file 100644
 
import markdown
 

	
 
import pinax.boxes.hooks
 
import pinax.pages.hooks
 

	
 

	
 
def markup_renderer(content):
 
    return markdown.markdown(content)
 

	
 

	
 
class PinaxBoxesHookSet(pinax.boxes.hooks.DefaultHookSet):
 

	
 
    def parse_content(self, content):
 
        return markup_renderer(content)
 

	
 

	
 
class PinaxPagesHookSet(pinax.pages.hooks.DefaultHookSet):
 

	
 
    def parse_content(self, content):
 
        return markup_renderer(content)
pinaxcon/proposals/__init__.py
Show inline comments
 
new file 100644
pinaxcon/proposals/admin.py
Show inline comments
 
new file 100644
 
from django.contrib import admin
 

	
 
from .models import TalkProposal
 

	
 

	
 
admin.site.register(TalkProposal)
pinaxcon/proposals/forms.py
Show inline comments
 
new file 100644
 
from django import forms
 

	
 
from .models import TalkProposal
 

	
 

	
 
class ProposalForm(forms.ModelForm):
 

	
 
    def clean_description(self):
 
        value = self.cleaned_data["description"]
 
        if len(value) > 400:
 
            raise forms.ValidationError(
 
                u"The description must be less than 400 characters"
 
            )
 
        return value
 

	
 

	
 
class TalkProposalForm(ProposalForm):
 

	
 
    class Meta:
 
        model = TalkProposal
 
        fields = [
 
            "title",
 
            "audience_level",
 
            "description",
 
            "abstract",
 
            "additional_notes",
 
            "recording_release",
 
        ]
pinaxcon/proposals/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 
from __future__ import unicode_literals
 

	
 
from django.db import models, migrations
 

	
 

	
 
class Migration(migrations.Migration):
 

	
 
    dependencies = [
 
        ('symposion_proposals', '__first__'),
 
    ]
 

	
 
    operations = [
 
        migrations.CreateModel(
 
            name='TalkProposal',
 
            fields=[
 
                ('proposalbase_ptr', models.OneToOneField(primary_key=True, to='symposion_proposals.ProposalBase', parent_link=True, auto_created=True, serialize=False)),
 
                ('audience_level', models.IntegerField(choices=[(1, b'Novice'), (3, b'Intermediate'), (2, b'Experienced')])),
 
                ('recording_release', models.BooleanField(help_text=b'By submitting your proposal, you agree to give permission to the conference organizers to record, edit, and release audio and/or video of your presentation. If you do not agree to this, please uncheck this box.', default=True)),
 
            ],
 
            options={
 
                'verbose_name': 'talk proposal',
 
            },
 
            bases=('symposion_proposals.proposalbase',),
 
        ),
 
    ]
pinaxcon/proposals/migrations/__init__.py
Show inline comments
 
new file 100644
pinaxcon/proposals/models.py
Show inline comments
 
new file 100644
 
from django.db import models
 

	
 
from symposion.proposals.models import ProposalBase
 

	
 

	
 
class Proposal(ProposalBase):
 

	
 
    AUDIENCE_LEVEL_NOVICE = 1
 
    AUDIENCE_LEVEL_EXPERIENCED = 2
 
    AUDIENCE_LEVEL_INTERMEDIATE = 3
 

	
 
    AUDIENCE_LEVELS = [
 
        (AUDIENCE_LEVEL_NOVICE, "Novice"),
 
        (AUDIENCE_LEVEL_INTERMEDIATE, "Intermediate"),
 
        (AUDIENCE_LEVEL_EXPERIENCED, "Experienced"),
 
    ]
 

	
 
    audience_level = models.IntegerField(choices=AUDIENCE_LEVELS)
 

	
 
    recording_release = models.BooleanField(
 
        default=True,
 
        help_text="By submitting your proposal, you agree to give permission to the conference organizers to record, edit, and release audio and/or video of your presentation. If you do not agree to this, please uncheck this box."
 
    )
 

	
 
    class Meta:
 
        abstract = True
 

	
 

	
 
class TalkProposal(Proposal):
 

	
 
    class Meta:
 
        verbose_name = "talk proposal"
pinaxcon/receivers.py
Show inline comments
 
new file 100644
 
from django.dispatch import receiver
 

	
 
from account.signals import password_changed
 
from account.signals import user_sign_up_attempt, user_signed_up
 
from account.signals import user_login_attempt, user_logged_in
 

	
 
from pinax.eventlog.models import log
 

	
 

	
 
@receiver(user_logged_in)
 
def handle_user_logged_in(sender, **kwargs):
 
    log(
 
        user=kwargs.get("user"),
 
        action="USER_LOGGED_IN",
 
        extra={}
 
    )
 

	
 

	
 
@receiver(password_changed)
 
def handle_password_changed(sender, **kwargs):
 
    log(
 
        user=kwargs.get("user"),
 
        action="PASSWORD_CHANGED",
 
        extra={}
 
    )
 

	
 

	
 
@receiver(user_login_attempt)
 
def handle_user_login_attempt(sender, **kwargs):
 
    log(
 
        user=None,
 
        action="LOGIN_ATTEMPTED",
 
        extra={
 
            "username": kwargs.get("username"),
 
            "result": kwargs.get("result")
 
        }
 
    )
 

	
 

	
 
@receiver(user_sign_up_attempt)
 
def handle_user_sign_up_attempt(sender, **kwargs):
 
    log(
 
        user=None,
 
        action="SIGNUP_ATTEMPTED",
 
        extra={
 
            "username": kwargs.get("username"),
 
            "email": kwargs.get("email"),
 
            "result": kwargs.get("result")
 
        }
 
    )
 

	
 

	
 
@receiver(user_signed_up)
 
def handle_user_signed_up(sender, **kwargs):
 
    log(
 
        user=kwargs.get("user"),
 
        action="USER_SIGNED_UP",
 
        extra={}
 
    )
pinaxcon/settings.py
Show inline comments
 
new file 100644
 
import os
 
import dj_database_url
 

	
 

	
 
PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
 
PACKAGE_ROOT = os.path.abspath(os.path.dirname(__file__))
 
BASE_DIR = PACKAGE_ROOT
 

	
 
DEBUG = bool(int(os.environ.get("DEBUG", "1")))
 

	
 
DATABASES = {
 
    "default": dj_database_url.config(default="postgres://localhost/pinaxcon")
 
}
 

	
 
ALLOWED_HOSTS = [
 
    os.environ.get("GONDOR_INSTANCE_DOMAIN"),
 
    "conference.pinaxproject.com"
 
]
 

	
 
# Local time zone for this installation. Choices can be found here:
 
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
 
# although not all choices may be available on all operating systems.
 
# On Unix systems, a value of None will cause Django to use the same
 
# timezone as the operating system.
 
# If running in a Windows environment this must be set to the same as your
 
# system time zone.
 
TIME_ZONE = "UTC"
 

	
 
# Language code for this installation. All choices can be found here:
 
# http://www.i18nguy.com/unicode/language-identifiers.html
 
LANGUAGE_CODE = "en-us"
 

	
 
SITE_ID = int(os.environ.get("SITE_ID", 1))
 

	
 
# If you set this to False, Django will make some optimizations so as not
 
# to load the internationalization machinery.
 
USE_I18N = True
 

	
 
# If you set this to False, Django will not format dates, numbers and
 
# calendars according to the current locale.
 
USE_L10N = True
 

	
 
# If you set this to False, Django will not use timezone-aware datetimes.
 
USE_TZ = True
 

	
 
# Absolute filesystem path to the directory that will hold user-uploaded files.
 
# Example: "/home/media/media.lawrence.com/media/"
 
MEDIA_ROOT = os.path.join(PACKAGE_ROOT, "site_media", "media")
 

	
 
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
 
# trailing slash.
 
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
 
MEDIA_URL = "/site_media/media/"
 

	
 
# Absolute path to the directory static files should be collected to.
 
# Don"t put anything in this directory yourself; store your static files
 
# in apps" "static/" subdirectories and in STATICFILES_DIRS.
 
# Example: "/home/media/media.lawrence.com/static/"
 
STATIC_ROOT = os.path.join(PACKAGE_ROOT, "site_media", "static")
 

	
 
# URL prefix for static files.
 
# Example: "http://media.lawrence.com/static/"
 
STATIC_URL = "/site_media/static/"
 

	
 
# Additional locations of static files
 
STATICFILES_DIRS = [
 
    os.path.join(PROJECT_ROOT, "static", "dist"),
 
]
 

	
 
# List of finder classes that know how to find static files in
 
# various locations.
 
STATICFILES_FINDERS = [
 
    "django.contrib.staticfiles.finders.FileSystemFinder",
 
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",
 
]
 

	
 
# Make this unique, and don't share it with anybody.
 
SECRET_KEY = "6r&z0i#!k-thu4nv^zzx!f$fbp(&#2i5mq_^%%@ihu_qxxotl_"
 

	
 
TEMPLATES = [
 
    {
 
        "BACKEND": "django.template.backends.django.DjangoTemplates",
 
        "DIRS": [
 
            os.path.join(PACKAGE_ROOT, "templates"),
 
        ],
 
        "APP_DIRS": True,
 
        "OPTIONS": {
 
            "debug": DEBUG,
 
            "context_processors": [
 
                "django.contrib.auth.context_processors.auth",
 
                "django.core.context_processors.debug",
 
                "django.core.context_processors.i18n",
 
                "django.core.context_processors.media",
 
                "django.core.context_processors.static",
 
                "django.core.context_processors.tz",
 
                "django.core.context_processors.request",
 
                "django.contrib.messages.context_processors.messages",
 
                "account.context_processors.account",
 
                "pinax_theme_bootstrap.context_processors.theme",
 
                "symposion.reviews.context_processors.reviews",
 
            ],
 
        },
 
    },
 
]
 

	
 
MIDDLEWARE_CLASSES = [
 
    "django.contrib.sessions.middleware.SessionMiddleware",
 
    "django.middleware.common.CommonMiddleware",
 
    "django.middleware.csrf.CsrfViewMiddleware",
 
    "django.contrib.auth.middleware.AuthenticationMiddleware",
 
    "django.contrib.auth.middleware.SessionAuthenticationMiddleware",
 
    "django.contrib.messages.middleware.MessageMiddleware",
 
    "reversion.middleware.RevisionMiddleware",
 
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
 
]
 

	
 
ROOT_URLCONF = "pinaxcon.urls"
 

	
 
# Python dotted path to the WSGI application used by Django's runserver.
 
WSGI_APPLICATION = "pinaxcon.wsgi.application"
 

	
 
INSTALLED_APPS = [
 
    "django.contrib.admin",
 
    "django.contrib.auth",
 
    "django.contrib.contenttypes",
 
    "django.contrib.messages",
 
    "django.contrib.sessions",
 
    "django.contrib.sites",
 
    "django.contrib.staticfiles",
 

	
 
    # theme
 
    "bootstrapform",
 
    "pinax_theme_bootstrap",
 

	
 
    # external
 
    "account",
 
    "easy_thumbnails",
 
    "taggit",
 
    "reversion",
 
    "metron",
 
    "sitetree",
 
    "pinax.boxes",
 
    "pinax.eventlog",
 
    "pinax.pages",
 

	
 
    # symposion
 
    "symposion",
 
    "symposion.conference",
 
    "symposion.proposals",
 
    "symposion.reviews",
 
    "symposion.schedule",
 
    "symposion.speakers",
 
    "symposion.sponsorship",
 
    "symposion.teams",
 

	
 
    # project
 
    "pinaxcon",
 
    "pinaxcon.proposals"
 
]
 

	
 
# A sample logging configuration. The only tangible logging
 
# performed by this configuration is to send an email to
 
# the site admins on every HTTP 500 error when DEBUG=False.
 
# See http://docs.djangoproject.com/en/dev/topics/logging for
 
# more details on how to customize your logging configuration.
 
LOGGING = {
 
    "version": 1,
 
    "disable_existing_loggers": False,
 
    "filters": {
 
        "require_debug_false": {
 
            "()": "django.utils.log.RequireDebugFalse"
 
        }
 
    },
 
    "handlers": {
 
        "mail_admins": {
 
            "level": "ERROR",
 
            "filters": ["require_debug_false"],
 
            "class": "django.utils.log.AdminEmailHandler"
 
        }
 
    },
 
    "loggers": {
 
        "django.request": {
 
            "handlers": ["mail_admins"],
 
            "level": "ERROR",
 
            "propagate": True,
 
        },
 
    }
 
}
 

	
 
FIXTURE_DIRS = [
 
    os.path.join(PROJECT_ROOT, "fixtures"),
 
]
 

	
 
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
 

	
 
ACCOUNT_OPEN_SIGNUP = True
 
ACCOUNT_EMAIL_UNIQUE = True
 
ACCOUNT_EMAIL_CONFIRMATION_REQUIRED = False
 
ACCOUNT_LOGIN_REDIRECT_URL = "home"
 
ACCOUNT_LOGOUT_REDIRECT_URL = "home"
 
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 2
 
ACCOUNT_USE_AUTH_AUTHENTICATE = True
 

	
 
AUTHENTICATION_BACKENDS = [
 
    "symposion.teams.backends.TeamPermissionsBackend",
 
    "account.auth_backends.UsernameAuthenticationBackend",
 
]
 

	
 
CONFERENCE_ID = 1
 
PROPOSAL_FORMS = {
 
    "talk": "pinaxcon.proposals.forms.TalkProposalForm",
 
}
 
PINAX_PAGES_HOOKSET = "pinaxcon.hooks.PinaxPagesHookSet"
 
PINAX_BOXES_HOOKSET = "pinaxcon.hooks.PinaxBoxesHookSet"
pinaxcon/templates/_account_bar.html
Show inline comments
 
new file 100644
 
{% load i18n %}
 
{% load account_tags %}
 

	
 

	
 
<ul class="nav navbar-nav pull-right">
 
    {% if request.user.is_authenticated %}
 
        <span class="navbar-text">
 
            <i class="fa fa-user"></i> {% user_display request.user %}
 
        </span>
 
        <li>
 
            <a href="{% url "dashboard" %}"><i class="fa fa-tasks"></i> {% trans "Dashboard" %}</a>
 
        </li>
 
        <li>
 
            <a href="{% url 'account_settings' %}"><i class="fa fa-cog"></i> {% trans "Settings" %}</a>
 
        </li>
 
        <li>
 
            <a id="account_logout" href="{% url 'account_logout' %}"><i class="fa fa-power-off"></i> {% trans "Log out" %}</a>
 
        </li>
 
    {% else %}
 
        <li><a href="{% url 'account_login' %}">{% trans "Log in" %}</a></li>
 
        {% if ACCOUNT_OPEN_SIGNUP %}
 
            <li><a href="{% url 'account_signup' %}">{% trans "Sign up" %}</a></li>
 
        {% endif %}
 
    {% endif %}
 
</ul>
 

	
 
<form id="accountLogOutForm" style="display: none;" action="{% url 'account_logout' %}" method="POST">
 
    {% csrf_token %}
 
</form>
pinaxcon/templates/_default_sidebar.html
Show inline comments
 
new file 100644
 
{% load sponsorship_tags %}
 
{% load thumbnail %}
 
{% load pinax_boxes_tags %}
 

	
 
{% sponsor_levels as levels %}
 

	
 
<h4>Sponsors</h4>
 

	
 
<div class="sponsor-list">
 
    {% box "sponsor-top" %}
 
    {% for level in levels %}
 
        {% if level.sponsors %}
 
            <h3 style="margin-top: 3em;">{{ level.name }}</h3>
 
\
 
            {% for sponsor in level.sponsors %}
 
                <div style="margin: 10px 0;">
 
                    <a href="{{ sponsor.external_url }}">
 
                        <img src="{% thumbnail sponsor.website_logo '100x60' %}" alt="{{ sponsor.name }}" />
 
                    </a>
 
                </div>
 
            {% endfor %}
 
        {% endif %}
 
    {% endfor %}
 
</div>
pinaxcon/templates/_footer.html
Show inline comments
 
new file 100644
 
<div class="pull-left">
 
    &copy;2015
 
</div>
 

	
 
<div class="pull-right">
 
    Site powered by <a href="http://eldarion.com/symposion/"><b>Symposion</b></a>.
 
</div>
pinaxcon/templates/_scripts.html
Show inline comments
 
new file 100644
 
<script src='/site_media/static/js/site.js?45281e7e2f5ad8c9f8a5'></script>
pinaxcon/templates/_styles.html
Show inline comments
 
new file 100644
 
<link href='/site_media/static/css/site.css?45281e7e2f5ad8c9f8a5' rel='stylesheet' />
pinaxcon/templates/dashboard.html
Show inline comments
 
new file 100644
 
{% extends "site_base.html" %}
 

	
 
{% load i18n %}
 
{% load proposal_tags %}
 
{% load review_tags %}
 
{% load teams_tags %}
 

	
 
{% block head_title %}Dashboard{% endblock %}
 

	
 
{% block body_class %}auth{% endblock %}
 

	
 
{% block body %}
 
    <div class="panel panel-default">
 
        <div class="panel-heading">
 
            <div class="pull-right">
 
                {% if not user.speaker_profile %}
 
                    <a href="{% url "speaker_create" %}" class="btn btn-xs btn-default">
 
                        <i class="fa fa-plus-sign"></i> Create a speaker profile
 
                    </a>
 
                {% else %}
 
                    <a href="{% url "speaker_edit" %}" class="btn btn-xs btn-default">
 
                        <i class="fa fa-pencil"></i> Edit your speaker profile
 
                    </a>
 
                    <a href="{% url "proposal_submit" %}" class="btn btn-xs btn-default">
 
                        <i class="fa fa-plus-sign"></i> Submit a new proposal
 
                    </a>
 
                {% endif %}
 
            </div>
 
            <h3 class="panel-title">
 
                <i class="fa fa-bullhorn"></i>
 
                {% trans "Speaking" %}
 
            </h3>
 
        </div>
 

	
 
        <div class="panel-body">
 
            {% if not user.speaker_profile %}
 
                <p>To submit a proposal, you must first <a href="{% url "speaker_create" %}">create a speaker profile</a>.</p>
 
            {% else %}
 
                <h4>Your Proposals</h4>
 
                {% if not user.speaker_profile.proposals.exists %}
 
                    <p>No proposals submitted yet.</p>
 
                {% endif %}
 
            {% endif %}
 
        </div>
 
        {% if user.speaker_profile.proposals.exists %}
 
            <table class="table">
 
                <tr>
 
                    <th>Title</th>
 
                    <th>Session type</th>
 
                    <th>Status</th>
 
                    <th>Actions</th>
 
                </tr>
 
                {% for proposal in user.speaker_profile.proposals.all %}
 
                    {% include "symposion/proposals/_proposal_row.html" %}
 
                {% endfor %}
 
            </table>
 
        {% endif %}
 

	
 
        {% if user.speaker_profile %}
 
            {% associated_proposals as associated_proposals %}
 
            {% if associated_proposals %}
 
                <div class="panel-body">
 
                    <h4>Proposals you have joined as an additional speaker</h4>
 
                </div>
 
                <table class="table">
 
                    <tr>
 
                        <th>Title</th>
 
                        <th>Session type</th>
 
                        <th>Status</th>
 
                        <th>Actions</th>
 
                    </tr>
 
                    {% for proposal in associated_proposals %}
 
                        {% include "symposion/proposals/_proposal_row.html" %}
 
                    {% endfor %}
 
                </table>
 
            {% endif %}
 

	
 
            {% pending_proposals as pending_proposals %}
 
            {% if pending_proposals %}
 
                <div class="panel-body"><h4>Proposals you have been invited to join</h4></div>
 
                <table class="table">
 
                    <tr>
 
                        <th>Title</th>
 
                        <th>Session type</th>
 
                        <th>Status</th>
 
                        <th>Actions</th>
 
                    </tr>
 
                    {% for proposal in pending_proposals %}
 
                        {% include "symposion/proposals/_pending_proposal_row.html" %}
 
                    {% endfor %}
 
                </table>
 
            {% endif %}
 
        {% endif %}
 
    </div>
 

	
 
    <div class="panel panel-default">
 
        <div class="panel-heading">
 
            <div class="pull-right header-actions">
 
                {% if not user.sponsorships.exists %}
 
                    <a href="{% url "sponsor_apply" %}" class="btn btn-xs btn-default">
 
                        <i class="fa fa-plus-sign"></i>
 
                        Apply to be a sponsor
 
                    </a>
 
                {% endif %}
 
            </div>
 
            <h3 class="panel-title">
 
                <i class="fa fa-briefcase"></i>
 
                {% trans "Sponsorship" %}
 
            </h3>
 
        </div>
 

	
 
        <div class="panel-body">
 
            {% if not user.sponsorships.exists %}
 
                <p>If you or your organization would be interested in sponsorship opportunities, <a href="{% url "sponsor_apply" %}">use our online form to apply to be a sponsor</a>.
 
            {% else %}
 
                <h4>Your Sponsorship</h4>
 
                <ul class="list-group">
 
                    {% for sponsorship in user.sponsorships.all %}
 
                        <li class="list-group-item">
 
                            <a href="{% url "sponsor_detail" sponsorship.pk %}"><b>{{ sponsorship.name }}</b></a>
 
                            ({{ sponsorship.level }})
 
                            {% if not sponsorship.active %}
 
                                <span class="label label-warning">awaiting approval</span>
 
                            {% endif %}
 
                        </li>
 
                    {% endfor %}
 
                </ul>
 
            {% endif %}
 
            {% if user.is_staff %}
 
                <p>
 
                    As staff, you can directly <a href="{% url "sponsor_add" %}">add a sponsor</a> if the organization isn't
 
                    applying themselves.
 
                </p>
 
            {% endif %}
 
        </div>
 
    </div>
 

	
 
    {% if review_sections %}
 
        <div class="panel panel-default">
 
            <div class="panel-heading">
 
                <h3 class="panel-title">
 
                    <i class="fa fa-briefcase"></i>
 
                    {% trans "Reviews" %}
 
                </h3>
 
            </div>
 
            <div class="panel-body">
 
                <h4>Reviews by Section</h4>
 
                <ul>
 
                    {% for section in review_sections %}
 
                        <h5>{{ section }}</h5>
 
                        <li><a href="{% url "review_section" section.section.slug %}">All</a></li>
 
                        <li><a href="{% url "user_reviewed" section.section.slug %}">Reviewed by you</a></li>
 
                        <li><a href="{% url "user_not_reviewed" section.section.slug %}">Not Reviewed by you</a></li>
 
                    {% endfor %}
 
                </ul>
 

	
 
                {% comment %}
 
                <h4>My Assignments</h4>
 
                <table class="table">
 
                    <thead>
 
                        <td>Proposal Title</td>
 
                        <td>Score</td>
 
                    </thead>
 
                    <tbody>
 
                        <tr>
 
                            <td>Title Three</td>
 
                            <td>-1</td>
 
                        </tr>
 
                        <tr>
 
                            <td>Title Four</td>
 
                            <td>+2</td>
 
                        </tr>
 
                    </tbody>
 
                </table>
 
                {% endcomment %}
 

	
 
            </div>
 
    </div>
 
    {% endif %}
 

	
 
    {% available_teams as available_teams %}
 
    {% if user.memberships.exists or available_teams %}
 
        <div class="panel panel-default">
 
            <div class="panel-heading">
 
                <h3 class="panel-title">
 
                    <i class="fa fa-group"></i>
 
                    {% trans "Teams" %}
 
                </h3>
 
            </div>
 

	
 
            {% if user.memberships.exists %}