Compare commits

...

10 commits

Author SHA1 Message Date
Joel Addison
c4766d9198 Fix raffle ticket display on checkin 2023-03-14 21:23:51 +11:00
Joel Addison
96cf72e970 Update checkin details
Add flags for sections on the checkin page so they can be switched
on and off as required.
Display the number of raffle tickets purchased by the attendees.
2023-03-14 17:19:15 +11:00
Joel Addison
aeacf7f8a8 Update checking camera switcher
Fix camera selection using correct ID value.
Adjust column layout for mobile devices.
2023-03-14 12:01:02 +11:00
Joel Addison
e83dafef90 Add camera selector to checkin page
Allow the camera to be selected so tablets can use the
rear camera as well as the front camera.
2023-03-14 09:29:39 +11:00
Joel Addison
420974154a Update checkin page
Display penguin dinner tickets.
Hide Venueless information panel.
2023-03-14 07:39:53 +11:00
Joel Addison
bea1998043 Fix login URL 2023-03-07 02:43:57 +00:00
Joel Addison
00f074c152 Pin django-countries to fix dependency issue 2023-02-11 14:09:28 +10:00
Joel Addison
630f50c452 Update attendee profile
Remove reference to Open Hardware kit as this is not happening in 2023.
Set lca_announce field to default of False given field is hidden.
2023-02-11 14:09:03 +10:00
Joel Addison
6bd1ab9f8f Update conference references 2022-12-09 00:23:59 +10:00
Joel Addison
f5eabe0aa3 Update wording for sessions 2022-12-09 00:20:40 +10:00
11 changed files with 112 additions and 32 deletions

View file

@ -91,9 +91,9 @@ class AttendeeProfile(rego.AttendeeProfileBase):
max_length=64,
verbose_name="Free text line 1",
help_text="A line of free text that will appear on your badge. Use "
"this for your Twitter handle, IRC nick, your preferred "
"pronouns or anything else you'd like people to see on "
"your badge.",
"this for your Mastodon or Twitter handle, IRC nick, "
"your preferred pronouns or anything else you'd like people "
"to see on your badge.",
blank=True,
)
free_text_2 = models.CharField(
@ -114,9 +114,7 @@ class AttendeeProfile(rego.AttendeeProfileBase):
address_line_1 = models.CharField(
verbose_name="Address line 1",
help_text="This address, if provided, will appear on your invoices. "
"It is also where we will ship your Open Hardware Kit "
"if you are allocated one.",
help_text="This address, if provided, will appear on your invoices.",
max_length=1024,
blank=True,
)
@ -195,6 +193,7 @@ class AttendeeProfile(rego.AttendeeProfileBase):
help_text="Select to be subscribed to the low-traffic lca-announce "
"mailing list",
blank=True,
default=False,
)
lca_chat = models.BooleanField(

View file

@ -67,12 +67,12 @@
{% 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>Pay your invoice 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.
to Linux Australia. 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>

View file

@ -131,7 +131,7 @@
<a href="mailto:{{ settings.CONFERENCE_EMAIL }}" alt="Email"><i class="far fa-envelope"></i></a>&nbsp;&nbsp;<a
href="https://twitter.com/_everythingopen" 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>&nbsp;&nbsp;<a
href="https://www.facebook.com/EverythingOpenConference" alt="Facebook"><i class="fab fa-facebook"></i></a>&nbsp;&nbsp;<a
href="https://www.linkedin.com/showcase/everythingopen/" alt="LinkedIn"><i class="fab fa-linkedin"></i></a>
</div>
<div class="col-md-4 pb-4 text-center">

View file

@ -72,7 +72,7 @@
<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>
<a class="btn btn-primary" role="button" href="https://login.everythingopen.au/manage/">Account Management</a>
<a class="btn btn-primary" role="button" href="https://login.linux.conf.au/manage/">Account Management</a>
</div>
</div>
</div>

View file

@ -1,6 +1,6 @@
<h3>New Proposal</h3>
<p>Click one of the following links to create a speaking or miniconf proposal.</p>
<p>Once submitted you will be able to see the status of your proposals, as well manage the submission and co-speakers from this page</p>
<p>Click one of the following links to create a session proposal.</p>
<p>Once submitted you will be able to see the status of your proposals, as well manage the submission and co-speakers from this page.</p>
<div>
{% for kind in proposal_kinds %}
<a class="btn btn-outline-primary mb-2" href="{% url "proposal_submit_kind" kind.slug %}">{{ kind }}</a>

View file

@ -1,14 +1,13 @@
<h3>Speaker Profile</h3>
{% if not user.speaker_profile %}
<p>
To create a speaking or miniconf proposal you must first create a speaker
profile.
To create a session proposal you must first create a speaker profile.
</p>
{% endif %}
<p>
Your speaker profile is independent of your attendee profile and the
details you provide here will be used during selection and to populate
your speaker bio on the conference website.
Your speaker profile is independent of your attendee profile.
The details you provide here will be used during the session selection process,
and to populate your speaker bio on the conference website.
</p>
<div>
{% if not user.speaker_profile %}

View file

@ -3,7 +3,7 @@
<div class="row">
<div class="col-12">
<h2 class="mb-3">{% trans "Speaking and Miniconfs" %}</h2>
<h2 class="mb-3">{% trans "Speaking and Sessions" %}</h2>
</div>
</div>

View file

@ -12,7 +12,7 @@
{% with timetable|day_has_tracks:timetable.day as has_tracks %}
{% if has_tracks %}
<tr>
<th scope="row" class="time"><em>Miniconf</em></th>
<th scope="row" class="time"><em>Track</em></th>
{% for room in timetable.rooms %}
{% with room|trackname:timetable.day as track_name %}
<th scope="column" class="track-name">{% if track_name %}<p>{{ track_name }}</p>{% endif %}</th>

View file

@ -39,7 +39,7 @@ CairoSVG==2.4.2
PyJWT==2.0.0
# Registripe
django-countries>=6.1.3
django-countries==7.3.2
pinax-stripe==4.4.0
requests==2.24.0
stripe==2.55.0

View file

@ -18,12 +18,17 @@
<div class="row">
<div class="col-6">
<div class="col-lg-6">
<p><strong id="note"></strong></p>
<video id="preview"" autoplay style=" height: 400px;"></video>
<p>Select camera:</p>
<ul id="camera-list" class="list-group">
<li class="list-group-item active" aria-current="true">No camera found</li>
</ul>
</div>
<div class="col-6">
<div class="col-lg-6">
<div id="code_div" class="form-group has-feedback has-error">
<label class="control-label" for="bpcode">Boarding Pass Code</label>
<input id="bptext" type="text" class="form-control" id="bpcode" placeholder="Code">
@ -43,6 +48,9 @@
<script type="text/javascript">
let scanner = new Instascan.Scanner({ video: document.getElementById('preview') });
let activeCameraId = null;
let availableCameras = [];
scanner.addListener('scan', function (content) {
// This should ensure we start with the lca base domain. However, I don't have the time for this
// considering we have quite a few domains right now.
@ -57,9 +65,66 @@
}
});
function startCamera(cameras) { scanner.start(cameras[0]); }
function startCamera(cameras) {
// Update available cameras.
availableCameras = cameras;
// Display the cameras on the page.
let cameraList = document.getElementById('camera-list');
cameraList.innerHTML = "";
for (let i = 0; i < cameras.length; ++i) {
let camera = cameras[i];
let cameraItem = document.createElement('li');
cameraItem.textContent = formatCameraName(camera.name);
cameraItem.setAttribute('data-cameraid', camera.id);
let classNames = "list-group-item";
if (i == 0) {
classNames = classNames + " active";
}
cameraItem.className = classNames;
cameraItem.addEventListener("click", (event) => {
selectCamera(cameraItem);
let activeCameras = cameraList.getElementsByClassName("active");
for (let j = 0; j < activeCameras.length; ++j) {
let newClassNames = activeCameras[j].className.replace(" active", "");
activeCameras[j].className = newClassNames;
}
cameraItem.className = cameraItem.className + " active";
});
cameraList.appendChild(cameraItem);
}
scanner.start(cameras[0]);
}
function errorCamera(error) { console.error(e); }
function formatCameraName(name) {
return name || '(unknown)';
}
function selectCamera(cameraItem) {
let cameraId = cameraItem.dataset.cameraid;
// Find the camera in the list.
let camera = null;
for (let i = 0; i < availableCameras.length; ++i) {
if (availableCameras[i].id === cameraId) {
camera = availableCameras[i];
break;
}
}
scanner.start(camera);
}
Instascan.Camera.getCameras().then(startCamera).catch(errorCamera);
</script>

View file

@ -6,13 +6,16 @@
{% block body %}
{% load registrasion_tags %}
{% load lca2018_tags %}
{% load waffle_tags %}
{% items_purchased as purchased %}
{% items_pending as pending %}
{% items_purchased 1 as ticket %}
<!-- {% items_purchased 6 as shirts %} -->
<!-- {% total_items_purchased 3 as penguin_dinner_count %} -->
{% total_items_purchased 3 as penguin_dinner_count %}
<!-- {% total_items_purchased 4 as speakers_dinner_count %} -->
<!-- {% total_items_purchased 5 as pdns_count %} -->
{% items_purchased 5 as raffle_tickets %}
{% ticket_type as ticket_type %}
<a type="button" class="btn btn-outline-primary" href="{% url 'regidesk:check_in_scanner' %}">Return to scanning page</a>
@ -36,10 +39,10 @@
<dt class="col-sm-3">Free Text 2</dt>
<dd class="col-sm-9">{{ user.attendee.attendeeprofilebase.attendeeprofile.free_text_2 }}</dd>
{% comment "Not needed for EO2023" %}
<dt class="col-sm-3">Penguin Dinner Tickets</dt>
<dd class="col-sm-9">{{ penguin_dinner_count }}</dd>
{% comment "Not needed for EO2023" %}
<dt class="col-sm-3">Speaker Dinner Tickets</dt>
<dd class="col-sm-9">{{ speakers_dinner_count }}</dd>
@ -54,7 +57,7 @@
<dd class="col-sm-9">{{ user.username }}</dd>
</dl>
{% comment "Not needed for EO2023" %}
{% flag "checkin_shirts" %}
<h4>Shirts ordered</h4>
<table class="table card-text">
{% for shirt in shirts%}
@ -64,10 +67,23 @@
</tr>
{% endfor %}
</table>
{% endcomment %}
{% endflag %}
{% flag "checkin_raffle" %}
<h4>Raffle Tickets</h4>
<table class="table card-text">
{% for raffle in raffle_tickets %}
<tr>
<td>{{ raffle.product }}</td>
<td>{{ raffle.quantity }}</td>
</tr>
{% endfor %}
</table>
{% endflag %}
</div>
</div>
{% flag "checkin_venueless" %}
<div class="card my-3">
<div class="card-header">Venueless</div>
<div class="card-body">
@ -83,6 +99,7 @@
</dl>
</div>
</div>
{% endflag %}
<div class="card my-3">
<div class="card-header">Badge Preview</div>
@ -128,7 +145,7 @@
</div>
</div>
{% comment "Not needed for EO2023" %}
{% flag "checkin_schwag" %}
<div class="card {% if check_in.schwag_given %}border-success{% else %}border-danger{% endif %} my-3">
<div class="card-header {% if check_in.schwag_given %}text-white bg-success{% endif %}">Schwag</div>
<div class="card-body">
@ -142,7 +159,7 @@
</form>
</div>
</div>
{% endcomment %}
{% endflag %}
<div class="card my-3">
<div class="card-header">Log Exception</div>
@ -155,7 +172,7 @@
</div>
</div>
{% comment "Not needed for EO2023" %}
{% flag "checkin_bulk" %}
<div class="card my-3 {% if check_in.checked_in_bool and check_in.schwag_given %}border-success{% elif check_in.checked_in_bool or check_in.schwag_given %}card-warning{% else %}card-danger{% endif %}">
<div class="card-header {% if check_in.checked_in_bool and check_in.schwag_given %}text-white bg-success{% elif check_in.checked_in_bool or check_in.schwag_given %}bg-warning{% endif %}">Bulk actions</div>
<div class="card-body">
@ -176,7 +193,7 @@
</form>
</div>
</div>
{% endcomment %}
{% endflag %}
<a type="button" class="btn btn-outline-primary" href="{% url 'regidesk:check_in_scanner' %}">Return to scanning page</a>