Skip to content

Commit

Permalink
Massively upgrade symposion
Browse files Browse the repository at this point in the history
* Remove markitup (to be replaced with Ace editor)
* Use DUA decorators
* Removed custom signup bits
* Upgraded dependencies
* Added migrations
* Namespaced template locations
* Removed html5parser/sanitizer (for now) - parsing functionality
should be moved out entirely to a hooks
* Replaced ProposalScoreExpression object with a  function that returns
F() expressions
  • Loading branch information
paltman committed Oct 16, 2015
1 parent 8b4282a commit 11f697d
Show file tree
Hide file tree
Showing 36 changed files with 821 additions and 222 deletions.
23 changes: 11 additions & 12 deletions requirements/base.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
Django>=1.7.1
django-appconf==0.6
django-markitup==2.2.2
django-model-utils==2.2
django-reversion==1.8.5
django-sitetree==1.2.1
django-taggit==0.12.2
django-timezone-field==1.2
django-user-accounts==1.0
Django==1.8.5
django-appconf==1.0.1
django-model-utils==2.3.1
django-reversion==1.9.3
django-sitetree==1.4.0
django-taggit==0.17.1
django-timezone-field==1.3
django-user-accounts==1.2.0
easy-thumbnails==2.2
html5lib==0.999
markdown==2.5.2
pytz==2014.10
html5lib==0.9999999
markdown==2.6.2
pytz==2015.6
44 changes: 44 additions & 0 deletions symposion/conference/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
import timezone_field.fields


class Migration(migrations.Migration):

dependencies = [
]

operations = [
migrations.CreateModel(
name='Conference',
fields=[
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100, verbose_name='Title')),
('start_date', models.DateField(null=True, blank=True, verbose_name='Start date')),
('end_date', models.DateField(null=True, blank=True, verbose_name='End date')),
('timezone', timezone_field.fields.TimeZoneField(blank=True, verbose_name='timezone')),
],
options={
'verbose_name_plural': 'conferences',
'verbose_name': 'conference',
},
),
migrations.CreateModel(
name='Section',
fields=[
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100, verbose_name='Name')),
('slug', models.SlugField(verbose_name='Slug')),
('start_date', models.DateField(null=True, blank=True, verbose_name='Start date')),
('end_date', models.DateField(null=True, blank=True, verbose_name='End date')),
('conference', models.ForeignKey(to='symposion_conference.Conference', verbose_name='Conference')),
],
options={
'ordering': ['start_date'],
'verbose_name_plural': 'sections',
'verbose_name': 'section',
},
),
]
Empty file.
5 changes: 3 additions & 2 deletions symposion/conference/views.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
from django.http import Http404
from django.shortcuts import render

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

from account.decorators import login_required


@login_required
def user_list(request):

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

return render(request, "conference/user_list.html", {
return render(request, "symposion/conference/user_list.html", {
"users": User.objects.all(),
})
58 changes: 0 additions & 58 deletions symposion/forms.py

This file was deleted.

11 changes: 6 additions & 5 deletions symposion/markdown_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ def parse(text):
text = markdown.markdown(text, extensions=["extra"], safe_mode=False)

# Sanitize using html5lib
bits = []
parser = html5parser.HTMLParser(tokenizer=sanitizer.HTMLSanitizer)
for token in parser.parseFragment(text).childNodes:
bits.append(token.toxml())
return "".join(bits)
# bits = []
# parser = html5parser.HTMLParser(tokenizer=sanitizer.HTMLSanitizer)
# for token in parser.parseFragment(text).childNodes:
# bits.append(token.toxml())
# return "".join(bits)
return text
1 change: 0 additions & 1 deletion symposion/proposals/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from django.utils.translation import ugettext_lazy as _

from symposion.proposals.models import SupportingDocument
# from markitup.widgets import MarkItUpWidget


# @@@ generic proposal form
Expand Down
100 changes: 100 additions & 0 deletions symposion/proposals/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
from django.conf import settings
import django.utils.timezone
import symposion.proposals.models


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('symposion_speakers', '__first__'),
('symposion_conference', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='AdditionalSpeaker',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('status', models.IntegerField(verbose_name='Status', default=1, choices=[(1, 'Pending'), (2, 'Accepted'), (3, 'Declined')])),
],
options={
'verbose_name': 'Addtional speaker',
'verbose_name_plural': 'Additional speakers',
},
),
migrations.CreateModel(
name='ProposalBase',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('title', models.CharField(verbose_name='Title', max_length=100)),
('description', models.TextField(verbose_name='Brief Description', max_length=400, help_text='If your proposal is accepted this will be made public and printed in the program. Should be one paragraph, maximum 400 characters.')),
('abstract', models.TextField(verbose_name='Detailed Abstract', help_text="Detailed outline. Will be made public if your proposal is accepted. Edit using <a href='http://daringfireball.net/projects/markdown/basics' target='_blank'>Markdown</a>.")),
('abstract_html', models.TextField(blank=True)),
('additional_notes', models.TextField(blank=True, verbose_name='Addtional Notes', help_text="Anything else you'd like the program committee to know when making their selection: your past experience, etc. This is not made public. Edit using <a href='http://daringfireball.net/projects/markdown/basics' target='_blank'>Markdown</a>.")),
('additional_notes_html', models.TextField(blank=True)),
('submitted', models.DateTimeField(editable=False, default=django.utils.timezone.now, verbose_name='Submitted')),
('cancelled', models.BooleanField(verbose_name='Cancelled', default=False)),
('additional_speakers', models.ManyToManyField(blank=True, verbose_name='Addtional speakers', through='symposion_proposals.AdditionalSpeaker', to='symposion_speakers.Speaker')),
],
),
migrations.CreateModel(
name='ProposalKind',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('name', models.CharField(verbose_name='Name', max_length=100)),
('slug', models.SlugField(verbose_name='Slug')),
('section', models.ForeignKey(to='symposion_conference.Section', verbose_name='Section', related_name='proposal_kinds')),
],
),
migrations.CreateModel(
name='ProposalSection',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('start', models.DateTimeField(blank=True, verbose_name='Start', null=True)),
('end', models.DateTimeField(blank=True, verbose_name='End', null=True)),
('closed', models.NullBooleanField(verbose_name='Closed')),
('published', models.NullBooleanField(verbose_name='Published')),
('section', models.OneToOneField(to='symposion_conference.Section', verbose_name='Section')),
],
),
migrations.CreateModel(
name='SupportingDocument',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('created_at', models.DateTimeField(verbose_name='Created at', default=django.utils.timezone.now)),
('file', models.FileField(verbose_name='File', upload_to=symposion.proposals.models.uuid_filename)),
('description', models.CharField(verbose_name='Description', max_length=140)),
('proposal', models.ForeignKey(to='symposion_proposals.ProposalBase', verbose_name='Proposal', related_name='supporting_documents')),
('uploaded_by', models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Uploaded by')),
],
),
migrations.AddField(
model_name='proposalbase',
name='kind',
field=models.ForeignKey(to='symposion_proposals.ProposalKind', verbose_name='Kind'),
),
migrations.AddField(
model_name='proposalbase',
name='speaker',
field=models.ForeignKey(to='symposion_speakers.Speaker', verbose_name='Speaker', related_name='proposals'),
),
migrations.AddField(
model_name='additionalspeaker',
name='proposalbase',
field=models.ForeignKey(to='symposion_proposals.ProposalBase', verbose_name='Proposalbase'),
),
migrations.AddField(
model_name='additionalspeaker',
name='speaker',
field=models.ForeignKey(to='symposion_speakers.Speaker', verbose_name='Speaker'),
),
migrations.AlterUniqueTogether(
name='additionalspeaker',
unique_together=set([('speaker', 'proposalbase')]),
),
]
Empty file.
20 changes: 14 additions & 6 deletions symposion/proposals/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@

import reversion

from markitup.fields import MarkupField

from model_utils.managers import InheritanceManager

from symposion.markdown_parser import parse
from symposion.conference.models import Section
from symposion.speakers.models import Speaker

Expand Down Expand Up @@ -94,38 +93,47 @@ class ProposalBase(models.Model):
help_text=_("If your proposal is accepted this will be made public and printed in the "
"program. Should be one paragraph, maximum 400 characters.")
)
abstract = MarkupField(
abstract = models.TextField(
_("Detailed Abstract"),
help_text=_("Detailed outline. Will be made public if your proposal is accepted. Edit "
"using <a href='http://daringfireball.net/projects/markdown/basics' "
"target='_blank'>Markdown</a>.")
)
additional_notes = MarkupField(
abstract_html = models.TextField(blank=True)
additional_notes = models.TextField(
_("Addtional Notes"),
blank=True,
help_text=_("Anything else you'd like the program committee to know when making their "
"selection: your past experience, etc. This is not made public. Edit using "
"<a href='http://daringfireball.net/projects/markdown/basics' "
"target='_blank'>Markdown</a>.")
)
additional_notes_html = models.TextField(blank=True)
submitted = models.DateTimeField(
default=now,
editable=False,
verbose_name=_("Submitted")
)
speaker = models.ForeignKey(Speaker, related_name="proposals", verbose_name=_("Speaker"))

# @@@ this validation used to exist as a validators keyword on additional_speakers
# M2M field but that is no longer supported by Django. Should be moved to
# the form level
def additional_speaker_validator(self, a_speaker):
if a_speaker.speaker.email == self.speaker.email:
raise ValidationError(_("%s is same as primary speaker.") % a_speaker.speaker.email)
if a_speaker in [self.additional_speakers]:
raise ValidationError(_("%s has already been in speakers.") % a_speaker.speaker.email)

additional_speakers = models.ManyToManyField(Speaker, through="AdditionalSpeaker",
blank=True, verbose_name=_("Addtional speakers"),
validators=[additional_speaker_validator])
blank=True, verbose_name=_("Addtional speakers"))
cancelled = models.BooleanField(default=False, verbose_name=_("Cancelled"))

def save(self, *args, **kwargs):
self.abstract_html = parse(self.abstract)
self.additional_notes_html = parse(self.additional_notes)
return super(ProposalBase, self).save(*args, **kwargs)

def can_edit(self):
return True

Expand Down
Loading

0 comments on commit 11f697d

Please sign in to comment.