Changeset - 6d0e5bc50884
[Not reviewed]
Merge
4 16 20
Patrick Altman - 10 years ago 2014-12-15 22:08:12
paltman@gmail.com
Merge branch 'pyohio-master'
39 files changed with 1533 insertions and 248 deletions:
setup.py
13
2
0 comments (0 inline, 0 general)
README.rst
Show inline comments
 
Symposion
 
---------
 

	
 
.. image:: https://img.shields.io/travis/pinax/symposion.svg
 
    :target: https://travis-ci.org/pinax/symposion
 

	
 
.. image:: https://img.shields.io/coveralls/pinax/symposion.svg
 
    :target: https://coveralls.io/r/pinax/symposion
 

	
 
.. image:: https://img.shields.io/pypi/dm/symposion.svg
 
    :target:  https://pypi.python.org/pypi/symposion/
 

	
 
.. image:: https://img.shields.io/pypi/v/symposion.svg
 
    :target:  https://pypi.python.org/pypi/symposion/
 

	
 
.. image:: https://img.shields.io/badge/license-MIT-blue.svg
 
    :target:  https://pypi.python.org/pypi/symposion/
 

	
 

	
 

	
 
A conference management solution from Eldarion.
 

	
 
Built with the generous support of the Python Software Foundation.
 

	
 
See http://eldarion.com/symposion/ for commercial support, customization and hosting
 

	
 
Quickstart
 
==========
 

	
 
If you're interested in running symposion locally, we have built a [basic
 
To install Symposion, run:
 

	
 
    pip install symposion
 

	
 
Symposion is a Django app. You will need to create a Django project to
 
customize and manage your Symposion installation. We have built a [basic
 
Django startproject template that includes Symposion][1].
 

	
 
[1]: https://github.com/pinax/pinax-project-symposion
requirements/base.txt
Show inline comments
 
new file 100644
 
Django>=1.5,<=1.6
 
django-appconf==0.5
 
django-forms-bootstrap>=2.0.3.post2
 
django-markitup==2.1
 
django-model-utils==2.0.2
 
django-reversion==1.8
 
django-sitetree==1.0.0
 
django-taggit==0.11.2
 
django-timezones==0.2
 
django-user-accounts==1.0b13
 
easy-thumbnails==1.4
 
html5lib==0.95
 
markdown==2.3.1
requirements/docs.txt
Show inline comments
 
file renamed from requirements-docs.txt to requirements/docs.txt
setup.py
Show inline comments
 
#!/usr/bin/env python
 

	
 
import os
 
from setuptools import setup, find_packages
 

	
 
import symposion
 

	
 

	
 
def read_file(filename):
 
    """Read a file into a string."""
 
    path = os.path.abspath(os.path.dirname(__file__))
 
    filepath = os.path.join(path, filename)
 
    try:
 
        return open(filepath).read()
 
    except IOError:
 
        return ''
 

	
 

	
 
setup(
 
    name="symposion",
 
    author="James Tauber",
 
    author_email="jtauber@jtauber.com",
 
    version=symposion.__version__,
 
    description="A collection of Django apps for conference websites.",
 
    url="http://eldarion.com/symposion/",
 
    packages=find_packages(exclude=["symposion_project"]),
 
    packages=find_packages(),
 
    include_package_data=True,
 
    classifiers=(
 
        "Development Status :: 4 - Beta",
 
        "Programming Language :: Python",
 
        "Framework :: Django",
 
        "Intended Audience :: Developers",
 
        "Natural Language :: English",
 
        "License :: OSI Approved :: MIT License",
 
    ),
 
    install_requires=read_file("requirements/base.txt").splitlines(),
 
)
symposion/boxes/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 
from south.utils import datetime_utils as datetime
 
from south.db import db
 
from south.v2 import SchemaMigration
 
from django.db import models
 

	
 

	
 
class Migration(SchemaMigration):
 

	
 
    def forwards(self, orm):
 
        # Adding model 'Box'
 
        db.create_table('boxes_box', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('label', self.gf('django.db.models.fields.CharField')(max_length=100, db_index=True)),
 
            ('content', self.gf('markitup.fields.MarkupField')(no_rendered_field=True, blank=True)),
 
            ('created_by', self.gf('django.db.models.fields.related.ForeignKey')(related_name='boxes', to=orm['auth.User'])),
 
            ('last_updated_by', self.gf('django.db.models.fields.related.ForeignKey')(related_name='updated_boxes', to=orm['auth.User'])),
 
            ('_content_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('boxes', ['Box'])
 

	
 

	
 
    def backwards(self, orm):
 
        # Deleting model 'Box'
 
        db.delete_table('boxes_box')
 

	
 

	
 
    models = {
 
        'auth.group': {
 
            'Meta': {'object_name': 'Group'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
 
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
 
        },
 
        'auth.permission': {
 
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
 
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
 
        },
 
        'auth.user': {
 
            'Meta': {'object_name': 'User'},
 
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
 
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
 
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
 
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
 
        },
 
        'boxes.box': {
 
            'Meta': {'object_name': 'Box'},
 
            '_content_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'content': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True', 'blank': 'True'}),
 
            'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'boxes'", 'to': "orm['auth.User']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'label': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'}),
 
            'last_updated_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'updated_boxes'", 'to': "orm['auth.User']"})
 
        },
 
        'contenttypes.contenttype': {
 
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
 
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        }
 
    }
 

	
 
    complete_apps = ['boxes']
...
 
\ No newline at end of file
symposion/boxes/migrations/__init__.py
Show inline comments
 
new file 100644
symposion/boxes/models.py
Show inline comments
 
from django.db import models
 

	
 
from django.contrib.auth.models import User
 

	
 
import reversion
 

	
 
from markitup.fields import MarkupField
 

	
 

	
 
class Box(models.Model):
 

	
 
    label = models.CharField(max_length=100, db_index=True)
 
    content = MarkupField(blank=True)
 

	
 
    created_by = models.ForeignKey(User, related_name="boxes")
 
    last_updated_by = models.ForeignKey(User, related_name="updated_boxes")
 

	
 
    def __unicode__(self):
 
        return self.label
 

	
 
    class Meta:
 
        verbose_name_plural = "boxes"
 

	
 

	
 
reversion.register(Box)
symposion/boxes/urls.py
Show inline comments
 
from django.conf.urls import url, patterns
 
from django.conf.urls import patterns, url
 

	
 

	
 
urlpatterns = patterns(
 
    "symposion.boxes.views",
 
    url(r"^([-\w]+)/edit/$", "box_edit", name="box_edit"),
 
)
symposion/cms/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 
from south.utils import datetime_utils as datetime
 
from south.db import db
 
from south.v2 import SchemaMigration
 
from django.db import models
 

	
 

	
 
class Migration(SchemaMigration):
 

	
 
    def forwards(self, orm):
 
        # Adding model 'Page'
 
        db.create_table('cms_page', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('path', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)),
 
            ('body', self.gf('markitup.fields.MarkupField')(no_rendered_field=True)),
 
            ('status', self.gf('django.db.models.fields.IntegerField')(default=2)),
 
            ('publish_date', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('updated', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('_body_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('cms', ['Page'])
 

	
 
        # Adding model 'File'
 
        db.create_table('cms_file', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('file', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
 
            ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
        ))
 
        db.send_create_signal('cms', ['File'])
 

	
 

	
 
    def backwards(self, orm):
 
        # Deleting model 'Page'
 
        db.delete_table('cms_page')
 

	
 
        # Deleting model 'File'
 
        db.delete_table('cms_file')
 

	
 

	
 
    models = {
 
        'cms.file': {
 
            'Meta': {'object_name': 'File'},
 
            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
 
        },
 
        'cms.page': {
 
            'Meta': {'object_name': 'Page'},
 
            '_body_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'body': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True'}),
 
            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
 
            'publish_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
 
            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'})
 
        },
 
        'contenttypes.contenttype': {
 
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
 
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'taggit.tag': {
 
            'Meta': {'object_name': 'Tag'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'})
 
        },
 
        'taggit.taggeditem': {
 
            'Meta': {'object_name': 'TaggedItem'},
 
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
 
            'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
 
        }
 
    }
 

	
 
    complete_apps = ['cms']
...
 
\ No newline at end of file
symposion/cms/migrations/__init__.py
Show inline comments
 
new file 100644
symposion/conference/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 
from south.utils import datetime_utils as datetime
 
from south.db import db
 
from south.v2 import SchemaMigration
 
from django.db import models
 

	
 

	
 
class Migration(SchemaMigration):
 

	
 
    def forwards(self, orm):
 
        # Adding model 'Conference'
 
        db.create_table('conference_conference', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('start_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)),
 
            ('end_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)),
 
            ('timezone', self.gf('timezones.fields.TimeZoneField')(default='US/Eastern', max_length=100, blank=True)),
 
        ))
 
        db.send_create_signal('conference', ['Conference'])
 

	
 
        # Adding model 'Section'
 
        db.create_table('conference_section', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('conference', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['conference.Conference'])),
 
            ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('slug', self.gf('django.db.models.fields.SlugField')(max_length=50)),
 
            ('start_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)),
 
            ('end_date', self.gf('django.db.models.fields.DateField')(null=True, blank=True)),
 
        ))
 
        db.send_create_signal('conference', ['Section'])
 

	
 

	
 
    def backwards(self, orm):
 
        # Deleting model 'Conference'
 
        db.delete_table('conference_conference')
 

	
 
        # Deleting model 'Section'
 
        db.delete_table('conference_section')
 

	
 

	
 
    models = {
 
        'conference.conference': {
 
            'Meta': {'object_name': 'Conference'},
 
            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'timezone': ('timezones.fields.TimeZoneField', [], {'default': "'US/Eastern'", 'max_length': '100', 'blank': 'True'}),
 
            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'conference.section': {
 
            'Meta': {'ordering': "['start_date']", 'object_name': 'Section'},
 
            'conference': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['conference.Conference']"}),
 
            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
 
            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'})
 
        }
 
    }
 

	
 
    complete_apps = ['conference']
...
 
\ No newline at end of file
symposion/conference/migrations/__init__.py
Show inline comments
 
new file 100644
symposion/conference/models.py
Show inline comments
 
from django.db import models
 
from django.utils.translation import ugettext_lazy as _
 

	
 
from timezones.fields import TimeZoneField
 

	
 
from south.modelsinspector import add_introspection_rules
 
add_introspection_rules([], [r"^timezones\.fields\.TimeZoneField"])
 

	
 

	
 
CONFERENCE_CACHE = {}
 

	
 

	
 
class Conference(models.Model):
 
    """
 
    the full conference for a specific year, e.g. US PyCon 2012.
 
    """
 

	
 
    title = models.CharField(_("title"), max_length=100)
 

	
 
    # when the conference runs
 
    start_date = models.DateField(_("start date"), null=True, blank=True)
 
    end_date = models.DateField(_("end date"), null=True, blank=True)
 

	
 
    # timezone the conference is in
 
    timezone = TimeZoneField(_("timezone"), blank=True)
 

	
 
    def __unicode__(self):
 
        return self.title
 

	
 
    def save(self, *args, **kwargs):
 
        super(Conference, self).save(*args, **kwargs)
 
        if self.id in CONFERENCE_CACHE:
 
            del CONFERENCE_CACHE[self.id]
 

	
 
    def delete(self):
 
        pk = self.pk
 
        super(Conference, self).delete()
 
        try:
 
            del CONFERENCE_CACHE[pk]
 
        except KeyError:
 
            pass
 

	
 
    class Meta(object):
 
        verbose_name = _("conference")
 
        verbose_name_plural = _("conferences")
 

	
 

	
 
class Section(models.Model):
 
    """
 
    a section of the conference such as "Tutorials", "Workshops",
 
    "Talks", "Expo", "Sprints", that may have its own review and
 
    scheduling process.
 
    """
 

	
 
    conference = models.ForeignKey(Conference, verbose_name=_("conference"))
 

	
symposion/proposals/actions.py
Show inline comments
 
import csv
 

	
 
from django.http import HttpResponse
 

	
 

	
 
def export_as_csv_action(description="Export selected objects as CSV file",
 
                         fields=None, exclude=None, header=True):
 
    """
 
    This function returns an export csv action
 
    'fields' and 'exclude' work like in Django ModelForm
 
    'header' is whether or not to output the column names as the first row
 
    """
 
    def export_as_csv(modeladmin, request, queryset):
 
        """
 
        Generic csv export admin action.
 
        based on http://djangosnippets.org/snippets/1697/
 
        """
 
        opts = modeladmin.model._meta
 
        if fields:
 
            fieldset = set(fields)
 
            field_names = fieldset
 
        elif exclude:
 
            excludeset = set(exclude)
 
            field_names = field_names - excludeset
 
        response = HttpResponse(mimetype="text/csv")
 
        response["Content-Disposition"] = \
 
            "attachment; filename=%s.csv" % unicode(opts).replace(".", "_")
 
        response = HttpResponse(content_type="text/csv")
 
        response["Content-Disposition"] = "attachment; filename=%s.csv" % unicode(opts).replace(".", "_")
 
        writer = csv.writer(response)
 
        if header:
 
            writer.writerow(list(field_names))
 
        for obj in queryset:
 
            writer.writerow(
 
                [unicode(getattr(obj, field)).encode("utf-8", "replace") for field in field_names])
 
        return response
 
    export_as_csv.short_description = description
 
    return export_as_csv
symposion/proposals/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 
import datetime
 
from south.db import db
 
from south.v2 import SchemaMigration
 
from django.db import models
 

	
 

	
 
class Migration(SchemaMigration):
 

	
 
    depends_on = (
 
        ("speakers", "0001_initial"),
 
    )
 

	
 
    def forwards(self, orm):
 
        # Adding model 'ProposalSection'
 
        db.create_table('proposals_proposalsection', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('section', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['conference.Section'], unique=True)),
 
            ('start', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
 
            ('end', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
 
            ('closed', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
 
            ('published', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
 
        ))
 
        db.send_create_signal('proposals', ['ProposalSection'])
 

	
 
        # Adding model 'ProposalKind'
 
        db.create_table('proposals_proposalkind', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('section', self.gf('django.db.models.fields.related.ForeignKey')(related_name='proposal_kinds', to=orm['conference.Section'])),
 
            ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('slug', self.gf('django.db.models.fields.SlugField')(max_length=50)),
 
        ))
 
        db.send_create_signal('proposals', ['ProposalKind'])
 

	
 
        # Adding model 'ProposalBase'
 
        db.create_table('proposals_proposalbase', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('kind', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['proposals.ProposalKind'])),
 
            ('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('description', self.gf('django.db.models.fields.TextField')(max_length=400)),
 
            ('abstract', self.gf('markitup.fields.MarkupField')(no_rendered_field=True)),
 
            ('additional_notes', self.gf('markitup.fields.MarkupField')(no_rendered_field=True, blank=True)),
 
            ('submitted', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('speaker', self.gf('django.db.models.fields.related.ForeignKey')(related_name='proposals', to=orm['speakers.Speaker'])),
 
            ('cancelled', self.gf('django.db.models.fields.BooleanField')(default=False)),
 
            ('_abstract_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
            ('_additional_notes_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('proposals', ['ProposalBase'])
 

	
 
        # Adding model 'AdditionalSpeaker'
 
        db.create_table('proposals_proposalbase_additional_speakers', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('speaker', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['speakers.Speaker'])),
 
            ('proposalbase', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['proposals.ProposalBase'])),
 
            ('status', self.gf('django.db.models.fields.IntegerField')(default=1)),
 
        ))
 
        db.send_create_signal('proposals', ['AdditionalSpeaker'])
 

	
 
        # Adding unique constraint on 'AdditionalSpeaker', fields ['speaker', 'proposalbase']
 
        db.create_unique('proposals_proposalbase_additional_speakers', ['speaker_id', 'proposalbase_id'])
 

	
 
        # Adding model 'SupportingDocument'
 
        db.create_table('proposals_supportingdocument', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('proposal', self.gf('django.db.models.fields.related.ForeignKey')(related_name='supporting_documents', to=orm['proposals.ProposalBase'])),
 
            ('uploaded_by', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
 
            ('created_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('file', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
 
            ('description', self.gf('django.db.models.fields.CharField')(max_length=140)),
 
        ))
 
        db.send_create_signal('proposals', ['SupportingDocument'])
 

	
 

	
 
    def backwards(self, orm):
 
        # Removing unique constraint on 'AdditionalSpeaker', fields ['speaker', 'proposalbase']
 
        db.delete_unique('proposals_proposalbase_additional_speakers', ['speaker_id', 'proposalbase_id'])
 

	
 
        # Deleting model 'ProposalSection'
 
        db.delete_table('proposals_proposalsection')
 

	
 
        # Deleting model 'ProposalKind'
 
        db.delete_table('proposals_proposalkind')
 

	
 
        # Deleting model 'ProposalBase'
 
        db.delete_table('proposals_proposalbase')
 

	
 
        # Deleting model 'AdditionalSpeaker'
 
        db.delete_table('proposals_proposalbase_additional_speakers')
 

	
 
        # Deleting model 'SupportingDocument'
 
        db.delete_table('proposals_supportingdocument')
 

	
 
    models = {
 
        'auth.group': {
 
            'Meta': {'object_name': 'Group'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
 
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
 
        },
 
        'auth.permission': {
 
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
 
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
 
        },
 
        'auth.user': {
 
            'Meta': {'object_name': 'User'},
 
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
 
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
 
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
 
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
 
        },
 
        'conference.conference': {
 
            'Meta': {'object_name': 'Conference'},
 
            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'timezone': ('timezones.fields.TimeZoneField', [], {'default': "'US/Eastern'", 'max_length': '100', 'blank': 'True'}),
 
            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'conference.section': {
 
            'Meta': {'ordering': "['start_date']", 'object_name': 'Section'},
 
            'conference': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['conference.Conference']"}),
 
            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
 
            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'})
 
        },
 
        'contenttypes.contenttype': {
 
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
 
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'proposals.additionalspeaker': {
 
            'Meta': {'unique_together': "(('speaker', 'proposalbase'),)", 'object_name': 'AdditionalSpeaker', 'db_table': "'proposals_proposalbase_additional_speakers'"},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'proposalbase': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['proposals.ProposalBase']"}),
 
            'speaker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['speakers.Speaker']"}),
 
            'status': ('django.db.models.fields.IntegerField', [], {'default': '1'})
 
        },
 
        'proposals.proposalbase': {
 
            'Meta': {'object_name': 'ProposalBase'},
 
            '_abstract_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            '_additional_notes_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'abstract': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True'}),
 
            'additional_notes': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True', 'blank': 'True'}),
 
            'additional_speakers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['speakers.Speaker']", 'symmetrical': 'False', 'through': "orm['proposals.AdditionalSpeaker']", 'blank': 'True'}),
 
            'cancelled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'description': ('django.db.models.fields.TextField', [], {'max_length': '400'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'kind': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['proposals.ProposalKind']"}),
 
            'speaker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'proposals'", 'to': "orm['speakers.Speaker']"}),
 
            'submitted': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'proposals.proposalkind': {
 
            'Meta': {'object_name': 'ProposalKind'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'section': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'proposal_kinds'", 'to': "orm['conference.Section']"}),
 
            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'})
 
        },
 
        'proposals.proposalsection': {
 
            'Meta': {'object_name': 'ProposalSection'},
 
            'closed': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
 
            'end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'published': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
 
            'section': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['conference.Section']", 'unique': 'True'}),
 
            'start': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
 
        },
 
        'proposals.supportingdocument': {
 
            'Meta': {'object_name': 'SupportingDocument'},
 
            'created_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'description': ('django.db.models.fields.CharField', [], {'max_length': '140'}),
 
            'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'proposal': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'supporting_documents'", 'to': "orm['proposals.ProposalBase']"}),
 
            'uploaded_by': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
 
        },
 
        'speakers.speaker': {
 
            'Meta': {'ordering': "['name']", 'object_name': 'Speaker'},
 
            '_biography_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'annotation': ('django.db.models.fields.TextField', [], {}),
 
            'biography': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True', 'blank': 'True'}),
 
            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'invite_email': ('django.db.models.fields.CharField', [], {'max_length': '200', 'unique': 'True', 'null': 'True', 'db_index': 'True'}),
 
            'invite_token': ('django.db.models.fields.CharField', [], {'max_length': '40', 'db_index': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'photo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
 
            'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'speaker_profile'", 'unique': 'True', 'null': 'True', 'to': "orm['auth.User']"})
 
        }
 
    }
 

	
 
    complete_apps = ['proposals']
symposion/proposals/migrations/__init__.py
Show inline comments
 
new file 100644
symposion/proposals/urls.py
Show inline comments
 
from django.conf.urls import patterns, url
 

	
 

	
 
urlpatterns = patterns(
 
    "symposion.proposals.views",
 
    url(r"^submit/$", "proposal_submit", name="proposal_submit"),
 
    url(r"^submit/([\w\-]+)/$", "proposal_submit_kind",
 
        name="proposal_submit_kind"),
 
    url(r"^(\d+)/$", "proposal_detail", name="proposal_detail"),
 
    url(r"^(\d+)/edit/$", "proposal_edit", name="proposal_edit"),
 
    url(r"^(\d+)/speakers/$", "proposal_speaker_manage",
 
        name="proposal_speaker_manage"),
 
    url(r"^(\d+)/cancel/$", "proposal_cancel", name="proposal_cancel"),
 
    url(r"^(\d+)/leave/$", "proposal_leave", name="proposal_leave"),
 
    url(r"^(\d+)/join/$", "proposal_pending_join",
 
        name="proposal_pending_join"),
 
    url(r"^(\d+)/decline/$", "proposal_pending_decline",
 
        name="proposal_pending_decline"),
 
    url(r"^(\d+)/join/$", "proposal_pending_join", name="proposal_pending_join"),
 
    url(r"^(\d+)/decline/$", "proposal_pending_decline", name="proposal_pending_decline"),
 

	
 
    url(r"^(\d+)/document/create/$", "document_create",
 
        name="proposal_document_create"),
 
    url(r"^document/(\d+)/delete/$", "document_delete",
 
        name="proposal_document_delete"),
 
    url(r"^document/(\d+)/([^/]+)$", "document_download",
 
        name="proposal_document_download"),
 
    url(r"^(\d+)/document/create/$", "document_create", name="proposal_document_create"),
 
    url(r"^document/(\d+)/delete/$", "document_delete", name="proposal_document_delete"),
 
    url(r"^document/(\d+)/([^/]+)$", "document_download", name="proposal_document_download"),
 
)
symposion/proposals/views.py
Show inline comments
 
import hashlib
 
import random
 
import sys
 

	
 
from django.conf import settings
 
from django.core.exceptions import ObjectDoesNotExist
 
from django.core.urlresolvers import reverse
 
from django.db.models import Q
 
from django.http import Http404, HttpResponse, HttpResponseForbidden
 
from django.shortcuts import render, redirect, get_object_or_404
 
from django.views import static
 

	
 
from hashlib import sha1
 

	
 
from django.contrib import messages
 
from django.contrib.auth.models import User
 
from django.contrib.auth.decorators import login_required
 

	
 
from account.models import EmailAddress
 
from symposion.proposals.models import (
 
    ProposalBase, ProposalSection, ProposalKind
 
)
 
from symposion.proposals.models import SupportingDocument, AdditionalSpeaker
 
from symposion.speakers.models import Speaker
 
from symposion.utils.mail import send_email
 

	
 
from symposion.proposals.forms import (
 
    AddSpeakerForm, SupportingDocumentCreateForm
 
)
 

	
 

	
 
def get_form(name):
 
    dot = name.rindex(".")
 
    mod_name, form_name = name[:dot], name[dot + 1:]
 
    __import__(mod_name)
 
    return getattr(sys.modules[mod_name], form_name)
 

	
 

	
 
def proposal_submit(request):
 
    if not request.user.is_authenticated():
 
        messages.info(request, "To submit a proposal, please "
 
                      "<a href='{0}'>log in</a> and create a speaker profile "
 
                      "via the dashboard.".format(settings.LOGIN_URL))
 
        return redirect("home")  # @@@ unauth'd speaker info page?
 
    else:
 
        try:
 
            request.user.speaker_profile
 
        except ObjectDoesNotExist:
 
            url = reverse("speaker_create")
 
            messages.info(request, "To submit a proposal, first "
 
                          "<a href='{0}'>create a speaker "
 
                          "profile</a>.".format(url))
 
            return redirect("dashboard")
 

	
 
    kinds = []
 
    for proposal_section in ProposalSection.available():
 
        for kind in proposal_section.section.proposal_kinds.all():
 
            kinds.append(kind)
 

	
 
    return render(request, "proposals/proposal_submit.html", {
 
        "kinds": kinds,
 
    })
...
 
@@ -78,98 +77,98 @@ def proposal_submit_kind(request, kind_slug):
 

	
 
    form_class = get_form(settings.PROPOSAL_FORMS[kind_slug])
 

	
 
    if request.method == "POST":
 
        form = form_class(request.POST)
 
        if form.is_valid():
 
            proposal = form.save(commit=False)
 
            proposal.kind = kind
 
            proposal.speaker = speaker_profile
 
            proposal.save()
 
            form.save_m2m()
 
            messages.success(request, "Proposal submitted.")
 
            if "add-speakers" in request.POST:
 
                return redirect("proposal_speaker_manage", proposal.pk)
 
            return redirect("dashboard")
 
    else:
 
        form = form_class()
 

	
 
    return render(request, "proposals/proposal_submit_kind.html", {
 
        "kind": kind,
 
        "form": form,
 
    })
 

	
 

	
 
@login_required
 
def proposal_speaker_manage(request, pk):
 
    queryset = ProposalBase.objects.select_related("speaker")
 
    proposal = get_object_or_404(queryset, pk=pk)
 
    proposal = ProposalBase.objects.get_subclass(pk=proposal.pk)
 

	
 
    if proposal.speaker != request.user.speaker_profile:
 
        raise Http404()
 

	
 
    if request.method == "POST":
 
        add_speaker_form = AddSpeakerForm(request.POST, proposal=proposal)
 
        if add_speaker_form.is_valid():
 
            message_ctx = {
 
                "proposal": proposal,
 
            }
 

	
 
            def create_speaker_token(email_address):
 
                # create token and look for an existing speaker to prevent
 
                # duplicate tokens and confusing the pending speaker
 
                try:
 
                    pending = Speaker.objects.get(
 
                        Q(user=None, invite_email=email_address)
 
                    )
 
                except Speaker.DoesNotExist:
 
                    salt = sha1(str(random.random())).hexdigest()[:5]
 
                    token = sha1(salt + email_address).hexdigest()
 
                    salt = hashlib.sha1(str(random.random())).hexdigest()[:5]
 
                    token = hashlib.sha1(salt + email_address).hexdigest()
 
                    pending = Speaker.objects.create(
 
                        invite_email=email_address,
 
                        invite_token=token,
 
                    )
 
                else:
 
                    token = pending.invite_token
 
                return pending, token
 
            email_address = add_speaker_form.cleaned_data["email"]
 
            # check if email is on the site now
 
            users = EmailAddress.objects.get_users_for(email_address)
 
            if users:
 
                # should only be one since we enforce unique email
 
                user = users[0]
 
                message_ctx["user"] = user
 
                # look for speaker profile
 
                try:
 
                    speaker = user.speaker_profile
 
                except ObjectDoesNotExist:
 
                    speaker, token = create_speaker_token(email_address)
 
                    message_ctx["token"] = token
 
                    # fire off email to user to create profile
 
                    send_email(
 
                        [email_address], "speaker_no_profile",
 
                        context=message_ctx
 
                    )
 
                else:
 
                    # fire off email to user letting them they are loved.
 
                    send_email(
 
                        [email_address], "speaker_addition",
 
                        context=message_ctx
 
                    )
 
            else:
 
                speaker, token = create_speaker_token(email_address)
 
                message_ctx["token"] = token
 
                # fire off email letting user know about site and to create
 
                # account and speaker profile
 
                send_email(
 
                    [email_address], "speaker_invite",
 
                    context=message_ctx
 
                )
 
            invitation, created = AdditionalSpeaker.objects.get_or_create(
 
                proposalbase=proposal.proposalbase_ptr, speaker=speaker)
 
            messages.success(request, "Speaker invited to proposal.")
 
            return redirect("proposal_speaker_manage", proposal.pk)
 
    else:
 
        add_speaker_form = AddSpeakerForm(proposal=proposal)
 
    ctx = {
 
        "proposal": proposal,
symposion/reviews/fixture_gen.py
Show inline comments
 
deleted file
symposion/reviews/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 
from south.utils import datetime_utils as datetime
 
from south.db import db
 
from south.v2 import SchemaMigration
 
from django.db import models
 

	
 

	
 
class Migration(SchemaMigration):
 

	
 
    def forwards(self, orm):
 
        # Adding model 'ReviewAssignment'
 
        db.create_table('reviews_reviewassignment', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('proposal', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['proposals.ProposalBase'])),
 
            ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
 
            ('origin', self.gf('django.db.models.fields.IntegerField')()),
 
            ('assigned_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('opted_out', self.gf('django.db.models.fields.BooleanField')(default=False)),
 
        ))
 
        db.send_create_signal('reviews', ['ReviewAssignment'])
 

	
 
        # Adding model 'ProposalMessage'
 
        db.create_table('reviews_proposalmessage', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('proposal', self.gf('django.db.models.fields.related.ForeignKey')(related_name='messages', to=orm['proposals.ProposalBase'])),
 
            ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
 
            ('message', self.gf('markitup.fields.MarkupField')(no_rendered_field=True)),
 
            ('submitted_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('_message_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('reviews', ['ProposalMessage'])
 

	
 
        # Adding model 'Review'
 
        db.create_table('reviews_review', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('proposal', self.gf('django.db.models.fields.related.ForeignKey')(related_name='reviews', to=orm['proposals.ProposalBase'])),
 
            ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
 
            ('vote', self.gf('django.db.models.fields.CharField')(max_length=2, blank=True)),
 
            ('comment', self.gf('markitup.fields.MarkupField')(no_rendered_field=True)),
 
            ('submitted_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('_comment_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('reviews', ['Review'])
 

	
 
        # Adding model 'LatestVote'
 
        db.create_table('reviews_latestvote', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('proposal', self.gf('django.db.models.fields.related.ForeignKey')(related_name='votes', to=orm['proposals.ProposalBase'])),
 
            ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
 
            ('vote', self.gf('django.db.models.fields.CharField')(max_length=2)),
 
            ('submitted_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
        ))
 
        db.send_create_signal('reviews', ['LatestVote'])
 

	
 
        # Adding unique constraint on 'LatestVote', fields ['proposal', 'user']
 
        db.create_unique('reviews_latestvote', ['proposal_id', 'user_id'])
 

	
 
        # Adding model 'ProposalResult'
 
        db.create_table('reviews_proposalresult', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('proposal', self.gf('django.db.models.fields.related.OneToOneField')(related_name='result', unique=True, to=orm['proposals.ProposalBase'])),
 
            ('score', self.gf('django.db.models.fields.DecimalField')(default='0.00', max_digits=5, decimal_places=2)),
 
            ('comment_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)),
 
            ('vote_count', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)),
 
            ('plus_one', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)),
 
            ('plus_zero', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)),
 
            ('minus_zero', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)),
 
            ('minus_one', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)),
 
            ('accepted', self.gf('django.db.models.fields.NullBooleanField')(default=None, null=True, blank=True)),
 
            ('status', self.gf('django.db.models.fields.CharField')(default='undecided', max_length=20)),
 
        ))
 
        db.send_create_signal('reviews', ['ProposalResult'])
 

	
 
        # Adding model 'Comment'
 
        db.create_table('reviews_comment', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('proposal', self.gf('django.db.models.fields.related.ForeignKey')(related_name='comments', to=orm['proposals.ProposalBase'])),
 
            ('commenter', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
 
            ('text', self.gf('markitup.fields.MarkupField')(no_rendered_field=True)),
 
            ('public', self.gf('django.db.models.fields.BooleanField')(default=False)),
 
            ('commented_at', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('_text_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('reviews', ['Comment'])
 

	
 
        # Adding model 'NotificationTemplate'
 
        db.create_table('reviews_notificationtemplate', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('label', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('from_address', self.gf('django.db.models.fields.EmailField')(max_length=75)),
 
            ('subject', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('body', self.gf('django.db.models.fields.TextField')()),
 
        ))
 
        db.send_create_signal('reviews', ['NotificationTemplate'])
 

	
 
        # Adding model 'ResultNotification'
 
        db.create_table('reviews_resultnotification', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('proposal', self.gf('django.db.models.fields.related.ForeignKey')(related_name='notifications', to=orm['proposals.ProposalBase'])),
 
            ('template', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['reviews.NotificationTemplate'], null=True, on_delete=models.SET_NULL, blank=True)),
 
            ('timestamp', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('to_address', self.gf('django.db.models.fields.EmailField')(max_length=75)),
 
            ('from_address', self.gf('django.db.models.fields.EmailField')(max_length=75)),
 
            ('subject', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('body', self.gf('django.db.models.fields.TextField')()),
 
        ))
 
        db.send_create_signal('reviews', ['ResultNotification'])
 

	
 

	
 
    def backwards(self, orm):
 
        # Removing unique constraint on 'LatestVote', fields ['proposal', 'user']
 
        db.delete_unique('reviews_latestvote', ['proposal_id', 'user_id'])
 

	
 
        # Deleting model 'ReviewAssignment'
 
        db.delete_table('reviews_reviewassignment')
 

	
 
        # Deleting model 'ProposalMessage'
 
        db.delete_table('reviews_proposalmessage')
 

	
 
        # Deleting model 'Review'
 
        db.delete_table('reviews_review')
 

	
 
        # Deleting model 'LatestVote'
 
        db.delete_table('reviews_latestvote')
 

	
 
        # Deleting model 'ProposalResult'
 
        db.delete_table('reviews_proposalresult')
 

	
 
        # Deleting model 'Comment'
 
        db.delete_table('reviews_comment')
 

	
 
        # Deleting model 'NotificationTemplate'
 
        db.delete_table('reviews_notificationtemplate')
 

	
 
        # Deleting model 'ResultNotification'
 
        db.delete_table('reviews_resultnotification')
 

	
 

	
 
    models = {
 
        'auth.group': {
 
            'Meta': {'object_name': 'Group'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
 
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
 
        },
 
        'auth.permission': {
 
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
 
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
 
        },
 
        'auth.user': {
 
            'Meta': {'object_name': 'User'},
 
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
 
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
 
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
 
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
 
        },
 
        'conference.conference': {
 
            'Meta': {'object_name': 'Conference'},
 
            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'timezone': ('timezones.fields.TimeZoneField', [], {'default': "'US/Eastern'", 'max_length': '100', 'blank': 'True'}),
 
            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'conference.section': {
 
            'Meta': {'ordering': "['start_date']", 'object_name': 'Section'},
 
            'conference': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['conference.Conference']"}),
 
            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
 
            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'})
 
        },
 
        'contenttypes.contenttype': {
 
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
 
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'proposals.additionalspeaker': {
 
            'Meta': {'unique_together': "(('speaker', 'proposalbase'),)", 'object_name': 'AdditionalSpeaker', 'db_table': "'proposals_proposalbase_additional_speakers'"},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'proposalbase': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['proposals.ProposalBase']"}),
 
            'speaker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['speakers.Speaker']"}),
 
            'status': ('django.db.models.fields.IntegerField', [], {'default': '1'})
 
        },
 
        'proposals.proposalbase': {
 
            'Meta': {'object_name': 'ProposalBase'},
 
            '_abstract_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            '_additional_notes_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'abstract': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True'}),
 
            'additional_notes': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True', 'blank': 'True'}),
 
            'additional_speakers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['speakers.Speaker']", 'symmetrical': 'False', 'through': "orm['proposals.AdditionalSpeaker']", 'blank': 'True'}),
 
            'cancelled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'description': ('django.db.models.fields.TextField', [], {'max_length': '400'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'kind': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['proposals.ProposalKind']"}),
 
            'speaker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'proposals'", 'to': "orm['speakers.Speaker']"}),
 
            'submitted': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'proposals.proposalkind': {
 
            'Meta': {'object_name': 'ProposalKind'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'section': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'proposal_kinds'", 'to': "orm['conference.Section']"}),
 
            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'})
 
        },
 
        'reviews.comment': {
 
            'Meta': {'object_name': 'Comment'},
 
            '_text_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'commented_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'commenter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'proposal': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': "orm['proposals.ProposalBase']"}),
 
            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'text': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True'})
 
        },
 
        'reviews.latestvote': {
 
            'Meta': {'unique_together': "[('proposal', 'user')]", 'object_name': 'LatestVote'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'proposal': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'votes'", 'to': "orm['proposals.ProposalBase']"}),
 
            'submitted_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
 
            'vote': ('django.db.models.fields.CharField', [], {'max_length': '2'})
 
        },
 
        'reviews.notificationtemplate': {
 
            'Meta': {'object_name': 'NotificationTemplate'},
 
            'body': ('django.db.models.fields.TextField', [], {}),
 
            'from_address': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'subject': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'reviews.proposalmessage': {
 
            'Meta': {'ordering': "['submitted_at']", 'object_name': 'ProposalMessage'},
 
            '_message_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'message': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True'}),
 
            'proposal': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'messages'", 'to': "orm['proposals.ProposalBase']"}),
 
            'submitted_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
 
        },
 
        'reviews.proposalresult': {
 
            'Meta': {'object_name': 'ProposalResult'},
 
            'accepted': ('django.db.models.fields.NullBooleanField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
 
            'comment_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'minus_one': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
 
            'minus_zero': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
 
            'plus_one': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
 
            'plus_zero': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
 
            'proposal': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'result'", 'unique': 'True', 'to': "orm['proposals.ProposalBase']"}),
 
            'score': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '5', 'decimal_places': '2'}),
 
            'status': ('django.db.models.fields.CharField', [], {'default': "'undecided'", 'max_length': '20'}),
 
            'vote_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'})
 
        },
 
        'reviews.resultnotification': {
 
            'Meta': {'object_name': 'ResultNotification'},
 
            'body': ('django.db.models.fields.TextField', [], {}),
 
            'from_address': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'proposal': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'notifications'", 'to': "orm['proposals.ProposalBase']"}),
 
            'subject': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'template': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['reviews.NotificationTemplate']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
 
            'timestamp': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'to_address': ('django.db.models.fields.EmailField', [], {'max_length': '75'})
 
        },
 
        'reviews.review': {
 
            'Meta': {'object_name': 'Review'},
 
            '_comment_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'comment': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'proposal': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'reviews'", 'to': "orm['proposals.ProposalBase']"}),
 
            'submitted_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
 
            'vote': ('django.db.models.fields.CharField', [], {'max_length': '2', 'blank': 'True'})
 
        },
 
        'reviews.reviewassignment': {
 
            'Meta': {'object_name': 'ReviewAssignment'},
 
            'assigned_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'opted_out': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'origin': ('django.db.models.fields.IntegerField', [], {}),
 
            'proposal': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['proposals.ProposalBase']"}),
 
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
 
        },
 
        'speakers.speaker': {
 
            'Meta': {'ordering': "['name']", 'object_name': 'Speaker'},
 
            '_biography_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'annotation': ('django.db.models.fields.TextField', [], {}),
 
            'biography': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True', 'blank': 'True'}),
 
            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'invite_email': ('django.db.models.fields.CharField', [], {'max_length': '200', 'unique': 'True', 'null': 'True', 'db_index': 'True'}),
 
            'invite_token': ('django.db.models.fields.CharField', [], {'max_length': '40', 'db_index': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'photo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
 
            'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'speaker_profile'", 'unique': 'True', 'null': 'True', 'to': "orm['auth.User']"})
 
        }
 
    }
 

	
 
    complete_apps = ['reviews']
...
 
\ No newline at end of file
symposion/reviews/migrations/__init__.py
Show inline comments
 
new file 100644
symposion/reviews/tests.py
Show inline comments
 
deleted file
symposion/reviews/urls.py
Show inline comments
 
from django.conf.urls import patterns, url
 

	
 

	
 
urlpatterns = patterns(
 
    "symposion.reviews.views",
 
    url(r"^section/(?P<section_slug>[\w\-]+)/all/$", "review_section",
 
        {"reviewed": "all"}, name="review_section"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/reviewed/$", "review_section",
 
        {"reviewed": "reviewed"}, name="user_reviewed"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/not_reviewed/$", "review_section",
 
        {"reviewed": "not_reviewed"}, name="user_not_reviewed"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/assignments/$", "review_section",
 
        {"assigned": True}, name="review_section_assignments"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/status/$", "review_status",
 
        name="review_status"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/status/(?P<key>\w+)/$",
 
        "review_status", name="review_status"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/list/(?P<user_pk>\d+)/$",
 
        "review_list", name="review_list_user"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/admin/$", "review_admin",
 
        name="review_admin"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/admin/accept/$",
 
        "review_bulk_accept", name="review_bulk_accept"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/notification/(?P<status>\w+)/$",
 
        "result_notification", name="result_notification"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/notification/(?P<status>\w+)/prepare/$",
 
        "result_notification_prepare", name="result_notification_prepare"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/notification/(?P<status>\w+)/send/$",
 
        "result_notification_send", name="result_notification_send"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/all/$", "review_section", {"reviewed": "all"}, name="review_section"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/reviewed/$", "review_section", {"reviewed": "reviewed"}, name="user_reviewed"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/not_reviewed/$", "review_section", {"reviewed": "not_reviewed"}, name="user_not_reviewed"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/assignments/$", "review_section", {"assigned": True}, name="review_section_assignments"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/status/$", "review_status", name="review_status"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/status/(?P<key>\w+)/$", "review_status", name="review_status"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/list/(?P<user_pk>\d+)/$", "review_list", name="review_list_user"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/admin/$", "review_admin", name="review_admin"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/admin/accept/$", "review_bulk_accept", name="review_bulk_accept"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/notification/(?P<status>\w+)/$", "result_notification", name="result_notification"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/notification/(?P<status>\w+)/prepare/$", "result_notification_prepare", name="result_notification_prepare"),
 
    url(r"^section/(?P<section_slug>[\w\-]+)/notification/(?P<status>\w+)/send/$", "result_notification_send", name="result_notification_send"),
 

	
 
    url(r"^review/(?P<pk>\d+)/$", "review_detail", name="review_detail"),
 

	
 
    url(r"^(?P<pk>\d+)/delete/$", "review_delete", name="review_delete"),
 
    url(r"^assignments/$", "review_assignments", name="review_assignments"),
 
    url(r"^assignment/(?P<pk>\d+)/opt-out/$", "review_assignment_opt_out",
 
        name="review_assignment_opt_out"),
 
)
symposion/reviews/views.py
Show inline comments
...
 
@@ -24,97 +24,97 @@ def access_not_permitted(request):
 
    return render(request, "reviews/access_not_permitted.html")
 

	
 

	
 
def proposals_generator(request, queryset, user_pk=None, check_speaker=True):
 

	
 
    for obj in queryset:
 
        # @@@ this sucks; we can do better
 
        if check_speaker:
 
            if request.user in [s.user for s in obj.speakers()]:
 
                continue
 

	
 
        try:
 
            obj.result
 
        except ProposalResult.DoesNotExist:
 
            ProposalResult.objects.get_or_create(proposal=obj)
 

	
 
        obj.comment_count = obj.result.comment_count
 
        obj.total_votes = obj.result.vote_count
 
        obj.plus_one = obj.result.plus_one
 
        obj.plus_zero = obj.result.plus_zero
 
        obj.minus_zero = obj.result.minus_zero
 
        obj.minus_one = obj.result.minus_one
 
        lookup_params = dict(proposal=obj)
 

	
 
        if user_pk:
 
            lookup_params["user__pk"] = user_pk
 
        else:
 
            lookup_params["user"] = request.user
 

	
 
        try:
 
            obj.user_vote = LatestVote.objects.get(**lookup_params).vote
 
            obj.user_vote_css = LatestVote.objects.get(**lookup_params).css_class()
 
        except LatestVote.DoesNotExist:
 
            obj.user_vote = None
 
            obj.user_vote_css = "no-vote"
 

	
 
        yield obj
 

	
 

	
 
# Returns a list of all proposals, proposals reviewed by the user, or the proposals the user has
 
# yet to review depending on the link user clicks in dashboard
 
@login_required
 
def review_section(request, section_slug, assigned=False, reviewed="all"):
 

	
 
    if not request.user.has_perm("reviews.can_review_%s" % section_slug):
 
        return access_not_permitted(request)
 

	
 
    section = get_object_or_404(ProposalSection, section__slug=section_slug)
 
    queryset = ProposalBase.objects.filter(kind__section=section)
 
    queryset = ProposalBase.objects.filter(kind__section=section.section)
 

	
 
    if assigned:
 
        assignments = ReviewAssignment.objects.filter(user=request.user)\
 
            .values_list("proposal__id")
 
        queryset = queryset.filter(id__in=assignments)
 

	
 
    # passing reviewed in from reviews.urls and out to review_list for
 
    # appropriate template header rendering
 
    if reviewed == "all":
 
        queryset = queryset.select_related("result").select_subclasses()
 
        reviewed = "all_reviews"
 
    elif reviewed == "reviewed":
 
        queryset = queryset.filter(reviews__user=request.user)
 
        reviewed = "user_reviewed"
 
    else:
 
        queryset = queryset.exclude(reviews__user=request.user).exclude(speaker=request.user)
 
        reviewed = "user_not_reviewed"
 

	
 
    proposals = proposals_generator(request, queryset)
 

	
 
    ctx = {
 
        "proposals": proposals,
 
        "section": section,
 
        "reviewed": reviewed,
 
    }
 

	
 
    return render(request, "reviews/review_list.html", ctx)
 

	
 

	
 
@login_required
 
def review_list(request, section_slug, user_pk):
 

	
 
    # if they're not a reviewer admin and they aren't the person whose
 
    # review list is being asked for, don't let them in
 
    if not request.user.has_perm("reviews.can_manage_%s" % section_slug):
 
        if not request.user.pk == user_pk:
 
            return access_not_permitted(request)
 

	
 
    queryset = ProposalBase.objects.select_related("speaker__user", "result")
 
    reviewed = LatestVote.objects.filter(user__pk=user_pk).values_list("proposal", flat=True)
 
    queryset = queryset.filter(pk__in=reviewed)
 
    proposals = queryset.order_by("submitted")
 

	
 
    admin = request.user.has_perm("reviews.can_manage_%s" % section_slug)
 

	
 
    proposals = proposals_generator(request, proposals, user_pk=user_pk, check_speaker=not admin)
 

	
 
    ctx = {
...
 
@@ -298,165 +298,162 @@ def review_delete(request, pk):
 
    return redirect("review_detail", pk=review.proposal.pk)
 

	
 

	
 
@login_required
 
def review_status(request, section_slug=None, key=None):
 

	
 
    if not request.user.has_perm("reviews.can_review_%s" % section_slug):
 
        return access_not_permitted(request)
 

	
 
    VOTE_THRESHOLD = settings.SYMPOSION_VOTE_THRESHOLD
 

	
 
    ctx = {
 
        "section_slug": section_slug,
 
        "vote_threshold": VOTE_THRESHOLD,
 
    }
 

	
 
    queryset = ProposalBase.objects.select_related("speaker__user", "result").select_subclasses()
 
    if section_slug:
 
        queryset = queryset.filter(kind__section__slug=section_slug)
 

	
 
    proposals = {
 
        # proposals with at least VOTE_THRESHOLD reviews and at least one +1 and no -1s, sorted by
 
        # the 'score'
 
        "positive": queryset.filter(result__vote_count__gte=VOTE_THRESHOLD, result__plus_one__gt=0,
 
                                    result__minus_one=0).order_by("-result__score"),
 
        # proposals with at least VOTE_THRESHOLD reviews and at least one -1 and no +1s, reverse
 
        # sorted by the 'score'
 
        "negative": queryset.filter(result__vote_count__gte=VOTE_THRESHOLD, result__minus_one__gt=0,
 
                                    result__plus_one=0).order_by("result__score"),
 
        # proposals with at least VOTE_THRESHOLD reviews and neither a +1 or a -1, sorted by total
 
        # votes (lowest first)
 
        "indifferent": queryset.filter(result__vote_count__gte=VOTE_THRESHOLD, result__minus_one=0,
 
                                       result__plus_one=0).order_by("result__vote_count"),
 
        # proposals with at least VOTE_THRESHOLD reviews and both a +1 and -1, sorted by total
 
        # votes (highest first)
 
        "controversial": queryset.filter(result__vote_count__gte=VOTE_THRESHOLD,
 
                                         result__plus_one__gt=0, result__minus_one__gt=0)
 
        .order_by("-result__vote_count"),
 
        # proposals with fewer than VOTE_THRESHOLD reviews
 
        "too_few": queryset.filter(result__vote_count__lt=VOTE_THRESHOLD)
 
        .order_by("result__vote_count"),
 
    }
 

	
 
    admin = request.user.has_perm("reviews.can_manage_%s" % section_slug)
 

	
 
    for status in proposals:
 
        if key and key != status:
 
            continue
 
        proposals[status] = list(proposals_generator(request, proposals[status],
 
                                                     check_speaker=not admin))
 
        proposals[status] = list(proposals_generator(request, proposals[status], check_speaker=not admin))
 

	
 
    if key:
 
        ctx.update({
 
            "key": key,
 
            "proposals": proposals[key],
 
        })
 
    else:
 
        ctx["proposals"] = proposals
 

	
 
    return render(request, "reviews/review_stats.html", ctx)
 

	
 

	
 
@login_required
 
def review_assignments(request):
 
    if not request.user.groups.filter(name="reviewers").exists():
 
        return access_not_permitted(request)
 
    assignments = ReviewAssignment.objects.filter(
 
        user=request.user,
 
        opted_out=False
 
    )
 
    return render(request, "reviews/review_assignment.html", {
 
        "assignments": assignments,
 
    })
 

	
 

	
 
@login_required
 
@require_POST
 
def review_assignment_opt_out(request, pk):
 
    review_assignment = get_object_or_404(
 
        ReviewAssignment, pk=pk, user=request.user)
 
    if not review_assignment.opted_out:
 
        review_assignment.opted_out = True
 
        review_assignment.save()
 
        ReviewAssignment.create_assignments(
 
            review_assignment.proposal, origin=ReviewAssignment.AUTO_ASSIGNED_LATER)
 
    return redirect("review_assignments")
 

	
 

	
 
@login_required
 
def review_bulk_accept(request, section_slug):
 
    if not request.user.has_perm("reviews.can_manage_%s" % section_slug):
 
        return access_not_permitted(request)
 
    if request.method == "POST":
 
        form = BulkPresentationForm(request.POST)
 
        if form.is_valid():
 
            talk_ids = form.cleaned_data["talk_ids"].split(",")
 
            talks = ProposalBase.objects.filter(id__in=talk_ids).select_related("result")
 
            for talk in talks:
 
                talk.result.status = "accepted"
 
                talk.result.save()
 
            return redirect("review_section", section_slug=section_slug)
 
    else:
 
        form = BulkPresentationForm()
 

	
 
    return render(request, "reviews/review_bulk_accept.html", {
 
        "form": form,
 
    })
 

	
 

	
 
@login_required
 
def result_notification(request, section_slug, status):
 
    if not request.user.has_perm("reviews.can_manage_%s" % section_slug):
 
        return access_not_permitted(request)
 

	
 
    proposals = ProposalBase.objects.filter(kind__section__slug=section_slug,
 
                                            result__status=status)\
 
        .select_related("speaker__user", "result").select_subclasses()
 
    proposals = ProposalBase.objects.filter(kind__section__slug=section_slug, result__status=status).select_related("speaker__user", "result").select_subclasses()
 
    notification_templates = NotificationTemplate.objects.all()
 

	
 
    ctx = {
 
        "section_slug": section_slug,
 
        "status": status,
 
        "proposals": proposals,
 
        "notification_templates": notification_templates,
 
    }
 
    return render(request, "reviews/result_notification.html", ctx)
 

	
 

	
 
@login_required
 
def result_notification_prepare(request, section_slug, status):
 
    if request.method != "POST":
 
        return HttpResponseNotAllowed(["POST"])
 

	
 
    if not request.user.has_perm("reviews.can_manage_%s" % section_slug):
 
        return access_not_permitted(request)
 

	
 
    proposal_pks = []
 
    try:
 
        for pk in request.POST.getlist("_selected_action"):
 
            proposal_pks.append(int(pk))
 
    except ValueError:
 
        return HttpResponseBadRequest()
 
    proposals = ProposalBase.objects.filter(
 
        kind__section__slug=section_slug,
 
        result__status=status,
 
    )
 
    proposals = proposals.filter(pk__in=proposal_pks)
 
    proposals = proposals.select_related("speaker__user", "result")
 
    proposals = proposals.select_subclasses()
 

	
 
    notification_template_pk = request.POST.get("notification_template", "")
 
    if notification_template_pk:
 
        notification_template = NotificationTemplate.objects.get(pk=notification_template_pk)
 
    else:
 
        notification_template = None
 

	
 
    ctx = {
 
        "section_slug": section_slug,
 
        "status": status,
 
        "notification_template": notification_template,
 
        "proposals": proposals,
 
        "proposal_pks": ",".join([str(pk) for pk in proposal_pks]),
 
    }
 
    return render(request, "reviews/result_notification_prepare.html", ctx)
 

	
symposion/schedule/forms.py
Show inline comments
 
import csv
 
import time
 

	
 
from datetime import datetime
 

	
 
from django import forms
 
from django.contrib import messages
 
from django.db import IntegrityError
 
from django.db import IntegrityError, transaction
 
from django.db.models import Q
 

	
 
from markitup.widgets import MarkItUpWidget
 

	
 
from symposion.schedule.models import (Day, Presentation, Room, SlotKind, Slot, SlotRoom)
 
from symposion.schedule.models import (Day, Presentation, Room, SlotKind, Slot,
 
                                       SlotRoom)
 

	
 

	
 
class SlotEditForm(forms.Form):
 

	
 
    def __init__(self, *args, **kwargs):
 
        self.slot = kwargs.pop("slot")
 
        super(SlotEditForm, self).__init__(*args, **kwargs)
 
        # @@@ TODO - Make this configurable
 
        if self.slot.kind.label in ["talk", "tutorial", "keynote"]:
 
            self.fields["presentation"] = self.build_presentation_field()
 
        else:
 
            self.fields["content_override"] = self.build_content_override_field()
 

	
 
    def build_presentation_field(self):
 
        kwargs = {}
 
        queryset = Presentation.objects.all()
 
        queryset = queryset.exclude(cancelled=True)
 
        queryset = queryset.order_by("proposal_base__pk")
 
        if self.slot.content:
 
            queryset = queryset.filter(Q(slot=None) | Q(pk=self.slot.content.pk))
 
            kwargs["required"] = False
 
            kwargs["initial"] = self.slot.content
 
        else:
 
            queryset = queryset.filter(slot=None)
 
            kwargs["required"] = True
 
        kwargs["queryset"] = queryset
 
        return forms.ModelChoiceField(**kwargs)
 

	
 
    def build_content_override_field(self):
 
        kwargs = {
 
            "label": "Content",
 
            "widget": MarkItUpWidget(),
 
            "required": False,
 
            "initial": self.slot.content_override,
 
        }
 
        return forms.CharField(**kwargs)
 

	
 

	
 
class ScheduleSectionForm(forms.Form):
 
    ROOM_KEY = 'room'
 
    DATE_KEY = 'date'
 
    START_KEY = 'time_start'
 
    END_KEY = 'time_end'
 
    KIND = 'kind'
 

	
 
    filename = forms.FileField(
 
        label='Select a CSV file to import:',
 
        required=False
...
 
@@ -100,62 +102,60 @@ class ScheduleSectionForm(forms.Form):
 
        created_days = []
 
        days = set([x[self.DATE_KEY] for x in data])
 
        for day in days:
 
            try:
 
                date = datetime.strptime(day, "%m/%d/%Y")
 
            except ValueError:
 
                [x.delete() for x in created_days]
 
                return messages.ERROR, u'Malformed data found: %s.' % day
 
            day, created = Day.objects.get_or_create(
 
                schedule=self.schedule, date=date
 
            )
 
            if created:
 
                created_days.append(day)
 
        return created_days
 

	
 
    def build_schedule(self):
 
        created_items = []
 
        reader = csv.DictReader(self.cleaned_data.get('filename'))
 
        data = [dict((k.strip(), v.strip()) for k, v in x.items()) for x in reader]
 
        # build rooms
 
        created_items.extend(self._build_rooms(data))
 
        # build_days
 
        created_items.extend(self._build_days(data))
 
        # build Slot  -> SlotRoom
 
        for row in data:
 
            room = Room.objects.get(
 
                schedule=self.schedule, name=row[self.ROOM_KEY]
 
            )
 
            date = datetime.strptime(row[self.DATE_KEY], "%m/%d/%Y")
 
            day = Day.objects.get(schedule=self.schedule, date=date)
 
            start, end = self._get_start_end_times(row)
 
            slot_kind, created = SlotKind.objects.get_or_create(
 
                label=row[self.KIND], schedule=self.schedule
 
            )
 
            if created:
 
                created_items.append(slot_kind)
 
            if row[self.KIND] == 'plenary':
 
                slot, created = Slot.objects.get_or_create(
 
                    kind=slot_kind, day=day, start=start, end=end
 
                )
 
                if created:
 
                    created_items.append(slot)
 
            else:
 
                slot = Slot.objects.create(
 
                    kind=slot_kind, day=day, start=start, end=end
 
                )
 
                created_items.append(slot)
 
            try:
 
                # @@@ TODO - upgrade Django, use atomic transactions
 
                # with transaction.atomic():
 
                #    SlotRoom.objects.create(slot=slot, room=room)
 
                SlotRoom.objects.create(slot=slot, room=room)
 
                with transaction.atomic():
 
                    SlotRoom.objects.create(slot=slot, room=room)
 
            except IntegrityError:
 
                # delete all created objects and report error
 
                for x in created_items:
 
                    x.delete()
 
                return messages.ERROR, u'An overlap occurred; the import was cancelled.'
 
        return messages.SUCCESS, u'Your schedule has been imported.'
 

	
 
    def delete_schedule(self):
 
        self.schedule.day_set.all().delete()
 
        return messages.SUCCESS, u'Your schedule has been deleted.'
symposion/schedule/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 
from south.utils import datetime_utils as datetime
 
from south.db import db
 
from south.v2 import SchemaMigration
 
from django.db import models
 

	
 

	
 
class Migration(SchemaMigration):
 

	
 
    def forwards(self, orm):
 
        # Adding model 'Schedule'
 
        db.create_table('schedule_schedule', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('section', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['conference.Section'], unique=True)),
 
            ('published', self.gf('django.db.models.fields.BooleanField')(default=True)),
 
            ('hidden', self.gf('django.db.models.fields.BooleanField')(default=False)),
 
        ))
 
        db.send_create_signal('schedule', ['Schedule'])
 

	
 
        # Adding model 'Day'
 
        db.create_table('schedule_day', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('schedule', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['schedule.Schedule'])),
 
            ('date', self.gf('django.db.models.fields.DateField')()),
 
        ))
 
        db.send_create_signal('schedule', ['Day'])
 

	
 
        # Adding unique constraint on 'Day', fields ['schedule', 'date']
 
        db.create_unique('schedule_day', ['schedule_id', 'date'])
 

	
 
        # Adding model 'Room'
 
        db.create_table('schedule_room', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('schedule', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['schedule.Schedule'])),
 
            ('name', self.gf('django.db.models.fields.CharField')(max_length=65)),
 
            ('order', self.gf('django.db.models.fields.PositiveIntegerField')()),
 
        ))
 
        db.send_create_signal('schedule', ['Room'])
 

	
 
        # Adding model 'SlotKind'
 
        db.create_table('schedule_slotkind', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('schedule', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['schedule.Schedule'])),
 
            ('label', self.gf('django.db.models.fields.CharField')(max_length=50)),
 
        ))
 
        db.send_create_signal('schedule', ['SlotKind'])
 

	
 
        # Adding model 'Slot'
 
        db.create_table('schedule_slot', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('day', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['schedule.Day'])),
 
            ('kind', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['schedule.SlotKind'])),
 
            ('start', self.gf('django.db.models.fields.TimeField')()),
 
            ('end', self.gf('django.db.models.fields.TimeField')()),
 
            ('content_override', self.gf('markitup.fields.MarkupField')(no_rendered_field=True, blank=True)),
 
            ('_content_override_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('schedule', ['Slot'])
 

	
 
        # Adding model 'SlotRoom'
 
        db.create_table('schedule_slotroom', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('slot', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['schedule.Slot'])),
 
            ('room', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['schedule.Room'])),
 
        ))
 
        db.send_create_signal('schedule', ['SlotRoom'])
 

	
 
        # Adding unique constraint on 'SlotRoom', fields ['slot', 'room']
 
        db.create_unique('schedule_slotroom', ['slot_id', 'room_id'])
 

	
 
        # Adding model 'Presentation'
 
        db.create_table('schedule_presentation', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('slot', self.gf('django.db.models.fields.related.OneToOneField')(blank=True, related_name='content_ptr', unique=True, null=True, to=orm['schedule.Slot'])),
 
            ('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('description', self.gf('markitup.fields.MarkupField')(no_rendered_field=True)),
 
            ('abstract', self.gf('markitup.fields.MarkupField')(no_rendered_field=True)),
 
            ('speaker', self.gf('django.db.models.fields.related.ForeignKey')(related_name='presentations', to=orm['speakers.Speaker'])),
 
            ('cancelled', self.gf('django.db.models.fields.BooleanField')(default=False)),
 
            ('proposal_base', self.gf('django.db.models.fields.related.OneToOneField')(related_name='presentation', unique=True, to=orm['proposals.ProposalBase'])),
 
            ('section', self.gf('django.db.models.fields.related.ForeignKey')(related_name='presentations', to=orm['conference.Section'])),
 
            ('_description_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
            ('_abstract_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('schedule', ['Presentation'])
 

	
 
        # Adding M2M table for field additional_speakers on 'Presentation'
 
        m2m_table_name = db.shorten_name('schedule_presentation_additional_speakers')
 
        db.create_table(m2m_table_name, (
 
            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
 
            ('presentation', models.ForeignKey(orm['schedule.presentation'], null=False)),
 
            ('speaker', models.ForeignKey(orm['speakers.speaker'], null=False))
 
        ))
 
        db.create_unique(m2m_table_name, ['presentation_id', 'speaker_id'])
 

	
 

	
 
    def backwards(self, orm):
 
        # Removing unique constraint on 'SlotRoom', fields ['slot', 'room']
 
        db.delete_unique('schedule_slotroom', ['slot_id', 'room_id'])
 

	
 
        # Removing unique constraint on 'Day', fields ['schedule', 'date']
 
        db.delete_unique('schedule_day', ['schedule_id', 'date'])
 

	
 
        # Deleting model 'Schedule'
 
        db.delete_table('schedule_schedule')
 

	
 
        # Deleting model 'Day'
 
        db.delete_table('schedule_day')
 

	
 
        # Deleting model 'Room'
 
        db.delete_table('schedule_room')
 

	
 
        # Deleting model 'SlotKind'
 
        db.delete_table('schedule_slotkind')
 

	
 
        # Deleting model 'Slot'
 
        db.delete_table('schedule_slot')
 

	
 
        # Deleting model 'SlotRoom'
 
        db.delete_table('schedule_slotroom')
 

	
 
        # Deleting model 'Presentation'
 
        db.delete_table('schedule_presentation')
 

	
 
        # Removing M2M table for field additional_speakers on 'Presentation'
 
        db.delete_table(db.shorten_name('schedule_presentation_additional_speakers'))
 

	
 

	
 
    models = {
 
        'auth.group': {
 
            'Meta': {'object_name': 'Group'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
 
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
 
        },
 
        'auth.permission': {
 
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
 
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
 
        },
 
        'auth.user': {
 
            'Meta': {'object_name': 'User'},
 
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
 
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
 
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
 
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
 
        },
 
        'conference.conference': {
 
            'Meta': {'object_name': 'Conference'},
 
            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'timezone': ('timezones.fields.TimeZoneField', [], {'default': "'US/Eastern'", 'max_length': '100', 'blank': 'True'}),
 
            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'conference.section': {
 
            'Meta': {'ordering': "['start_date']", 'object_name': 'Section'},
 
            'conference': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['conference.Conference']"}),
 
            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
 
            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'})
 
        },
 
        'contenttypes.contenttype': {
 
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
 
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'proposals.additionalspeaker': {
 
            'Meta': {'unique_together': "(('speaker', 'proposalbase'),)", 'object_name': 'AdditionalSpeaker', 'db_table': "'proposals_proposalbase_additional_speakers'"},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'proposalbase': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['proposals.ProposalBase']"}),
 
            'speaker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['speakers.Speaker']"}),
 
            'status': ('django.db.models.fields.IntegerField', [], {'default': '1'})
 
        },
 
        'proposals.proposalbase': {
 
            'Meta': {'object_name': 'ProposalBase'},
 
            '_abstract_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            '_additional_notes_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'abstract': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True'}),
 
            'additional_notes': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True', 'blank': 'True'}),
 
            'additional_speakers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['speakers.Speaker']", 'symmetrical': 'False', 'through': "orm['proposals.AdditionalSpeaker']", 'blank': 'True'}),
 
            'cancelled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'description': ('django.db.models.fields.TextField', [], {'max_length': '400'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'kind': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['proposals.ProposalKind']"}),
 
            'speaker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'proposals'", 'to': "orm['speakers.Speaker']"}),
 
            'submitted': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'proposals.proposalkind': {
 
            'Meta': {'object_name': 'ProposalKind'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'section': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'proposal_kinds'", 'to': "orm['conference.Section']"}),
 
            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'})
 
        },
 
        'schedule.day': {
 
            'Meta': {'ordering': "['date']", 'unique_together': "[('schedule', 'date')]", 'object_name': 'Day'},
 
            'date': ('django.db.models.fields.DateField', [], {}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'schedule': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Schedule']"})
 
        },
 
        'schedule.presentation': {
 
            'Meta': {'ordering': "['slot']", 'object_name': 'Presentation'},
 
            '_abstract_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            '_description_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'abstract': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True'}),
 
            'additional_speakers': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'copresentations'", 'blank': 'True', 'to': "orm['speakers.Speaker']"}),
 
            'cancelled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'description': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'proposal_base': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'presentation'", 'unique': 'True', 'to': "orm['proposals.ProposalBase']"}),
 
            'section': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'presentations'", 'to': "orm['conference.Section']"}),
 
            'slot': ('django.db.models.fields.related.OneToOneField', [], {'blank': 'True', 'related_name': "'content_ptr'", 'unique': 'True', 'null': 'True', 'to': "orm['schedule.Slot']"}),
 
            'speaker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'presentations'", 'to': "orm['speakers.Speaker']"}),
 
            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'schedule.room': {
 
            'Meta': {'object_name': 'Room'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '65'}),
 
            'order': ('django.db.models.fields.PositiveIntegerField', [], {}),
 
            'schedule': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Schedule']"})
 
        },
 
        'schedule.schedule': {
 
            'Meta': {'ordering': "['section']", 'object_name': 'Schedule'},
 
            'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'published': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
 
            'section': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['conference.Section']", 'unique': 'True'})
 
        },
 
        'schedule.slot': {
 
            'Meta': {'ordering': "['day', 'start', 'end']", 'object_name': 'Slot'},
 
            '_content_override_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'content_override': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True', 'blank': 'True'}),
 
            'day': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Day']"}),
 
            'end': ('django.db.models.fields.TimeField', [], {}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'kind': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.SlotKind']"}),
 
            'start': ('django.db.models.fields.TimeField', [], {})
 
        },
 
        'schedule.slotkind': {
 
            'Meta': {'object_name': 'SlotKind'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'label': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
 
            'schedule': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Schedule']"})
 
        },
 
        'schedule.slotroom': {
 
            'Meta': {'ordering': "['slot', 'room__order']", 'unique_together': "[('slot', 'room')]", 'object_name': 'SlotRoom'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'room': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Room']"}),
 
            'slot': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Slot']"})
 
        },
 
        'speakers.speaker': {
 
            'Meta': {'ordering': "['name']", 'object_name': 'Speaker'},
 
            '_biography_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'annotation': ('django.db.models.fields.TextField', [], {}),
 
            'biography': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True', 'blank': 'True'}),
 
            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'invite_email': ('django.db.models.fields.CharField', [], {'max_length': '200', 'unique': 'True', 'null': 'True', 'db_index': 'True'}),
 
            'invite_token': ('django.db.models.fields.CharField', [], {'max_length': '40', 'db_index': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'photo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
 
            'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'speaker_profile'", 'unique': 'True', 'null': 'True', 'to': "orm['auth.User']"})
 
        }
 
    }
 

	
 
    complete_apps = ['schedule']
...
 
\ No newline at end of file
symposion/schedule/migrations/__init__.py
Show inline comments
 
new file 100644
symposion/schedule/models.py
Show inline comments
...
 
@@ -34,100 +34,100 @@ class Day(models.Model):
 
        unique_together = [("schedule", "date")]
 
        ordering = ["date"]
 

	
 

	
 
class Room(models.Model):
 

	
 
    schedule = models.ForeignKey(Schedule)
 
    name = models.CharField(max_length=65)
 
    order = models.PositiveIntegerField()
 

	
 
    def __unicode__(self):
 
        return self.name
 

	
 

	
 
class SlotKind(models.Model):
 
    """
 
    A slot kind represents what kind a slot is. For example, a slot can be a
 
    break, lunch, or X-minute talk.
 
    """
 

	
 
    schedule = models.ForeignKey(Schedule)
 
    label = models.CharField(max_length=50)
 

	
 
    def __unicode__(self):
 
        return self.label
 

	
 

	
 
class Slot(models.Model):
 

	
 
    day = models.ForeignKey(Day)
 
    kind = models.ForeignKey(SlotKind)
 
    start = models.TimeField()
 
    end = models.TimeField()
 
    content_override = MarkupField(blank=True)
 

	
 
    def assign(self, content):
 
        """
 
        Assign the given content to this slot and if a previous slot content
 
        was given we need to unlink it to avoid integrity errors.
 
        """
 
        self.unassign()
 
        content.slot = self
 
        content.save()
 

	
 
    def unassign(self):
 
        """
 
        Unassign the associated content with this slot.
 
        """
 
        if self.content and self.content.slot_id:
 
            presentation = self.content
 
            presentation.slot = None
 
            presentation.save()
 
        content = self.content
 
        if content and content.slot_id:
 
            content.slot = None
 
            content.save()
 

	
 
    @property
 
    def content(self):
 
        """
 
        Return the content this slot represents.
 
        @@@ hard-coded for presentation for now
 
        """
 
        try:
 
            return self.content_ptr
 
        except ObjectDoesNotExist:
 
            return None
 

	
 
    @property
 
    def start_datetime(self):
 
        return datetime.datetime(
 
            self.day.date.year,
 
            self.day.date.month,
 
            self.day.date.day,
 
            self.start.hour,
 
            self.start.minute)
 

	
 
    @property
 
    def end_datetime(self):
 
        return datetime.datetime(
 
            self.day.date.year,
 
            self.day.date.month,
 
            self.day.date.day,
 
            self.end.hour,
 
            self.end.minute)
 

	
 
    @property
 
    def length_in_minutes(self):
 
        return int(
 
            (self.end_datetime - self.start_datetime).total_seconds() / 60)
 

	
 
    @property
 
    def rooms(self):
 
        return Room.objects.filter(pk__in=self.slotroom_set.values("room"))
 

	
 
    def __unicode__(self):
 
        return "%s %s (%s - %s)" % (self.day, self.kind, self.start, self.end)
 

	
 
    class Meta:
 
        ordering = ["day", "start", "end"]
 

	
 

	
 
class SlotRoom(models.Model):
 
    """
symposion/schedule/views.py
Show inline comments
 
import json
 

	
 
from django.core.urlresolvers import reverse
 
from django.http import Http404, HttpResponse
 
from django.shortcuts import render, get_object_or_404, redirect
 
from django.template import loader, Context
 

	
 
from django.contrib.auth.decorators import login_required
 
from django.contrib import messages
 
from django.contrib.sites.models import Site
 

	
 
from symposion.schedule.forms import SlotEditForm
 
from symposion.schedule.forms import SlotEditForm, ScheduleSectionForm
 
from symposion.schedule.models import Schedule, Day, Slot, Presentation
 
from symposion.schedule.timetable import TimeTable
 

	
 

	
 
def fetch_schedule(slug):
 
    qs = Schedule.objects.all()
 

	
 
    if slug is None:
 
        if qs.count() > 1:
 
            raise Http404()
 
        schedule = next(iter(qs), None)
 
        if schedule is None:
 
            raise Http404()
 
    else:
 
        schedule = get_object_or_404(qs, section__slug=slug)
 

	
 
    return schedule
 

	
 

	
 
def schedule_conference(request):
 

	
 
    schedules = Schedule.objects.filter(published=True, hidden=False)
 

	
 
    sections = []
 
    for schedule in schedules:
 
        days_qs = Day.objects.filter(schedule=schedule)
 
        days = [TimeTable(day) for day in days_qs]
 
        sections.append({
 
            "schedule": schedule,
 
            "days": days,
 
        })
 

	
 
    ctx = {
 
        "sections": sections,
 
    }
 
    return render(request, "schedule/schedule_conference.html", ctx)
 

	
 

	
 
def schedule_detail(request, slug=None):
 

	
 
    schedule = fetch_schedule(slug)
 
    if not schedule.published and not request.user.is_staff:
 
        raise Http404()
 

	
 
    days_qs = Day.objects.filter(schedule=schedule)
 
    days = [TimeTable(day) for day in days_qs]
 

	
 
    ctx = {
 
        "schedule": schedule,
 
        "days": days,
 
    }
 
    return render(request, "schedule/schedule_detail.html", ctx)
 

	
 

	
 
def schedule_list(request, slug=None):
 
    schedule = fetch_schedule(slug)
 

	
 
    presentations = Presentation.objects.filter(section=schedule.section)
 
    presentations = presentations.exclude(cancelled=True)
 

	
 
    ctx = {
 
        "schedule": schedule,
 
        "presentations": presentations,
 
    }
 
    return render(request, "schedule/schedule_list.html", ctx)
 

	
 

	
 
def schedule_list_csv(request, slug=None):
 
    schedule = fetch_schedule(slug)
 

	
 
    presentations = Presentation.objects.filter(section=schedule.section)
 
    presentations = presentations.exclude(cancelled=True).order_by("id")
 
    response = HttpResponse(content_type="text/csv")
 

	
 
    response = HttpResponse(mimetype="text/csv")
 
    if slug:
 
        file_slug = slug
 
    else:
 
        file_slug = "presentations"
 
    response["Content-Disposition"] = 'attachment; filename="%s.csv"' % file_slug
 

	
 
    response.write(loader.get_template("schedule/schedule_list.csv").render(Context({
 
        "presentations": presentations,
 

	
 
    })))
 
    return response
 

	
 

	
 
@login_required
 
def schedule_edit(request, slug=None):
 

	
 
    if not request.user.is_staff:
 
        raise Http404()
 

	
 
    schedule = fetch_schedule(slug)
 

	
 
    if request.method == "POST":
 
        form = ScheduleSectionForm(
 
            request.POST, request.FILES, schedule=schedule
 
        )
 
        if form.is_valid():
 
            if 'submit' in form.data:
 
                msg = form.build_schedule()
 
            elif 'delete' in form.data:
 
                msg = form.delete_schedule()
 
            messages.add_message(request, msg[0], msg[1])
 
    else:
 
        form = ScheduleSectionForm(schedule=schedule)
 
    days_qs = Day.objects.filter(schedule=schedule)
 
    days = [TimeTable(day) for day in days_qs]
 
    ctx = {
 
        "schedule": schedule,
 
        "days": days,
 
        "form": form
 
    }
 
    return render(request, "schedule/schedule_edit.html", ctx)
 

	
 

	
 
@login_required
 
def schedule_slot_edit(request, slug, slot_pk):
 

	
 
    if not request.user.is_staff:
 
        raise Http404()
 

	
 
    slot = get_object_or_404(Slot, day__schedule__section__slug=slug, pk=slot_pk)
 

	
 
    if request.method == "POST":
 
        form = SlotEditForm(request.POST, slot=slot)
 
        if form.is_valid():
 
            save = False
 
            if "content_override" in form.cleaned_data:
 
                slot.content_override = form.cleaned_data["content_override"]
 
                save = True
 
            if "presentation" in form.cleaned_data:
 
                presentation = form.cleaned_data["presentation"]
 
                if presentation is None:
 
                    slot.unassign()
 
                else:
 
                    slot.assign(presentation)
 
            if save:
 
                slot.save()
 
        return redirect("schedule_edit", slug)
 
    else:
 
        form = SlotEditForm(slot=slot)
 
        ctx = {
 
            "slug": slug,
 
            "form": form,
 
            "slot": slot,
 
        }
 
        return render(request, "schedule/_slot_edit.html", ctx)
 

	
 

	
 
def schedule_presentation_detail(request, pk):
 

	
 
    presentation = get_object_or_404(Presentation, pk=pk)
 
    if presentation.slot:
 
        schedule = presentation.slot.day.schedule
 
    else:
 
        schedule = None
 

	
 
    ctx = {
 
        "presentation": presentation,
symposion/speakers/fixture_gen.py
Show inline comments
 
deleted file
symposion/speakers/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 
from south.utils import datetime_utils as datetime
 
from south.db import db
 
from south.v2 import SchemaMigration
 
from django.db import models
 

	
 

	
 
class Migration(SchemaMigration):
 

	
 
    def forwards(self, orm):
 
        # Adding model 'Speaker'
 
        db.create_table('speakers_speaker', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('user', self.gf('django.db.models.fields.related.OneToOneField')(related_name='speaker_profile', unique=True, null=True, to=orm['auth.User'])),
 
            ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('biography', self.gf('markitup.fields.MarkupField')(no_rendered_field=True, blank=True)),
 
            ('photo', self.gf('django.db.models.fields.files.ImageField')(max_length=100, blank=True)),
 
            ('annotation', self.gf('django.db.models.fields.TextField')()),
 
            ('invite_email', self.gf('django.db.models.fields.CharField')(max_length=200, unique=True, null=True, db_index=True)),
 
            ('invite_token', self.gf('django.db.models.fields.CharField')(max_length=40, db_index=True)),
 
            ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('_biography_rendered', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('speakers', ['Speaker'])
 

	
 

	
 
    def backwards(self, orm):
 
        # Deleting model 'Speaker'
 
        db.delete_table('speakers_speaker')
 

	
 

	
 
    models = {
 
        'auth.group': {
 
            'Meta': {'object_name': 'Group'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
 
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
 
        },
 
        'auth.permission': {
 
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
 
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
 
        },
 
        'auth.user': {
 
            'Meta': {'object_name': 'User'},
 
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
 
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
 
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
 
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
 
        },
 
        'contenttypes.contenttype': {
 
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
 
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'speakers.speaker': {
 
            'Meta': {'ordering': "['name']", 'object_name': 'Speaker'},
 
            '_biography_rendered': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'annotation': ('django.db.models.fields.TextField', [], {}),
 
            'biography': ('markitup.fields.MarkupField', [], {'no_rendered_field': 'True', 'blank': 'True'}),
 
            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'invite_email': ('django.db.models.fields.CharField', [], {'max_length': '200', 'unique': 'True', 'null': 'True', 'db_index': 'True'}),
 
            'invite_token': ('django.db.models.fields.CharField', [], {'max_length': '40', 'db_index': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'photo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
 
            'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'speaker_profile'", 'unique': 'True', 'null': 'True', 'to': "orm['auth.User']"})
 
        }
 
    }
 

	
 
    complete_apps = ['speakers']
...
 
\ No newline at end of file
symposion/speakers/migrations/__init__.py
Show inline comments
 
new file 100644
symposion/sponsorship/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 
from south.utils import datetime_utils as datetime
 
from south.db import db
 
from south.v2 import SchemaMigration
 
from django.db import models
 

	
 

	
 
class Migration(SchemaMigration):
 

	
 
    depends_on = (
 
        ("conference", "0001_initial"),
 
    )
 

	
 
    def forwards(self, orm):
 
        # Adding model 'SponsorLevel'
 
        db.create_table('sponsorship_sponsorlevel', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('conference', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['conference.Conference'])),
 
            ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('order', self.gf('django.db.models.fields.IntegerField')(default=0)),
 
            ('cost', self.gf('django.db.models.fields.PositiveIntegerField')()),
 
            ('description', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('sponsorship', ['SponsorLevel'])
 

	
 
        # Adding model 'Sponsor'
 
        db.create_table('sponsorship_sponsor', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('applicant', self.gf('django.db.models.fields.related.ForeignKey')(related_name='sponsorships', null=True, to=orm['auth.User'])),
 
            ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('external_url', self.gf('django.db.models.fields.URLField')(max_length=200)),
 
            ('annotation', self.gf('django.db.models.fields.TextField')(blank=True)),
 
            ('contact_name', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('contact_email', self.gf('django.db.models.fields.EmailField')(max_length=75)),
 
            ('level', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['sponsorship.SponsorLevel'])),
 
            ('added', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
            ('active', self.gf('django.db.models.fields.BooleanField')(default=False)),
 
            ('sponsor_logo', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='+', null=True, to=orm['sponsorship.SponsorBenefit'])),
 
        ))
 
        db.send_create_signal('sponsorship', ['Sponsor'])
 

	
 
        # Adding model 'Benefit'
 
        db.create_table('sponsorship_benefit', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('description', self.gf('django.db.models.fields.TextField')(blank=True)),
 
            ('type', self.gf('django.db.models.fields.CharField')(default='simple', max_length=10)),
 
        ))
 
        db.send_create_signal('sponsorship', ['Benefit'])
 

	
 
        # Adding model 'BenefitLevel'
 
        db.create_table('sponsorship_benefitlevel', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('benefit', self.gf('django.db.models.fields.related.ForeignKey')(related_name='benefit_levels', to=orm['sponsorship.Benefit'])),
 
            ('level', self.gf('django.db.models.fields.related.ForeignKey')(related_name='benefit_levels', to=orm['sponsorship.SponsorLevel'])),
 
            ('max_words', self.gf('django.db.models.fields.PositiveIntegerField')(null=True, blank=True)),
 
            ('other_limits', self.gf('django.db.models.fields.CharField')(max_length=200, blank=True)),
 
        ))
 
        db.send_create_signal('sponsorship', ['BenefitLevel'])
 

	
 
        # Adding model 'SponsorBenefit'
 
        db.create_table('sponsorship_sponsorbenefit', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('sponsor', self.gf('django.db.models.fields.related.ForeignKey')(related_name='sponsor_benefits', to=orm['sponsorship.Sponsor'])),
 
            ('benefit', self.gf('django.db.models.fields.related.ForeignKey')(related_name='sponsor_benefits', to=orm['sponsorship.Benefit'])),
 
            ('active', self.gf('django.db.models.fields.BooleanField')(default=True)),
 
            ('max_words', self.gf('django.db.models.fields.PositiveIntegerField')(null=True, blank=True)),
 
            ('other_limits', self.gf('django.db.models.fields.CharField')(max_length=200, blank=True)),
 
            ('text', self.gf('django.db.models.fields.TextField')(blank=True)),
 
            ('upload', self.gf('django.db.models.fields.files.FileField')(max_length=100, blank=True)),
 
        ))
 
        db.send_create_signal('sponsorship', ['SponsorBenefit'])
 

	
 

	
 
    def backwards(self, orm):
 
        # Deleting model 'SponsorLevel'
 
        db.delete_table('sponsorship_sponsorlevel')
 

	
 
        # Deleting model 'Sponsor'
 
        db.delete_table('sponsorship_sponsor')
 

	
 
        # Deleting model 'Benefit'
 
        db.delete_table('sponsorship_benefit')
 

	
 
        # Deleting model 'BenefitLevel'
 
        db.delete_table('sponsorship_benefitlevel')
 

	
 
        # Deleting model 'SponsorBenefit'
 
        db.delete_table('sponsorship_sponsorbenefit')
 

	
 

	
 
    models = {
 
        'auth.group': {
 
            'Meta': {'object_name': 'Group'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
 
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
 
        },
 
        'auth.permission': {
 
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
 
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
 
        },
 
        'auth.user': {
 
            'Meta': {'object_name': 'User'},
 
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
 
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
 
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
 
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
 
        },
 
        'conference.conference': {
 
            'Meta': {'object_name': 'Conference'},
 
            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
 
            'timezone': ('timezones.fields.TimeZoneField', [], {'default': "'US/Eastern'", 'max_length': '100', 'blank': 'True'}),
 
            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'contenttypes.contenttype': {
 
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
 
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'sponsorship.benefit': {
 
            'Meta': {'object_name': 'Benefit'},
 
            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'type': ('django.db.models.fields.CharField', [], {'default': "'simple'", 'max_length': '10'})
 
        },
 
        'sponsorship.benefitlevel': {
 
            'Meta': {'ordering': "['level']", 'object_name': 'BenefitLevel'},
 
            'benefit': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'benefit_levels'", 'to': "orm['sponsorship.Benefit']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'level': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'benefit_levels'", 'to': "orm['sponsorship.SponsorLevel']"}),
 
            'max_words': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
 
            'other_limits': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'})
 
        },
 
        'sponsorship.sponsor': {
 
            'Meta': {'object_name': 'Sponsor'},
 
            'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'annotation': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'applicant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sponsorships'", 'null': 'True', 'to': "orm['auth.User']"}),
 
            'contact_email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
 
            'contact_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'external_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'level': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sponsorship.SponsorLevel']"}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'sponsor_logo': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['sponsorship.SponsorBenefit']"})
 
        },
 
        'sponsorship.sponsorbenefit': {
 
            'Meta': {'ordering': "['-active']", 'object_name': 'SponsorBenefit'},
 
            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
 
            'benefit': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sponsor_benefits'", 'to': "orm['sponsorship.Benefit']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'max_words': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
 
            'other_limits': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
 
            'sponsor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sponsor_benefits'", 'to': "orm['sponsorship.Sponsor']"}),
 
            'text': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'upload': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'})
 
        },
 
        'sponsorship.sponsorlevel': {
 
            'Meta': {'ordering': "['conference', 'order']", 'object_name': 'SponsorLevel'},
 
            'conference': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['conference.Conference']"}),
 
            'cost': ('django.db.models.fields.PositiveIntegerField', [], {}),
 
            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'order': ('django.db.models.fields.IntegerField', [], {'default': '0'})
 
        }
 
    }
 

	
 
    complete_apps = ['sponsorship']
symposion/sponsorship/migrations/__init__.py
Show inline comments
 
new file 100644
symposion/teams/migrations/0001_initial.py
Show inline comments
 
new file 100644
 
# -*- coding: utf-8 -*-
 
from south.utils import datetime_utils as datetime
 
from south.db import db
 
from south.v2 import SchemaMigration
 
from django.db import models
 

	
 

	
 
class Migration(SchemaMigration):
 

	
 
    def forwards(self, orm):
 
        # Adding model 'Team'
 
        db.create_table('teams_team', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50)),
 
            ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
 
            ('description', self.gf('django.db.models.fields.TextField')(blank=True)),
 
            ('access', self.gf('django.db.models.fields.CharField')(max_length=20)),
 
            ('created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
 
        ))
 
        db.send_create_signal('teams', ['Team'])
 

	
 
        # Adding M2M table for field permissions on 'Team'
 
        m2m_table_name = db.shorten_name('teams_team_permissions')
 
        db.create_table(m2m_table_name, (
 
            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
 
            ('team', models.ForeignKey(orm['teams.team'], null=False)),
 
            ('permission', models.ForeignKey(orm['auth.permission'], null=False))
 
        ))
 
        db.create_unique(m2m_table_name, ['team_id', 'permission_id'])
 

	
 
        # Adding M2M table for field manager_permissions on 'Team'
 
        m2m_table_name = db.shorten_name('teams_team_manager_permissions')
 
        db.create_table(m2m_table_name, (
 
            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
 
            ('team', models.ForeignKey(orm['teams.team'], null=False)),
 
            ('permission', models.ForeignKey(orm['auth.permission'], null=False))
 
        ))
 
        db.create_unique(m2m_table_name, ['team_id', 'permission_id'])
 

	
 
        # Adding model 'Membership'
 
        db.create_table('teams_membership', (
 
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
 
            ('user', self.gf('django.db.models.fields.related.ForeignKey')(related_name='memberships', to=orm['auth.User'])),
 
            ('team', self.gf('django.db.models.fields.related.ForeignKey')(related_name='memberships', to=orm['teams.Team'])),
 
            ('state', self.gf('django.db.models.fields.CharField')(max_length=20)),
 
            ('message', self.gf('django.db.models.fields.TextField')(blank=True)),
 
        ))
 
        db.send_create_signal('teams', ['Membership'])
 

	
 

	
 
    def backwards(self, orm):
 
        # Deleting model 'Team'
 
        db.delete_table('teams_team')
 

	
 
        # Removing M2M table for field permissions on 'Team'
 
        db.delete_table(db.shorten_name('teams_team_permissions'))
 

	
 
        # Removing M2M table for field manager_permissions on 'Team'
 
        db.delete_table(db.shorten_name('teams_team_manager_permissions'))
 

	
 
        # Deleting model 'Membership'
 
        db.delete_table('teams_membership')
 

	
 

	
 
    models = {
 
        'auth.group': {
 
            'Meta': {'object_name': 'Group'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
 
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
 
        },
 
        'auth.permission': {
 
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
 
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
 
        },
 
        'auth.user': {
 
            'Meta': {'object_name': 'User'},
 
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
 
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
 
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
 
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
 
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
 
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
 
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
 
        },
 
        'contenttypes.contenttype': {
 
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
 
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
 
        },
 
        'teams.membership': {
 
            'Meta': {'object_name': 'Membership'},
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'message': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'state': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
 
            'team': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'memberships'", 'to': "orm['teams.Team']"}),
 
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'memberships'", 'to': "orm['auth.User']"})
 
        },
 
        'teams.team': {
 
            'Meta': {'object_name': 'Team'},
 
            'access': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
 
            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
 
            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
 
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
 
            'manager_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'manager_teams'", 'blank': 'True', 'to': "orm['auth.Permission']"}),
 
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
 
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'member_teams'", 'blank': 'True', 'to': "orm['auth.Permission']"}),
 
            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'})
 
        }
 
    }
 

	
 
    complete_apps = ['teams']
...
 
\ No newline at end of file
symposion/teams/migrations/__init__.py
Show inline comments
 
new file 100644
symposion/templates/cms/page_detail.html
Show inline comments
 
{% extends "site_base.html" %}
 

	
 
{% load url from future %}
 

	
 

	
 
{% load sitetree %}
 
{% load i18n %}
 

	
 
{% block body_class %}cms-page{% endblock %}
 

	
 
{% block head_title %}{{ page.title }}{% endblock %}
 

	
 
{% block breadcrumbs %}{% sitetree_breadcrumbs from "main" %}{% endblock %}
 

	
 
{% block body %}
 
    {% if editable %}
 
        <div class="pull-right">
 
            <a href="{% url cms_page_edit page.path %}" class="btn"><i class="icon-pencil icon-large"></i> Edit this page</a>
 
            <a href="{% url 'cms_page_edit' page.path %}" class="btn"><i class="icon-pencil icon-large"></i> Edit this page</a>
 
        </div>
 
    {% endif %}
 
    <h2>{{ page.title }}</h2>
 
    
 
    <div class="page-content">
 
        {{ page.body }}
 
    </div>
 
    
 
{% endblock %}
...
 
\ No newline at end of file
symposion/templates/emails/speaker_no_profile/message.html
Show inline comments
 
{% load url from future %}
 
<p>{{ proposal.speaker.name }} attached you as an additional speaker to a
 
    talk proposal for {{ current_site.name }} entitled "{{ proposal.title }}".</p>
 

	
 
<p>Go to</p>
 

	
 
<p><a href="http://{{ current_site }}{% url speaker_create_token token %}">http://{{ current_site }}{% url speaker_create_token token %}</a></p>
 
<p><a href="http://{{ current_site }}{% url 'speaker_create_token' token %}">http://{{ current_site }}{% url 'speaker_create_token' token %}</a></p>
 

	
 
<p>to confirm and fill out your speaker profile.</p>
symposion/templates/schedule/schedule_edit.html
Show inline comments
 
{% extends "site_base.html" %}
 

	
 
{% load i18n %}
 
{% load bootstrap_tags %}
 

	
 
{% block head_title %}Conference Schedule Edit{% endblock %}
 

	
 
{% block body_class %}full{% endblock %}
 

	
 
{% block right %}
 
{% endblock %}
 

	
 
{% block extra_head %}
 
    <link rel="stylesheet" href="{{ STATIC_URL }}chosen/chosen.css" />
 
{% endblock %}
 

	
 
{% block body_outer %}
 
    <div class="row">
 
        <div class="span12">
 
            <h1>Schedule Edit</h1>
 
            
 

 
            {% for timetable in days %}
 
                <h2>{{ timetable.day.date }}</h2>
 
                {% include "schedule/_edit_grid.html" %}
 
            {% endfor %}
 
        </div>
 
        <form id="schedule-builder" action="." method="post" enctype="multipart/form-data">{% csrf_token %}
 
            {{ form.as_p }}
 
            <input type="submit" name="submit" value="Submit" />
 
            <input type="submit" id="delete" name="delete" value="Delete Schedule" />
 
        </form>
 
        <div class="modal fade hide in" id="slotEditModal"></div>
 
    </div>
 
{% endblock %}
 

	
 
{% block extra_script %}
 
    <script src="{{ STATIC_URL }}chosen/chosen.jquery.min.js" type="text/javascript"></script>
 
    <script type="text/javascript">
 
        $(function() {
 
            $("a.edit-slot").click(function(e) {
 
                $("#slotEditModal").load($(this).data("action"), function() {
 
                    $("#id_presentation").chosen();
 
                    $("#slotEditModal").modal("show");
 
                });
 
                e.preventDefault();
 
            });
 
        });
 
        $(function() {
 
           //submit event handler
 
            $("form#schedule-builder :submit").click(function(e) {
 
                var name = this.name;
 
                if(name == 'delete') {
 
                    if (!confirm("Are you sure you want to delete the schedule?"))
 
                        {
 
                            e.preventDefault();
 
                            return;
 
                        }
 
                }
 
            });
 
        });
 

	
 
    </script>
 
{% endblock %}
0 comments (0 inline, 0 general)