Changeset - 539fa2dfdd2b
[Not reviewed]
make_dev_container.sh
Show inline comments
...
 
@@ -12,25 +12,25 @@ docker image build -f docker/Dockerfile -t ${IMAGE_NAME} --target symposion_dev
 
docker container stop symposion
 
docker container rm symposion
 
docker container create --env-file docker/laptop-mode-env -p 28000:8000 -v $(pwd):/app/symposion_app --name symposion ${IMAGE_NAME}
 
docker container start symposion
 
## When we started the container and mounted . into /app/symposion_app, it hides the static/build directory
 
## As a kludge, re-run collectstatic to recreate it
 
## Possible alternative here: don't mount all of ., just mount the bits that we'd live to have update live
 
docker exec symposion ./manage.py collectstatic --noinput -v 0
 
docker exec symposion ./manage.py migrate
 
docker exec symposion ./manage.py loaddata ./fixtures/{conference,sites,sitetree,flatpages}.json
 
docker exec symposion ./manage.py create_review_permissions
 
docker exec symposion ./manage.py loaddata ./fixtures/????/*.json
 
#docker exec symposion ./manage.py populate_inventory
 
docker exec symposion ./manage.py populate_inventory
 

	
 
if [ -e ./symposion-tools ]; then
 
    pushd ./symposion-tools
 
    ./fixture_to_docker.sh fixtures/dev_dummy_superuser.json
 
    ./fixture_to_docker.sh fixtures/????_*.json
 
    popd
 
else
 
    echo Now creating a Django superuser. Please enter a
 
    docker exec -it symposion ./manage.py createsuperuser --username admin1 --email root@example.com
 
fi
 

	
 
set +x
pinaxcon/registrasion/management/commands/populate_inventory.py
Show inline comments
...
 
@@ -52,25 +52,25 @@ class Command(BaseCommand):
 
            name="Pre-purchase",
 
        )
 

	
 
    def populate_inventory(self):
 
        # Categories
 

	
 
        self.ticket = self.find_or_make(
 
            inv.Category,
 
            ("name",),
 
            name="Ticket",
 
            description="Each type of ticket has different included products. "
 
                        "For details of what products are included, see our "
 
                        "<a href='https://linux.conf.au/attend/tickets/'>registration page</a>",
 
                        "<a href='https://linux.conf.au/attend/tickets/'>registration page</a>.",
 
            required=True,
 
            render_type=inv.Category.RENDER_TYPE_RADIO,
 
            limit_per_user=1,
 
            order=1,
 
        )
 
        self.terms = self.find_or_make(
 
            inv.Category,
 
            ("name",),
 
            name="Terms, Conditions, and Code of Conduct Acceptance",
 
            description="I agree to the "
 
                        "<a href=\"https://linux.conf.au/attend/terms-and-conditions\"> "
 
                        "terms and conditions of attendance</a>, and I have read, "
...
 
@@ -92,54 +92,53 @@ class Command(BaseCommand):
 
                        "included in your conference ticket price.",
 
            required=False,
 
            render_type=inv.Category.RENDER_TYPE_QUANTITY,
 
            limit_per_user=10,
 
            order=20,
 
        )
 
        self.speakers_dinner_ticket = self.find_or_make(
 
            inv.Category,
 
            ("name",),
 
            name="Speakers' Dinner Ticket",
 
            description="Tickets to our exclusive Speakers' Dinner on the "
 
                        "evening of "
 
                        f"{settings.SPEAKER_DINNER_TICKET_DATE: %A %d %B}. "
 
                        "You may purchase up "
 
                        "to 5 tickets in total, for significant others and "
 
                        "family members.",
 
                        f"{settings.SPEAKER_DINNER_TICKET_DATE: %A %d %B}.",
 
            required=False,
 
            render_type=inv.Category.RENDER_TYPE_QUANTITY,
 
            limit_per_user=5,
 
            limit_per_user=1,
 
            order=30,
 
        )
 
        self.pdns_category = self.find_or_make(
 
            inv.Category,
 
            ("name",),
 
            name="Professional Delegates Networking Session Ticket",
 
            description="Tickets to our Professional Delegates Networking session. "
 
                        "This event will be held on the evening of "
 
                        f"{settings.PDNS_TICKET_DATE: %A %d %B} "
 
                        "and is restricted to Professional Ticket "
 
                        "holders, speakers, miniconf organisers, and invited "
 
                        "guests.",
 
            required=False,
 
            render_type=inv.Category.RENDER_TYPE_RADIO,
 
            limit_per_user=1,
 
            order=40,
 
        )
 
        self.t_shirt = self.find_or_make(
 
            inv.Category,
 
            ("name",),
 
            name="Shirt",
 
            description="Commemorative conference polo shirts, featuring the "
 
                        f"linux.conf.au {settings.LCA_START.year} artwork.",
 
            description="Commemorative conference shirts, featuring the "
 
                        f"linux.conf.au {settings.LCA_START.year} artwork. "
 
                        "View the <a href=\"https://linux.conf.au/attend/shirts\">"
 
                        "sizing guide</a>.",
 
            required=False,
 
            render_type=inv.Category.RENDER_TYPE_ITEM_QUANTITY,
 
            order=50,
 
        )
 
        # self.accommodation = self.find_or_make(
 
        #     inv.Category,
 
        #     ("name",),
 
        #     name="Accommodation at University of Tasmania",
 
        #     description="Accommodation at the University of Tasmania colleges "
 
        #                 "and apartments. You can come back and book your "
 
        #                 "accommodation at a later date, provided rooms remain "
 
        #                 "available. Rooms may only be booked from Sunday 15 "
...
 
@@ -346,31 +345,35 @@ class Command(BaseCommand):
 
            ("name", "category",),
 
            category=self.extras,
 
            name="Offset the carbon pollution generated by your attendance, "
 
                 "thanks to fifteen trees.",
 
            price=Decimal("5.00"),
 
            reservation_duration=hours(1),
 
            order=10,
 
        )
 

	
 
        # Shirts
 
        ShirtGroup = namedtuple("ShirtGroup", ("prefix", "sizes"))
 
        shirt_names = {
 
            "mens": ShirtGroup(
 
                "Men's/Straight Cut",
 
                ("S", "M", "L", "XL", "2XL", "3XL", "4XL"),
 
            "straight": ShirtGroup(
 
                "Straight Cut",
 
                ("S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL"),
 
            ),
 
            "semi_fitted": ShirtGroup(
 
                "Semi-Fitted",
 
                ("XS", "S", "M", "L", "XL", "2XL"),
 
            ),
 
            "womens": ShirtGroup(
 
                "Women's Classic Fit",
 
                ("8", "10", "12", "14", "16", "18"),
 
            "fitted": ShirtGroup(
 
                "Fitted",
 
                ("XS", "S", "M", "L", "XL", "2XL"),
 
            ),
 
        }
 

	
 
        self.shirts = {}
 
        order = 0
 
        for name, group in shirt_names.items():
 
            self.shirts[name] = {}
 
            prefix = group.prefix
 
            for size in group.sizes:
 
                product_name = "%s %s" % (prefix, size)
 
                order += 10
 
                self.shirts[name][size] = self.find_or_make(
...
 
@@ -454,25 +457,25 @@ class Command(BaseCommand):
 
            ("description", ),
 
            description="Reserved for sponsors",
 
            condition=cond.FlagBase.DISABLE_IF_FALSE,
 
            limit=70,
 
        )
 
        sponsor_ticket_cap.products.set([
 
            self.ticket_sponsor,
 
        ])
 

	
 
        volunteer_ticket_cap = self.find_or_make(
 
            cond.TimeOrStockLimitFlag,
 
            ("description", ),
 
            description="Reserrved for volunteers and organizers",
 
            description="Reserved for volunteers and organisers",
 
            condition=cond.FlagBase.DISABLE_IF_FALSE,
 
            limit=62,
 
        )
 
        volunteer_ticket_cap.products.set([
 
            self.ticket_team,
 
            self.ticket_volunteer,
 
        ])
 

	
 
        media_ticket_cap = self.find_or_make(
 
            cond.TimeOrStockLimitFlag,
 
            ("description", ),
 
            description="Reserved for media",
...
 
@@ -554,32 +557,32 @@ class Command(BaseCommand):
 
        # Speaker tickets are for primary speakers only
 
        speaker_tickets = self.find_or_make(
 
            cond.SpeakerFlag,
 
            ("description", ),
 
            description="Speaker tickets",
 
            condition=cond.FlagBase.ENABLE_IF_TRUE,
 
            is_presenter=True,
 
            is_copresenter=False,
 
        )
 
        speaker_tickets.proposal_kind.set(self.main_conference_proposals)
 
        speaker_tickets.products.set([self.ticket_speaker, ])
 

	
 
        # Speaker dinner tickets are for primary and secondary speakers
 
        # Speaker dinner tickets are for primary speakers only
 
        speaker_dinner_tickets = self.find_or_make(
 
            cond.SpeakerFlag,
 
            ("description", ),
 
            description="Speaker dinner tickets",
 
            condition=cond.FlagBase.ENABLE_IF_TRUE,
 
            is_presenter=True,
 
            is_copresenter=True,
 
            is_copresenter=False,
 
        )
 
        speaker_dinner_tickets.proposal_kind.set(self.main_conference_proposals)
 
        speaker_dinner_tickets.categories.set([self.speakers_dinner_ticket, ])
 

	
 
        # PDNS tickets are complicated.
 
        # They can be enabled by tickets
 
        pdns_by_ticket = self.find_or_make(
 
            cond.ProductFlag,
 
            ("description", ),
 
            description="PDNS available by ticket",
 
            condition=cond.FlagBase.ENABLE_IF_TRUE,
 
        )
...
 
@@ -758,25 +761,25 @@ class Command(BaseCommand):
 
            ("description", ),
 
            description="Complimentary for ticket holder (Student-level)",
 
        )
 
        ticket_student_inclusions.enabling_products.set([
 
            self.ticket_student,
 
        ])
 
        free_category(ticket_student_inclusions, self.t_shirt)
 

	
 
        # Team ticket inclusions
 
        ticket_staff_inclusions = self.find_or_make(
 
            cond.IncludedProductDiscount,
 
            ("description", ),
 
            description="Complimentary for ticket holder staff)",
 
            description="Complimentary for ticket holder (Staff)",
 
        )
 
        ticket_staff_inclusions.enabling_products.set([
 
            self.ticket_team,
 
        ])
 
        free_category(ticket_staff_inclusions, self.penguin_dinner)
 

	
 
        # Team & volunteer shirts, regardless of ticket type
 
        staff_t_shirts = self.find_or_make(
 
            cond.GroupMemberDiscount,
 
            ("description", ),
 
            description="Shirts complimentary for staff and volunteers",
 
        )
pinaxcon/settings.py
Show inline comments
...
 
@@ -351,25 +351,25 @@ PROPOSAL_FORMS = {
 
    "glam-miniconf": "pinaxcon.proposals.forms.GlamProposalForm",
 
    "kernel-miniconf": "pinaxcon.proposals.forms.KernelProposalForm",
 
    "open-education-miniconf": "pinaxcon.proposals.forms.OpenEducationProposalForm",
 
    "open-hardware-miniconf": "pinaxcon.proposals.forms.OpenHardwareProposalForm",
 
    "open-isa-miniconf": "pinaxcon.proposals.forms.OpenIsaProposalForm",
 
    "security-miniconf": "pinaxcon.proposals.forms.SecurityProposalForm",
 
    "sysadmin-miniconf": "pinaxcon.proposals.forms.SysAdminProposalForm",
 
}
 

	
 
# Registrasion bits:
 
ATTENDEE_PROFILE_MODEL = "pinaxcon.registrasion.models.AttendeeProfile"
 
ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm"
 
INVOICE_CURRENCY = "NZD"
 
INVOICE_CURRENCY = "AUD"
 
TICKET_PRODUCT_CATEGORY = 1
 
TERMS_PRODUCT_CATEGORY = 2
 
ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm"
 

	
 
#REGIDESK
 
REGIDESK_BOARDING_GROUP = "Ready For Boarding"
 

	
 
# CSRF custom error screen
 
CSRF_FAILURE_VIEW = "pinaxcon.csrf_view.csrf_failure"
 

	
 
# Use nose to run all tests
 
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
...
 
@@ -537,23 +537,23 @@ PENGUIN_DINNER_CHILD = PenguinDinnerCat.create(
 
PENGUIN_DINNER_INFANT = PenguinDinnerCat.create(
 
    "Infant", Decimal("0.0"),
 
    "Includes no food or beverage service.",
 
    timedelta(hours=1))
 

	
 
SPEAKERS_DINNER = SpeakersDinnerCat
 

	
 
SPEAKERS_DINNER_ADULT = SpeakersDinnerCat.create(
 
    "Adult", Decimal("100.00"),
 
    "Includes an adult's meal and full beverage service.",
 
    timedelta(hours=1))
 

	
 
SPEAKERS_DINNER_CHILD = SpeakersDinnerCat.create(
 
    "Child", Decimal("60.00"),
 
    "Children 14 and under. "
 
    "Includes a child's meal and soft drink service.",
 
    timedelta(hours=1))
 

	
 
SPEAKERS_DINNER_INFANT = SpeakersDinnerCat.create(
 
    "Infant", Decimal("00.00"),
 
    "Infant must be seated in an adult's lap. "
 
    "No food or beverage service.",
 
    timedelta(hours=1))
 
# SPEAKERS_DINNER_CHILD = SpeakersDinnerCat.create(
 
#     "Child", Decimal("60.00"),
 
#     "Children 14 and under. "
 
#     "Includes a child's meal and soft drink service.",
 
#     timedelta(hours=1))
 

	
 
# SPEAKERS_DINNER_INFANT = SpeakersDinnerCat.create(
 
#     "Infant", Decimal("00.00"),
 
#     "Infant must be seated in an adult's lap. "
 
#     "No food or beverage service.",
 
#     timedelta(hours=1))
pinaxcon/templates/_form_snippet.html
Show inline comments
 
{% load lca2018_tags %}
 
{% load lca2019_tags %}
 
{% load bootstrap %}
 
{% load crispy_forms_tags %}
 

	
 
{% if form.non_field_errors %}
 
  <div class="has-errors">
 
    {{ form.non_field_errors }}
 
  </div>
 
  <br/>
 
{% endif %}
 

	
 
<p>
 
{% if form|has_required_fields %}
 
<blockquote>
 
  Fields marked with a * are required
 
</blockquote>
 
Fields marked with a * are required.
 
{% endif %}
 
{% if form|has_price_fields %}
 
<strong>Item prices are before any discount.</strong>
 
{% endif %}
 
</p>
 

	
 
{{ form|crispy }}
pinaxcon/templates/registrasion/_invoice_details.html
Show inline comments
 
{% load registrasion_tags %}
 
{% load lca2018_tags %}
 

	
 
<h2>Tax Invoice/Statement</h2>
 
<h3>Linux Australia</h3>
 
<h4>GST #90-792-369</h4>
 
<h4>ABN 56 987 117 479</h4>
 

	
 
<p>
 
  Enquiries: please e-mail <a href="mailto:contact@lca2019.org">contact@lca2019.org</a>
 
  Enquiries: please e-mail <a href="mailto:contact@lca2020.linux.org.au">contact@lca2020.linux.org.au</a>
 
</p>
 

	
 
<ul class="list-unstyled">
 
  <li><strong>Invoice number:</strong> {{ invoice.id }}
 
  <li><strong>Invoice status:</strong> {{ invoice.get_status_display }}</li>
 
  <li><strong>Issue date:</strong> {{ invoice.issue_time|date:"DATE_FORMAT" }}
 
  {% if not invoice.is_void %}
 
    <li><strong>Due:</strong> {{ invoice.due_time|date:"DATETIME_FORMAT"}}</li>
 
  {% endif %}
 
</ul>
 

	
 
<div>
 
<h4>Attention:</h4>
 
  {{ invoice.recipient|linebreaksbr}}
 
</div>
 

	
 
<p>This invoice has been issued as a result of an application to attend {% conference_name %}. All amounts are in New Zealand Dollars (NZD).</p>
 
<p>This invoice has been issued as a result of an application to attend {% conference_name %}. All amounts are in Australian Dollars (AUD).</p>
 

	
 
<table class="table table-striped my-4">
 
  <thead>
 
    <tr>
 
      <th>Description</th>
 
      <th class="text-right">Quantity</th>
 
      <th class="text-right">Price/Unit</th>
 
      <th class="text-right">Total</th>
 
    </tr>
 
  </thead>
 
  <tbody>
 
    {% for line_item in invoice.lineitem_set.all %}
 
      <tr>
 
        <td>{{ line_item.description }}</td>
 
        <td class="text-right">{{ line_item.quantity }}</td>
 
        <td class="text-right">${{ line_item.price }}</td>
 
        <td class="text-right">${{ line_item.total_price }}</td>
 
      </tr>
 
    {% endfor %}
 

	
 
    <tr><th colspan="4"></th></tr>
 

	
 
    <tr>
 
      <th colspan="3">Includes 15% New Zealand Goods and Services Tax</th>
 
      <th colspan="3">Includes 10% Australian Goods and Services Tax</th>
 
      <td class="text-right">${{ invoice.value|gst}}</td>
 
    </tr>
 

	
 
    <tr>
 
      <th colspan="3">Total</th>
 
      <td class="text-right">${{ invoice.value }}</td>
 
    </tr>
 

	
 
    <tr><th colspan="4"></th></tr>
 

	
 
    <tr>
 
      <th colspan="3">Total payments received:</th>
...
 
@@ -78,14 +78,13 @@
 
{% endif %}
 

	
 

	
 
<hr />
 

	
 
<p>{% conference_name %} is a project of Linux Australia, Inc.</p>
 

	
 
<p>
 
  GPO Box 4788 <br />
 
  Sydney NSW 2001 <br />
 
  Australia <br />
 
  ABN 56 987 117 479 <br />
 
  NZ GST #90-792-369
 
<p>
pinaxcon/templates/registrasion/base.html
Show inline comments
 
{% extends "utility_page.html" %}
 
{% extends "site_base.html" %}
 
{% load staticfiles %}
 
{% load lca2018_tags %}
 
{% load i18n %}
 

	
 
{% block head_title %}{% block page_title %}{% endblock %}{% endblock %}
 

	
 
{% block utility_body %}
 
  {% block proposals_body %}
 
  {% endblock %}
 
{% block content_base %}
 
{% block content %}
 
  <div class="jumbotron rego-content">
 
    {% block proposals_body %}
 
    {% endblock %}
 
  </div>
 
{% endblock content %}
 
{% endblock %}
 

	
pinaxcon/templates/registrasion/discount_list.html
Show inline comments
 
{% if discounts %}
 
<div class="my-4 py-4 px-4">
 
  <h4>Discounts and Complimentary Items</h4>
 
  <p>The following discounts and complimentary items are available to you. If you wish to take advantage of this offer, you must choose your items below. The discounts will be applied automatically when you check out.</p>
 
<div class="alert alert-danger my-4 pb-4 text-center">
 
  <h4 class="alert-heading">Discounts and Complimentary Items</h4>
 
  <p>The following discounts and complimentary items are available to you:</p>
 
  {% regroup discounts by discount.description as discounts_grouped %}
 
  <ul class="d-inline-block text-left">
 
  {% for discount_type in discounts_grouped %}
 
  <strong>{{ discount_type.grouper }}</strong>
 
  <ul>
 
    {% for discount in discount_type.list %}
 
    <li>{{ discount.quantity }} &times; {{ discount.clause }}</li>
 
    {% endfor %}
 
  </ul>
 
    <li>
 
      <strong>{{ discount_type.grouper }}</strong>
 
      <ul>
 
        {% for discount in discount_type.list %}
 
        <li>{{ discount.quantity }} &times; {{ discount.clause }}</li>
 
        {% endfor %}
 
      </ul>
 
    </li>
 
  {% endfor %}
 
  </ul>
 
  <p>
 
    <strong>
 
    Please ensure you enter a value in the form below to take advantage of this discount.<br>
 
    The discounts will be applied automatically when you check out.
 
    </strong>
 
  </p>
 
  <p class="mb-0">
 
    <strong>
 
    If you do not enter anything, you will not receive anything from this category.
 
    </strong>
 
  </p>
 
</div>
 

	
 
{% endif %}
pinaxcon/templates/registrasion/guided_registration.html
Show inline comments
 
{% extends "registrasion/base.html" %}
 
{% load lca2018_tags %}
 

	
 
{% block header_title %}Buy Your Ticket{% endblock %}
 
{% block header_paragraph %}Step {{ current_step }} of {{ total_steps|add:1 }} &ndash; {{ title }} {% endblock %}
 
{% block page_title %}Buy Your Ticket{% endblock %}
 
{% block page_lead %}Step {{ current_step }} of {{ total_steps|add:1 }} &ndash; {{ title }} {% endblock %}
 

	
 
{% block scripts_extra %}
 
  {% for section in sections %}
 
    {{ section.form.media.js }}
 
  {% endfor %}
 
<script type="text/javascript">
 
  <script type="text/javascript">
 
    postcode_label = $("label[for='id_profile-state']");
 
    postcode_help = $("#id_profile-state + p");
 
      $('#id_profile-country').change(function () {
 
        if ($(this).val() == 'AU' )  {
 
          postcode_label.addClass('label-required');
 
          postcode_help.show();
 
        } else {
 
          postcode_label.removeClass('label-required');
 
          postcode_help.hide();
 
        } });
 
        $("#id_profile-country").change();
 

	
 
      </script>
 

	
 
  </script>
 
{% endblock %}
 

	
 
{% block proposals_body %}
 

	
 
  <form class="form-horizontal" method="POST" action="" enctype="multipart/form-data">
 
    {% csrf_token %}
 

	
 
    {% for section in sections %}
 
    <h2>{{ section.title }}</h2>
 

	
 
    {% if section.description %}
 
    <blockquote>{{ section.description|safe }}</blockquote>
 
    {% endif %}
 

	
 
    <fieldset>
 
        {% if section.discounts %}
 
          {% include "registrasion/discount_list.html" with discounts=section.discounts %}
 
        {% endif %}
 
      {% if section.discounts %}
 
        {% include "registrasion/discount_list.html" with discounts=section.discounts %}
 
      {% endif %}
 

	
 
        {% include "_form_snippet.html" with form=section.form %}
 
      {% include "_form_snippet.html" with form=section.form %}
 

	
 
        <br />
 
      </fieldset>
 
        {% endfor %}
 
      <br />
 
    </fieldset>
 
    {% endfor %}
 

	
 
      {% if current_step > 1 %}
 
      <a class="btn btn-primary" role="button" href="{{ previous_step }}">Back</a>
 
      {% endif %}
 
      <input class="btn btn-primary" type="submit" value="Next Step" />
 
    {% if current_step > 1 %}
 
    <a class="btn btn-secondary" role="button" href="{{ previous_step }}">Back</a>
 
    {% endif %}
 
    <input class="btn btn-primary" type="submit" value="Next Step" />
 
  </form>
 

	
 

	
 
{% endblock %}
pinaxcon/templates/registrasion/invoice.html
Show inline comments
 
{% extends "registrasion/base.html" %}
 
{% load registrasion_tags %}
 
{% load lca2018_tags %}
 
{% load staticfiles %}
 

	
 
{% block header_title %}{% conference_name %}{% endblock %}
 
{% block head_title %}Tax Invoice/Statement #{{ invoice.id }}{% endblock %}
 
{% block page_title %}{% conference_name %}{% endblock %}
 

	
 
{% block proposals_body %}
 
{% include "registrasion/_invoice_details.html" %}
 
<div class="hidden-print mb-4 pb-4">
 
<div class="d-print-none mb-4 pb-4">
 
  {% if invoice.is_unpaid %}
 
  <p>
 
    <strong>NOTICE:</strong> The above invoice is automatically generated, and
 
    will be voided if you amend your selections before payment, or if discounts
 
    or products contained in the invoice become unavailable. The products and
 
    discounts are only reserved until the invoice due time, please pay before then
 
    to guarantee your selection. Late payments are accepted only if the products
 
    and discounts are still available.</p>
 

	
 
  {% url "invoice_access" invoice.user.attendee.access_code as access_url %}
 
  <p>Your most recent unpaid invoice will be available at
 
    <a href="{{ access_url }}">{{ request.scheme }}://{{ request.get_host }}{{ access_url }}</a>
 
    You can print that page for your records, or give this URL to your accounts department to pay for this invoice
 
  </p>
 

	
 
  <a class="btn btn-primary" href='{% url "registripe_card" invoice.id invoice.user.attendee.access_code %}'>Pay this invoice by card</a>
 

	
 
  {% if user.is_staff %}
 
  <a class="btn btn-primary" href="{% url "manual_payment" invoice.id %}">Apply manual payment</a>
 
  <a class="btn btn-secondary" href="{% url "manual_payment" invoice.id %}">Apply manual payment</a>
 
  {% endif %}
 

	
 
  {% elif invoice.is_paid %}
 
  {% if user.is_staff %}
 
  <a class="btn btn-default" href="{% url "manual_payment" invoice.id %}">Apply manual payment/refund</a>
 
  <a class="btn btn-default" href="{% url "refund" invoice.id %}">Refund by issuing credit note</a>
 
  {% endif %}
 
{% endif %}
 
</div>
 

	
 

	
 

	
 
{% endblock %}
pinaxcon/templates/registrasion/product_category.html
Show inline comments
 
{% extends "registrasion/base.html" %}
 
{% load registrasion_tags %}
 
{% load lca2018_tags %}
 

	
 
{% block header_title %}Product Category: {{ category.name }}{% endblock %}
 
{% block header_inset_image %}{% illustration "lavender.svg" %}{% endblock %}
 
{% block page_title %}Product Category: {{ category.name }}{% endblock %}
 

	
 
{% block scripts_extra %}
 
  {{ voucher_form.media.js }}
 
  {{ form.media.js }}
 

	
 

	
 
{% endblock %}
 

	
 
{% block proposals_body %}
 

	
 

	
 
  <form class="form-horizontal my-4" method="post" action="">
 
    {% csrf_token %}
 

	
 

	
 
    <div class="vertical-bigger"></div>
 

	
 
    {% items_purchased category as items %}
 
    {% if items %}
 
      <h3>Paid items</h3>
 
      <p>You have already paid for the following items:</p>
 
      {% include "registrasion/_items_list.html" with items=items %}
 

	
 
    {% endif %}
 

	
 

	
 
    <h1>{{ category.name }}</h1>
 
    <h2>{{ category.name }}</h2>
 
    <blockquote>{{ category.description|safe }}</blockquote>
 

	
 
    <fieldset>
 
      {% if discounts %}
 
        {% include "registrasion/discount_list.html" with discounts=discounts %}
 
      {% endif %}
 

	
 
      <h2>Make a selection</h2>
 
      <h3>Make a selection</h3>
 
      {% include "_form_snippet.html" with form=form %}
 

	
 
      <br />
 
      <div class="btn-group">
 
          <input class="btn btn-primary" type="submit" value="Add to cart" />
 
          <a href="{% url "dashboard" %}" class="btn btn-default">Return to dashboard</a>
 
      </div>
 
      <input class="btn btn-primary" type="submit" value="Add to cart" />
 
      <a href="{% url "dashboard" %}" class="btn btn-link">Return to dashboard</a>
 
    </fieldset>
 
  </form>
 

	
 

	
 
{% endblock %}
pinaxcon/templates/registrasion/review.html
Show inline comments
 
{% extends "registrasion/base.html" %}
 
{% load registrasion_tags %}
 
{% load lca2018_tags %}
 

	
 
{% block header_title %}Review your selection{% endblock %}
 
{% block header_inset_image %}{% illustration "wineglass.svg" %}{% endblock %}
 
{% block header_paragraph %}
 
{% block page_title %}Review your selection{% endblock %}
 
{% block page_lead %}
 
  Please ensure that you have selected all of the products you require, including
 
  t-shirts and social event tickets.
 
{% endblock %}
 

	
 
{% block scripts_extra %}
 
  {{ voucher_form.media.js }}
 
  {{ form.media.js }}
 
{% endblock %}
 

	
 

	
 
{% block proposals_body %}
 
  <h1 class="mb-4">Order Review</h1>
 

	
 
  {% items_pending as pending %}
 
  {% if pending %}
 
  <div class="my-4">
 
    <h2>Current selection</h2>
 
    <p>You've selected the following items, which will be in your invoice when
 
      you check out:<p>
 
    <p>You've selected the following items, which will be in your invoice when you check out:<p>
 
    {% include "registrasion/_items_list.html" with items=pending %}
 
  </div>
 
  {% endif %}
 

	
 
  {% items_purchased as purchased %}
 
  {% if purchased %}
 
  <div class="my-4">
 
    <h2>Previously purchased</h2>
 
    <p>You've already paid for the following items:</p>
 
    {% include "registrasion/_items_list.html" with items=purchased suffix="<em>(PAID)</em>" %}
 
  </div>
 
  {% endif %}
 

	
 
  <div class="my-4">
 
    <h2>Modify your selection</h2>
 
    <p>
 

	
 
    {% missing_categories as missing %}
 
    {% if missing %}
 
        <strong>You have <em>not</em> selected anything from the following
 
          categories. If your ticket includes any of these, you still need to
 
          make a selection:
 
        </strong>
 
    <div class="alert alert-warning my-4 pb-4">
 
      <h4 class="alert-heading">You have empty categories</h4>
 
      <p>You have <em>not</em> selected anything from the following
 
        categories. If your ticket includes any of these, you still need to
 
        make a selection:
 
      </p>
 

	
 
      {% include "registrasion/_category_list.html" with categories=missing %}
 
      {% endif %}
 
    </p>
 
    </div>
 
    {% endif %}
 

	
 
    <p>
 
      <strong>You can also change your selection from these categories:</strong>
 
      <strong>You can change your selection from these categories:</strong>
 
      {% available_categories as available %}
 
      {% include "registrasion/_category_list.html" with categories=available exclude=missing %}
 
    </p>
 
  </div>
 

	
 
  <div class="my-4">
 
    <h2>Voucher</h2>
 
    <p>If you have been given a voucher, please <a id="voucher-form-button" href="{% url "voucher_code" %}">enter your voucher code</a> now.
 
    </p>
 
  </div>
 

	
 

	
 
  <div class="my-4">
 
    <h2>What next?</h2>
 
    {% if pending %}
 
    <p>You can either check out an invoice and pay for your selections, or return to
 
        the dashboard.</p>
 

	
 
    <a class="btn btn-primary" href="{% url "checkout" %}">
 
      <i class="fa fa-credit-card"></i> Check out and pay
 
    </a>
 

	
 
    <a class="btn btn-light" href="{% url "dashboard" %}">Return to dashboard</a>
 

	
 
    {% else %}
 

	
 
    <p>You have no items that need to be paid.</p>
 

	
 
    <div class="form-actions">
 
      <a class="btn btn-light" href="{% url "dashboard" %}">Return to dashboard</a>
 
    </div>
 

	
 
    {% endif %}
 
  </div>
 

	
 

	
 

	
 
{% endblock %}
pinaxcon/templates/registrasion/stripe/credit_card_payment.html
Show inline comments
...
 
@@ -54,25 +54,25 @@
 
        $form = $form.append($('<input type="hidden" name="stripe_token" />').val(token));
 

	
 
        // Submit the form:
 

	
 
        $form.get(0).submit();
 
        $form.append($('<p>').text("Processing your payment. Please do not refresh."));
 
      }
 
    };
 
  </script>
 

	
 
{% endblock %}
 

	
 
{% block header_title %}Credit card payment for invoice #{{ invoice.id}}{% endblock %}
 
{% block page_title %}Credit card payment for invoice #{{ invoice.id}}{% endblock %}
 

	
 

	
 
{% block proposals_body %}
 
<p>Pay for your linux.conf.au attendance with your Visa, Mastercard, or American Express credit or debit card. Card payments are processed by <a href="https://stripe.com">Stripe</a>.</p>
 

	
 
  <p>
 
    No data on this form is retained by {% conference_name %}, rather it is
 
    sent to Stripe. In particular, credit card details are not sent
 
    to linux.conf.au. You must allow JavaScript from <code>js.stripe.com</code> and <code>stripe.network</code> to complete payment.
 
  </p>
 

	
 
  <p>You have <strong>${{ invoice.balance_due }}</strong> remaining to pay on this invoice.</p>
pinaxcon/templates/site_base.html
Show inline comments
...
 
@@ -22,45 +22,47 @@
 
  {% block styles %}
 
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous">
 
  <link href="{% sass_src 'scss/app.scss' %}" rel="stylesheet" type="text/css" />
 
  {% block extra_style %}{% endblock %}
 
  {% endblock %}
 

	
 
  {% block extra_head_base %}
 
  {% block extra_head %}{% endblock %}
 
  {% endblock %}
 
</head>
 
<body class="{% block body_class %}{% endblock %}">
 
  {% block template_overrides %}{% endblock %}
 
  <header class="clearfix hidden-print">
 
  <header class="clearfix d-print-none">
 
    {% block alert %}{% endblock %}
 
    {% block navbar %}{% include 'nav.html' %}{% endblock %}
 
  </header>
 

	
 
  {% if messages %}
 
  <div class="container my-5 alert alert-primary">
 
    <ul class="messagelist hidden-print list-unstyled">
 
    <ul class="messagelist d-print-none list-unstyled">
 
      {% for message in messages %}
 
      <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
 
      {% endfor %}
 
    </ul>
 
  </div>
 
  {% endif %}
 

	
 
  <main role="main" class="{% block main_class %}container{% endblock %}">
 
    <h1 class="page-title mb-5">{% block page_title %}{% endblock %}</h1>
 
    <div class="page-header mb-5">
 
      <h1 class="page-title">{% block page_title %}{% endblock %}</h1>
 
      <p class="lead">{% block page_lead %}{% endblock %}</p>
 
    </div>
 

	
 
    {% block body_base %}
 
    {% block body_out %}
 

	
 
    <div class="row">
 
      <div class="col-md-12">
 
        {% block body_outer %}
 
        {% endblock %}
 
      </div>
 
    </div>
 
    {% block content %}
 
    {% endblock %}
 
    {% endblock %}
 
    {% endblock %}
 

	
 
    {% block footer_base %}
...
 
@@ -89,25 +91,25 @@
 
    {% endif %}
 
    {% block extra_script %}
 
    {% endblock %}
 
    {% block scripts_extra %}{% endblock %}
 
    {% endblock %}
 

	
 
    {% block extra_body_base %}
 
    {% block extra_body %}
 
    {% endblock %}
 
    {% endblock %}
 
  </main>
 

	
 
  <footer class="footer mt-4">
 
  <footer class="footer mt-4 d-print-none">
 
    <div class="container py-4">
 
      <div class="row">
 
        <div class="col-md-4 pb-4">
 
          <strong>linux.conf.au 2020</strong> <br>
 
          Jan 13-17 2020 <br>
 
          Gold Coast, Australia <br>
 
          <a href="mailto:contact@lca2020.linux.org.au" alt="Email"><i class="far fa-envelope"></i></a>&nbsp;&nbsp;
 
          <a href="https://twitter.com/linuxconfau" alt="Twitter"><i class="fab fa-twitter"></i></a>&nbsp;&nbsp;
 
          <a href="https://www.facebook.com/linuxconferenceaustralia/" alt="Facebook"><i class="fab fa-facebook"></i></a>
 
        </div>
 
        <div class="col-md-4 pb-4 text-center">
 
          <img src="{% static 'lca/lca_horiz_colour.svg' %}" alt="linux.conf.au logo" class="footer-logo">
pinaxcon/templates/symposion/dashboard/_categories.html
Show inline comments
...
 
@@ -21,38 +21,39 @@
 
  </div>
 
</div>
 
{% endif %}
 

	
 
<div class="mb-4">
 
  <div class="row">
 
    <div class="col-12">
 
      <h2>{% trans "Attend" %} {% conference_name %}</h2>
 
    </div>
 
  </div>
 
</div>
 

	
 
{% if not user.attendee.completed_registration %}
 
<div class="mb-4">
 
  <div class="row">
 
    {% if not user.attendee.completed_registration %}
 
    <div class="col-12">
 
      <h3>Register</h3>
 
      <p>To attend the conference, you must create an attendee profile and purchase your ticket</p>
 
      <div class="mt-auto">
 
        <a class="btn btn-primary" role="button" href="{% url "guided_registration" %}">Get your ticket</a>
 
        <a class="btn btn-lg btn-primary" role="button" href="{% url "guided_registration" %}">Get your ticket</a>
 
      </div>
 
    </div>
 
    </div>
 
  </div>
 
</div>
 
    {% else %}
 
{% else %}
 
<div class="mb-4">
 
  <div class="row">
 
    <div class="col-md-6 my-3 d-flex flex-column">
 
      <h3>Attendee Profile</h3>
 
      <p>If you would like to change the details on your badge or your attendee statistics, you may edit your attendee profile here.</p>
 
      <div class="mt-auto">
 
        <a class="btn btn-lg btn-primary" role="button" href="{% url "attendee_edit" %}">Edit attendee profile</a>
 
      </div>
 
    </div>
 
    <div class="col-md-6 my-3 d-flex flex-column">
 
      <h3>Account Management</h3>
 
      <p>If you would like to change your registered email address or password, you can use our self-service account management portal</p>
 
      <div class="mt-auto">
 
        <a class="btn btn-lg btn-primary" role="button" href="https://login.linux.conf.au/manage/">Account Management</a>
...
 
@@ -101,30 +102,32 @@
 
          <a href="{% url "invoice" invoice.id %}" >Invoice {{ invoice.id }}</a> - ${{ invoice.value }} ({{ invoice.get_status_display }})
 
        </li>
 
        {% endfor %}
 
      </ul>
 
      {% if invoices|any_is_void %}
 
      <div class="mt-auto">
 
        <button id="toggle-void-invoices" onclick="toggleVoidInvoices();" class="btn btn-lg btn-default">Show void invoices</button>
 
      </div>
 
      {% endif %}
 
    </div>
 
    {% endif %}
 

	
 
    {% if false %}
 
    <div class="col-md-6 my-3 d-flex flex-column">
 
      <h4>Raffle Tickets</h4>
 

	
 
      <p><a href="/raffle/tickets/">View all my raffle tickets</a></p>
 
      {# REMOVE HARDCODED CATEGORY NUMBER!!!! #}
 
      <p><a href="/tickets/category/8">Buy raffle tickets</a></p>
 
    </div>
 
    {% endif %}
 

	
 
    {% available_credit as credit %}
 
    {% if credit %}
 
    <div class="col-md-6 my-3 d-flex flex-column">
 
      <h4>Credit</h4>
 
      <p>You have ${{ credit }} leftover from refunded invoices. This credit will be automatically applied to new invoices. Contact the conference organisers to for a refund to your original payment source.</p>
 
    </div>
 
    {% endif %}
 
  </div>
 
</div>
 
{% endif %} {# user.attendee.completed_registration #}
pinaxcon/templates/utility_page.html
Show inline comments
 
{% extends "content_page.html" %}
 
{% load staticfiles %}
 

	
 
{% block header_title %}{% block page_title %}{% endblock %}{% endblock %}
 
{% block head_title %}{% block page_title %}{% endblock %}{% endblock %}
 

	
 
{% block content_base %}
 
  {% block utility_body_outer %}
 
    <div class="l-content-page">
 
      <div class="l-content-page--richtext">
 
        {% block content %}
 
          <div class="jumbotron">
 
            {% block utility_body %}
 
            {% endblock %}
 
          </div>
 
        {% endblock content %}
 
      </div>
pinaxcon/templatetags/lca2019_tags.py
Show inline comments
...
 
@@ -8,37 +8,58 @@ register = template.Library()
 

	
 
@register.filter
 
def has_required_fields(form):
 
    for field in form:
 
        if isinstance(field, Form):
 
            if has_required_fields(field):
 
                return True
 
        if field.field.required:
 
            return True
 
    return False
 

	
 

	
 
@register.filter
 
def has_price_fields(form):
 
    for field in form:
 
        if isinstance(field, Form):
 
            return has_price_fields(field)
 

	
 
        if '$' in field.field.help_text:
 
            return True
 

	
 
        if '$' in field.field.label:
 
            return True
 

	
 
        choices = getattr(field.field, 'choices', [])
 
        if choices:
 
            for choice_id, choice_text in choices:
 
                if '$' in choice_text:
 
                    return True
 

	
 
    return False
 

	
 

	
 
@register.filter
 
def any_is_void(invoices):
 
    for invoice in invoices:
 
        if invoice.is_void:
 
            return True
 
    return False
 

	
 

	
 
@register.simple_tag
 
def listlookup(lookup, target):
 
    try:
 
        return lookup[target]
 
    except IndexError:
 
        return ''
 

	
 

	
 
@register.filter
 
def clean_text(txt):
 
    # Remove double/triple/+ spaces from `txt` and replace with single space
 
    return re.sub(r' {2,}' , ' ', txt)
 

	
 
@register.filter
 
def twitter_handle(txt):
 
    # Add @ to twitter handle if not present
 
    return txt if txt.startswith('@') else '@{}'.format(txt)
...
 
\ No newline at end of file
 
    return txt if txt.startswith('@') else '@{}'.format(txt)
static/src/scss/app.scss
Show inline comments
...
 
@@ -52,24 +52,31 @@ h3, .h3 {
 
.footer {
 
    border-top: 1px rgb(0, 177, 197) solid;
 
}
 

	
 
.footer-logo {
 
    height: 70px;
 
}
 

	
 
.footer-image {
 
    height: 50px;
 
}
 

	
 
.rego-content {
 
    border: 1px solid #000;
 
    background-color: #fff;
 
}
 

	
 
/* END LCA2020 */
 

	
 
.messagelist {
 
    margin-bottom: 0;
 
}
 

	
 
.asteriskField:before { content: ' '; }
 

	
 
label.label-required:after { content: ' *'; }
 

	
 
.abstract, .bio, .monospace-text {
 
    font-family: Hack, monospace;
 
    white-space: pre-wrap;
 
}
...
 
\ No newline at end of file
 
}
vendor/registrasion/registrasion/views.py
Show inline comments
...
 
@@ -336,26 +336,26 @@ def _guided_registration_products(request, mode):
 
def _guided_registration_profile_and_voucher(request):
 
    voucher_form, voucher_handled = _handle_voucher(request, "voucher")
 
    profile_form, profile_handled = _handle_profile(request, "profile")
 

	
 
    voucher_section = GuidedRegistrationSection(
 
        title="Voucher Code",
 
        form=voucher_form,
 
    )
 

	
 
    profile_section = GuidedRegistrationSection(
 
        title="Profile and Personal Information",
 
        form=profile_form,
 
        description=("<div class=\"text-info\"><em>You can come back and edit these details any time before January 15, "
 
                     "2018.</em></div>"),
 
        description=("<div class=\"text-info\"><em>You can come back and edit these details any time before "
 
                     "January 6 2020.</em></div>"),
 
    )
 

	
 
    return [voucher_section, profile_section]
 

	
 

	
 
@login_required
 
def review(request):
 
    ''' View for the review page. '''
 

	
 
    return render(
 
        request,
 
        "registrasion/review.html",
0 comments (0 inline, 0 general)