Changeset - ecabf31e54b9
[Not reviewed]
0 6 0
Christopher Neugebauer - 8 years ago 2016-07-09 13:14:31
_@chrisjrn.com
Assorted fixes (#47)

* Invokes the site tree fix from previous fixes.

* Adds a disclaimer noting that previous years’ accounts have not been carried over.

Fixes #43

* Adds proposal type to the proposal summary page.

Fixes #40

* Adds travel/accommodation assistance to the proposals page, but makes it only visible to speakers in the proposal, or review managers.

Fixes #41.
Fixes #42.

* Reduces a lot of the whitespace in the header and footer.

Fixes #44

* Proposals review page now shows information for every speaker on a proposal.

Fixes #45

* Makes sure that non_field_errors are displayed by forms.

Fixes #37
6 files changed with 77 insertions and 12 deletions:
0 comments (0 inline, 0 general)
pinaxcon/monkey_patch.py
Show inline comments
...
 
@@ -4,24 +4,25 @@ from functools import wraps
 

	
 

	
 
class MonkeyPatchMiddleware(object):
 
    ''' Ensures that our monkey patching only gets called after it is safe to do so.'''
 

	
 
    def process_request(self, request):
 
        do_monkey_patch()
 

	
 

	
 
def do_monkey_patch():
 
    patch_speaker_profile_form()
 
    patch_accounts_to_send_bcc()
 
    fix_sitetree_check_access_500s()
 

	
 
    # Remove this function from existence
 
    global do_monkey_patch
 
    do_monkey_patch = lambda: None
 

	
 

	
 
def patch_speaker_profile_form():
 
    ''' Replaces textarea widgets with markdown editors. '''
 

	
 
    import widgets
 
    from symposion.speakers.forms import SpeakerForm
 

	
pinaxcon/templates/_form_snippet.html
Show inline comments
 
{% load lca2017_tags %}
 

	
 
{% if form.non_field_errors %}
 
  {{ form.non_field_errors }}
 
  <br/>
 
{% endif %}
 

	
 
{% for field in form %}
 
  {% if not field.is_hidden %}
 
    <div class="fieldWrapper">
 
      <div>
 
        {% classname field.field.widget as widget %}
 
        {% if widget != "CheckboxInput" %}
 
          <h4><label for="{{ field.id_for_label }}">{{ field.label }}</label></h4>
 
          {{ field.errors }}
 
          {{ field }}
 
        {% else %}
 
          <label for="{{ field.id_for_label }}"><strong>{{ field.label }}</strong></label>
 
          {{ field }}
pinaxcon/templates/account/login.html
Show inline comments
...
 
@@ -5,24 +5,28 @@
 
{% load bootstrap %}
 

	
 
{% block head_title %}{% trans "Log in" %}{% endblock %}
 
{% block page_title %}{% trans "Log in to an existing account" %}{% endblock %}
 

	
 
{% block utility_body %}
 

	
 
  {% if ACCOUNT_OPEN_SIGNUP %}
 
      <p class="login-signup">
 
              {% trans "Don't have an account?" %}  <strong><a href="{% urlnext 'account_signup' %}">{% trans "Sign up" %}</a></strong>
 
      </p>
 
  {% endif %}
 
      <p>
 
        {% trans "Accounts from previous years have not been carried over to this site." %}
 
        {% trans "You will need to create a new account for this year's site." %}
 
      </p>
 

	
 
            <form method="POST" action="{% url "account_login" %}" autocapitalize="off" {% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
 
                {% csrf_token %}
 
                <fieldset>
 
                  {% include "_form_snippet.html" with form=form %}
 

	
 
                  {% if redirect_field_value %}
 
                      <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
 
                  {% endif %}
 
                  <button type="submit" class="btn btn-primary">{% trans "Log in" %}</button>
 
                  <a href="{% url "account_password_reset" %}" class="btn btn-link">{% trans "Forgot your password?" %}</a>
 
                </fieldset>
pinaxcon/templates/symposion/proposals/_proposal_fields.html
Show inline comments
 
{% load i18n %}
 
{% load lca2017_tags %}
 

	
 
    <h4>{% trans "Submitted by" %}</h4>
 
    <p>{{ proposal.speaker }}</p>
 

	
 
    <h4>{% trans "Proposal Type" %}</h4>
 
    <p>{{ proposal.kind.name|capfirst }}</p>
 

	
 
    <h4>{% trans "Target Audience" %}</h4>
 
    <p>{{ proposal.get_target_audience_display }}&nbsp;</p>
 

	
 
    {% if proposal.additional_speakers.all %}
 
        <h4>{% trans "Additional Speakers" %}</h4>
 
        <ul>
 
            {% for speaker in proposal.additional_speakers.all %}
 
                <li>
 
                    {% if speaker.user %}
 
                        <strong>{{ speaker.name }}</strong> &lt;{{ speaker.email }}&gt;
 
                    {% else %}
 
                        {{ speaker.email }} ({% trans "Invitation Sent" %})
...
 
@@ -31,32 +35,66 @@
 
    <h4>{% trans "Project" %}</h4>
 
    <p>{{ proposal.project|safe }}&nbsp;</p>
 

	
 
    <h4>{% trans "Project URL" %}</h4>
 
    <p><a href="{{ proposal.project_url|safe }}">{{ proposal.project_url|safe }}</a>&nbsp;</p>
 

	
 
    <h4>{% trans "Video URL" %}</h4>
 
    <p><a href="{{ proposal.video_url|safe }}">{{ proposal.video_url|safe }}</a>&nbsp;</p>
 

	
 
    <h4>{% trans "Special Requirements" %}</h4>
 
    <div class="special_requirements">{{ proposal.technical_requirements_html|safe }}</div>
 

	
 
    <h4>{% trans "Speaker Bio" %}</h4>
 
    <div class="biography">{{ proposal.speaker.biography_html|safe }}&nbsp;</div>
 
    {% for speaker in proposal.speakers %}
 
      <h4>{% trans "Speaker:" %} {{ speaker.name }}</h4>
 
      <h5>{% trans "Biography" %}</h5>
 

	
 
      <div class="biography">{{ proposal.speaker.biography_html|safe }}&nbsp;</div>
 

	
 
      <h5>{% trans "Experience" %}</h5>
 
      <div class="biography">{{ proposal.speaker.experience_html|safe }}&nbsp;</div>
 
    {% endfor %}
 

	
 
    {% if can_manage_proposal or request.user.speaker_profile in proposal.speakers %}
 

	
 
    <h4>{% trans "Speaker Experience" %}</h4>
 
    <div class="biography">{{ proposal.speaker.experience_html|safe }}&nbsp;</div>
 
      <h4>{% trans "Assistance required?" %}</h4>
 
      <br />
 
      <table>
 
        <tr>
 
          <th></th>
 
          <th>{% trans "Travel" %}</th>
 
          <th>{% trans "Accommodation" %}</th>
 
        </tr>
 
        {% for speaker in proposal.speakers %}
 
          <tr>
 
            <td>{{ speaker.name }}</td>
 
            <td>{{ speaker.travel_assistance }}</td>
 
            <td>{{ speaker.accommodation_assistance }}</td>
 
          </tr>
 
        {% endfor %}
 
      </table>
 
      <br />
 

	
 
      {% if proposal.speaker.accessibility_html %}
 
        <h4>{% trans "Speaker Accessibility Requirements" %}</h4>
 
        {% for speaker in proposal.speakers %}
 
          {% if speaker.accessibility_html %}
 
            <h5>{{ speaker.name }}</h5>
 
            <div class="biography">{{ speaker.accessibility_html|safe }}&nbsp;</div>
 
          {% endif %}
 
        {% endfor %}
 
      {% endif %}
 

	
 
    {% endif %}
 

	
 
    <h4>{% trans "Speaker Accessibility Requirements" %}</h4>
 
    <div class="biography">{{ proposal.speaker.accessibility_html|safe }}&nbsp;</div>
 

	
 
    <h4>{% trans "Documents" %}</h4>
 
    <div>
 
        {% if proposal.supporting_documents.exists %}
 
            <table class="table table-striped">
 
                {% for document in proposal.supporting_documents.all %}
 
                    <tr>
 
                        <td><a href="{{ document.download_url }}">{{ document.description }}</a></td>
 
                        <td>
 
                        <form style="margin: 0;" method="post" action="{% url "proposal_document_delete" document.pk %}">
 
                            {% csrf_token %}
 
                            <button type="submit" class="btn btn-xs">delete</button>
pinaxcon/templatetags/lca2017_tags.py
Show inline comments
 
from django import template
 
register = template.Library()
 

	
 
@register.assignment_tag()
 
def classname(ob):
 
    return ob.__class__.__name__
 

	
 
@register.simple_tag(takes_context=True)
 
def can_manage(context, proposal):
 
    return proposal_permission(context, "manage", proposal)
 

	
 
@register.simple_tag(takes_context=True)
 
def can_review(context, proposal):
 
    return proposal_permission(context, "review", proposal)
 

	
 
def proposal_permission(context, permname, proposal):
 
    slug = proposal.kind.section.slug
 
    perm = "reviews.can_%s_%s" % (permname, slug)
 
    return context.request.user.has_perm(perm)
static/src/lca2017/css/app.css
Show inline comments
...
 
@@ -1366,25 +1366,25 @@ table.alt tr:not(:last-of-type) {
 
  font-size: 0.8em;
 
}
 

	
 
@media (min-width: 25em) {
 
  .l-header--logo {
 
    width: 200px;
 
    margin-right: 2.5rem;
 
  }
 
}
 

	
 
@media (min-width: 48em) {
 
  .l-header {
 
    margin-top: 6.25rem;
 
    /*margin-top: 6.25rem;  /* issue #44. We don't like this. */
 
  }
 
  .l-header--menu-opener {
 
    display: none !important;
 
  }
 
  .l-header--links {
 
    display: inline-block;
 
  }
 
  .l-header--logo {
 
    width: 255px;
 
  }
 
}
 

	
...
 
@@ -1421,25 +1421,25 @@ table.alt tr:not(:last-of-type) {
 
}
 

	
 
.l-footer {
 
  display: -ms-flexbox;
 
  display: flex;
 
  -ms-flex-align: center;
 
  align-items: center;
 
  -ms-flex-wrap: wrap;
 
  flex-wrap: wrap;
 
  -ms-flex-direction: column;
 
  flex-direction: column;
 
  margin-top: 100px;
 
  margin-top: 6.25rem;
 
  margin-top: 3.25rem;
 
  padding: 50px 40px;
 
  padding: 3.125rem 40px;
 
  width: 100%;
 
}
 

	
 
.l-footer--logos {
 
  display: -ms-flexbox;
 
  display: flex;
 
  -ms-flex-wrap: wrap;
 
  flex-wrap: wrap;
 
  -ms-flex-pack: distribute;
 
  justify-content: space-around;
...
 
@@ -1457,55 +1457,59 @@ table.alt tr:not(:last-of-type) {
 
  display: block;
 
  width: 100%;
 
  height: 100%;
 
}
 

	
 
.l-footer__alt {
 
  background-color: #0c486c;
 
  color: white;
 
}
 

	
 
@media (min-width: 48em) {
 
  .l-footer {
 
    padding: 6.25rem 70px;
 
    /*padding: 6.25rem 70px; /* issue #44 too much padding */
 
    padding: 3.25rem 70px;
 
    -ms-flex-direction: row;
 
    flex-direction: row;
 
    -ms-flex-pack: justify;
 
    justify-content: space-between;
 
  }
 
  .l-footer--logos {
 
    margin-top: 0;
 
  }
 
}
 

	
 
@media (min-width: 64em) {
 
  .l-footer {
 
    padding: 6.25rem 160px;
 
    /*padding: 6.25rem 160px; */
 
    padding: 3.25rem 160px;
 
  }
 
}
 

	
 
@media (min-width: 80em) {
 
  .l-footer {
 
    padding: 6.25rem 200px;
 
    /*padding: 6.25rem 200px;*/
 
    padding: 3.25rem 200px;
 
  }
 
  .l-footer--logo {
 
    margin-bottom: 0;
 
    -ms-flex-preferred-size: auto;
 
    flex-basis: auto;
 
  }
 
}
 

	
 
@media (min-width: 1946px) {
 
  .l-footer {
 
    padding: 6.25rem auto;
 
    padding: 3.25rem auto;
 
    /*padding: 6.25rem auto;*/
 
  }
 
}
 

	
 
.l-content-page {
 
  margin-top: 80px;
 
  margin-top: 5rem;
 
}
 

	
 
.l-content-page--image {
 
  height: 200px;
 
  width: 100%;
 
  margin: 7vw 0;
0 comments (0 inline, 0 general)