Skip to content

Commit

Permalink
Merge pull request #63 from builderscon/richard-cfp-page-init
Browse files Browse the repository at this point in the history
Initial work on CFP submission page #17
  • Loading branch information
lestrrat authored Aug 5, 2016
2 parents 480a65f + 3576934 commit b97f02c
Show file tree
Hide file tree
Showing 4 changed files with 312 additions and 55 deletions.
105 changes: 53 additions & 52 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,6 @@ def start_oauth(oauth_handler, callback):
@flaskapp.route('/login')
def login():
return flask.render_template('login.tpl',
pagetitle='login',
next_url=flask.request.args.get('.next')
)

Expand Down Expand Up @@ -407,34 +406,54 @@ def latest(series_slug, rest):
def conference(series_slug):
flask.redirect('/{0}/latest'.format(series_slug))

def conference_by_slug(cb):
def prepare_conference(cb, series_slug, slug, **args):
print(series_slug)
print(slug)
full_slug = "%s/%s" % (series_slug, slug)
conference = _get_conference_by_slug(full_slug, flask.g.lang)
if not conference:
return "page not found", 404
flask.g.stash['series_slug'] = series_slug
flask.g.stash['slug'] = slug
flask.g.stash['full_slug'] = full_slug
flask.g.stash['conference'] = conference
return cb(**args)
return functools.update_wrapper(functools.partial(prepare_conference, cb), cb)

@flaskapp.route('/<series_slug>/<path:slug>/sponsors')
def conference_sponsors(series_slug, slug):
full_slug = "%s/%s" % (series_slug, slug)
conference = _get_conference_by_slug(full_slug, flask.g.lang)
return flask.render_template('sponsors.tpl',
slug=full_slug,
pagetitle=series_slug + ' ' + slug,
conference=conference,
)
@conference_by_slug
def conference_sponsors():
return flask.render_template('sponsors.tpl')


@flaskapp.route('/<series_slug>/<path:slug>/sessions')
def conference_sessions(series_slug, slug):
full_slug = "%s/%s" % (series_slug, slug)
conference = _get_conference_by_slug(full_slug, flask.g.lang)
if not conference:
raise ConferenceNotFoundError
@conference_by_slug
def conference_sessions():
conference = flask.g.stash.get('conference')
conference_sessions = _list_session_by_conference(conference.get('id'), flask.g.lang)
return flask.render_template('sessions.tpl',
pagetitle=series_slug + ' ' + slug,
conference=conference,
sessions=conference_sessions
)
return flask.render_template('sessions.tpl', sessions=conference_sessions)



@flaskapp.route('/<series_slug>/<path:slug>/cfp')
@conference_by_slug
def conference_cfp():
conference = flask.g.stash.get('conference')
session_types = octav.list_session_types_by_conference(conference_id=conference.get('id'), lang=flask.g.lang)
if not session_types:
session_types = []

return flask.render_template('cfp.tpl', session_types=session_types)

@flaskapp.route('/<series_slug>/<path:slug>/cfp_done')
@conference_by_slug
def confernece_cfp_done():
return flask.render_template('cfp_done.tpl')

@flaskapp.route('/<regex("(.+)"):slug>/news')
def conference_news(slug):
@flaskapp.route('/<series_slug>/<path:slug>/news')
@conference_by_slug
def conference_news():
key = "news_entries.lang." + flask.g.lang
news_entries = cache.get(key)
if not news_entries:
Expand All @@ -446,62 +465,44 @@ def conference_news(slug):
cache.set(key, news.entries, 600)

filtered_entries = []
slug = flask.g.stash.get('full_slug')
for entry in news_entries:
if entry.category == slug:
if not entry.published_parsed:
entry.date = ""
else:
entry.date = time.strftime( '%b %d, %Y', entry.published_parsed )
filtered_entries.append(entry)
return flask.render_template('news.tpl',
slug=slug,
entries=filtered_entries
)
return flask.render_template('news.tpl', entries=filtered_entries)


@flaskapp.route('/<series_slug>/<path:slug>')
def conference_instance(series_slug, slug):
full_slug = "%s/%s" % (series_slug, slug)
conference = _get_conference_by_slug(full_slug, flask.g.lang)
if not conference:
return octav.last_error(), 404

return flask.render_template('conference.tpl',
pagetitle=series_slug + ' ' + slug,
slug=full_slug,
conference=conference,
googlemap_api_key=cfg.googlemap_api_key()
)
@conference_by_slug
def conference_instance():
return flask.render_template('conference.tpl', googlemap_api_key=cfg.googlemap_api_key())

@flaskapp.route('/<series_slug>/<slug>/session/add')
def add_session(series_slug, slug):
return flask.render_template('add_session.tpl',
pagetitle=series_slug + ' ' + slug
)
@conference_by_slug
def add_session():
return flask.render_template('add_session.tpl')


@flaskapp.route('/<series_slug>/<slug>/session/add', methods=['POST'])
def add_session_post(series_slug, slug):
@conference_by_slug
def add_session_post():
flask.redirect('/')


@flaskapp.route('/<series_slug>/<slug>/session/<id>')
def conference_session_details(series_slug, slug, id):
@flaskapp.route('/<series_slug>/<path:slug>/session/<id>')
@conference_by_slug
def conference_session_details(id):
session = octav.lookup_session(lang=flask.g.lang, id=id)
if not session:
return octav.last_error(), 404
return flask.render_template('session_detail.tpl',
pagetitle=series_slug + ' ' + slug,
session=session
)

@flaskapp.route('/speaker/<id>')
def speaker_details(id):
return flask.render_template('speaker_details.tpl',
pagetitle='spkeaker'
)


def conference_cache_key(id, lang):
if not id:
raise Exception("faild to create conference cache key: no id")
Expand Down
213 changes: 213 additions & 0 deletions templates/cfp.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
{% extends 'layout/conference.tpl' %}

{% block heroimage %}
<div id="heroimage-empty"></div>
{% endblock %}

{% block herotext %}
<h1>{{ conference.title }}</h1>
<h3>{{ conference.sub_title }}</h3>
<h3>{% if conference.dates|length == 1 %}{{ conference.dates[0].date }}{% endif %}</h3>
{% endblock %}

{% block header %}
<style type="text/css">
<!--
.cfp-form label {
font-weight: bold;
font-size: 1.1em;
}
.cfp-form .row {
margin-bottom: 0.5em;
}
.yes-no {
padding: 2px;
font-weight: bold;
}
.notice-small {
font-size: 80% !important;
color: #888 !important;
}
.tos-agreement {
border: 2px dotted #f99;
}
.tos-agreement * {
padding: 10px !important;
}
-->
</style>
{% endblock %}
{% block main %}
<main>
{% if not error %}
<div class="section article">
<div class="inner">
<h1 class="section-header">Call For Papers</h1>
<div class="section-content">
<div class="row">
<div class="large-12 columns"><h3>概要説明</h3></div>
</div>
<div class="row">
<div class="large-12 columns">
<p>buildersconはスピーカー達のトークが最大の武器です。あなたのバックグラウンドがどんなものであろうと、
他の参加者の皆様と技術への愛をシェアしていただける方であれば大歓迎です。どの専門分野を持っていても、
どの技術コミュニティからの参加であっても歓迎します。</p>
<p>builderscon自体がどんなカンファレンスを目指しているかは<a href="/" target="_blank">builderscon ホーム</a>
および<a href="/" target="_blank">builderscon tokyo 2016</a>のページをご覧ください。</p>
</p>buildersconではトークに関して技術的な制約はありません、特定のプログラミング言語や技術スタックによるくくりも設けません。
必要なのは技術者達に刺激を与えワクワクさせてくれるアイデアのみです。
あなたが実装したクレイジーなハックを見せて下さい。あなたの好きな言語のディープな知識をシェアしてください。
あなたの直面した様々な問題と、それをどう解決したかを教えてください。未来技術のような未知の領域について教えてください。</p>
<p>注意点として、あるサイト、プロダクト、フレームワーク、新技術の紹介「だけ」に終始するトークはあまりbuildersconにはふさわしくありません、
こういった事柄をトークの題材にする場合には上にあるように、あなたがどういう問題に直面し、どう解決したか伝えるようにするといいでしょう。</p>
<p>buildersconの参加者は、あなたと同じく技術に対する愛に溢れた人々です。あなたが提供してくれる「知らなかった、を聞く」チャンスををワクワクしながら待っています。
是非、buildersconに参加して、あなたの情熱をシェアしてください!</p>
<p>応募は以下のフォームに入力して、「{% trans %}Submit your proposal{% endtrans %}」ボタンを押してください。</p>
</div>
</div>
</div><!-- section-content -->
</div><!-- inner -->
</div><!-- section article -->
{% endif %}
{% set left = 3 %}
{% set right = 12 - left %}
<div class="section article">
<div class="inner">
<h1 class="section-header">{% trans %}Submission Form{% endtrans %}</h1>
<div class="section-content">
<form class="cfp-form" action="." method="post">
<div class="row">
<div class="large-12 columns"><h3>{% trans %}Proposal Details{% endtrans %}</h3></div>
</div>
<div class="row">
<div class="large-{{ left }} columns"><label>Title</label></div>
<div class="large-{{ right }} columns"><input type="text" name="title"/></div>
</div>
<div class="row">
<div class="large-{{ left }} columns"><label>Session type</label></div>
<div class="large-{{ right }} columns">
<select name="session_type">
{% for stype in session_types %}
<option value="{{ stype.id }}"{% if stype.is_accepting_submission %}{% if loop.first %} selected="selected"{% endif %}{% else %} disabled="disabled"{% endif %}>{{ stype.name }}{% if not stype.is_accepting_submission %} [{% trans %}SUBMISSION CURRENTLY CLOSED{% endtrans %}]{% endif %}</option>
{% endfor %}
</select>
</div>
</div>
<div class="row">
<div class="large-{{ left }} columns"><label>Abstract</label></div>
<div class="large-{{ right }} columns"><textarea name="abstract" rows=8></textarea></div>
</div>
<div class="row">
<div class="large-{{ left }} columns"><label>Expected audience level</label></div>
<div class="large-{{ right }} columns">
<select name="material_level">
<option value="beginner" id="beginner" selected/><label for="beginner" >Beginner</option>
<option value="intermediate" id="intermediate" /><label for="intermediate">Intermediate</option>
<option value="expert" id="expert" /><label for="expert" >Expert</option>
</select>
</div>
</div>
<div class="row">
<div class="large-{{ left }} columns"><label>Spoken language</label></div>
<div class="large-{{ right }} columns">
<select name="spoken_language">
<option value="en" selected="selected">{% trans %}English{% endtrans %}</option>
<option value="ja">{% trans %}Japanese{% endtrans %}</option>
</select>
<p class="notice-small">Please select which language you will be speaking in.</p>
</div>
</div>
<div class="row">
<div class="large-{{ left }} columns"><label>Slide Language</label></div>
<div class="large-{{ right }} columns">
<select name="slide_language">
<option value="en" selected="selected">{% trans %}English{% endtrans %}</option>
<option value="ja">{% trans %}Japanese{% endtrans %}</option>
</select>
<p class="notice-small">Please select which language you will write your slides in.</p>
</div>
</div>
<div class="row">
<div class="large-{{ left }} columns"><label>Comments</label></div>
<div class="large-{{ right }} columns">
<textarea name="memo" rows=4 placeholder="{% trans %}Specify any communication that you might want to relay to the organizer: e.g. special financial requirements, required documents, specific dates during the conference you might not be able to attend, etc{% endtrans %}"></textarea>
</div>
</div>
<div class="row">
<div class="large-12 columns">
<h3>{% trans %}Videos and Photos{% endtrans %}</h3>
<p class="notice-small">Please refer to our <a href="." target="_blank">terms of use</a> about how builderscon uses videos, photos, and other materials.</p>
</div>
</div>
<div class="row">
<div class="large-{{ left }} columns"><label>Photo Release</label></div>
<div class="large-{{ right }} columns">
<p>By selecting "yes" to this, you agree to have your photo taken by our staff during your presentation, and to allow builderscon to distribute those photos and to place them on our website(s).</p>
<input type="radio" name="photo_permission" value="allow" id="photo_permission_allow" checked/><span class="yes-no">{% trans %}Yes{% endtrans %}</span>
<input type="radio" name="photo_permission" value="disallow" id="photo_permission_disallow" /><span class="yes-no">{% trans %}No{% endtrans %}</span>
</div>
</div>
<div class="row">
<div class="large-{{ left }} columns"><label>Recording Release</label></div>
<div class="large-{{ right }} columns">
<p>By selecting "yes" to this, you agree to have your presentation recorded by our staff, and to allow builderscon to distribute those recordings and to place them on our website(s).</p>
<input type="radio" name="video_permission" value="allow" id="video_permission_allow" checked/><span class="yes-no">{% trans %}Yes{% endtrans %}</span>
<input type="radio" name="video_permission" value="disallow" id="video_permission_disallow" /><span class="yes-no">{% trans %}No{% endtrans %}</span>
</div>
</div>
<div class="row">
<div class="large-{{ left }} columns"><label>Materials Release</label></div>
<div class="large-{{ right }} columns">
<p>By selecting "yes" to this, you agree to release materials from your presentation (such as slides), and to allow builderscon to distribute those materials and to place them on our website(s).</p>
<input type="radio" name="materials_permission" value="allow" id="materials_permission_allow" checked/><span class="yes-no">{% trans %}Yes{% endtrans %}</span>
<input type="radio" name="materials_permission" value="disallow" id="materials_permission_disallow" /><span class="yes-no">{% trans %}No{% endtrans %}</span>
</div>
</div>
<div class="row tos-agreement">
<div class="large-12 columns">
<p>I hereby confirm that I understand and agree to the <a href="" target="_blank">terms of use</a> and the various release agreements described with regards to submitting a proposal for builderscon.</p>
<input type="checkbox" name="terms_of_use" value=true id="terms_of_use_yes" onchange="handleTermsOfUseAgree(this);" /> <span class="yes-no">{% trans %}Yes{% endtrans %}</span>
</div>
</div>
<div class="row">
<div class="large-12 columns">
<button id="submit-button" type="submit" class="expanded button disabled">{% trans %}Submit your proposal{% endtrans %}</button>
<p class="notice-small">Please check &#34;Yes&#34; above to agree to terms of use, before submitting your proposal.</p>
</div>
</div>
</form>
</div>
</div>
</div>
</main>
{% endblock%}
{% block scripts %}
<script>
<!--
$(function() {
$("#terms_of_use_yes").change(function() {
if ($("#terms_of_use_yes").prop('checked')) {
$("#submit-button").removeClass("disabled");
} else {
$("#submit-button").addClass("disabled")
}
});
})
-->
</script>
{% endblock %}
Loading

0 comments on commit b97f02c

Please sign in to comment.