Added carpooling function
This commit is contained in:
parent
3862f7b5fc
commit
2265778eb9
5
app.py
5
app.py
|
@ -21,8 +21,10 @@ from room import bp as room_bp
|
||||||
from propic import bp as propic_bp
|
from propic import bp as propic_bp
|
||||||
from export import bp as export_bp
|
from export import bp as export_bp
|
||||||
from stats import bp as stats_bp
|
from stats import bp as stats_bp
|
||||||
|
from api import bp as api_bp
|
||||||
|
from carpooling import bp as carpooling_bp
|
||||||
|
|
||||||
app.blueprint([room_bp,propic_bp,export_bp,stats_bp])
|
app.blueprint([room_bp, propic_bp, export_bp, stats_bp, api_bp, carpooling_bp])
|
||||||
|
|
||||||
@app.exception(exceptions.SanicException)
|
@app.exception(exceptions.SanicException)
|
||||||
async def clear_session(request, exception):
|
async def clear_session(request, exception):
|
||||||
|
@ -41,6 +43,7 @@ async def main_start(*_):
|
||||||
app.ctx.om = OrderManager()
|
app.ctx.om = OrderManager()
|
||||||
app.ctx.tpl = Environment(loader=FileSystemLoader("tpl"), autoescape=True)
|
app.ctx.tpl = Environment(loader=FileSystemLoader("tpl"), autoescape=True)
|
||||||
app.ctx.tpl.globals.update(time=time)
|
app.ctx.tpl.globals.update(time=time)
|
||||||
|
app.ctx.tpl.globals.update(PROPIC_DEADLINE=PROPIC_DEADLINE)
|
||||||
app.ctx.tpl.globals.update(int=int)
|
app.ctx.tpl.globals.update(int=int)
|
||||||
app.ctx.tpl.globals.update(len=len)
|
app.ctx.tpl.globals.update(len=len)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
from sanic.response import html, redirect, text
|
||||||
|
from sanic import Blueprint, exceptions
|
||||||
|
from random import choice
|
||||||
|
from ext import *
|
||||||
|
from config import headers
|
||||||
|
import json
|
||||||
|
|
||||||
|
bp = Blueprint("carpooling", url_prefix="/manage/carpooling")
|
||||||
|
|
||||||
|
@bp.get("/")
|
||||||
|
async def carpooling_list(request, order: Order, error=None):
|
||||||
|
if not order: raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!")
|
||||||
|
|
||||||
|
orders = [value for value in request.app.ctx.om.cache.values() if value.status not in ['c', 'e'] and value.carpooling_message]
|
||||||
|
print(orders)
|
||||||
|
|
||||||
|
tpl = request.app.ctx.tpl.get_template('carpooling.html')
|
||||||
|
|
||||||
|
return html(tpl.render(orders=orders, order=order, error=error))
|
||||||
|
|
||||||
|
@bp.post("/")
|
||||||
|
async def carpooling_update(request, order: Order):
|
||||||
|
if not order: raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!")
|
||||||
|
|
||||||
|
wants_carpool = request.form.get("wants_carpool")
|
||||||
|
error = None
|
||||||
|
if wants_carpool == 'on':
|
||||||
|
payload = {}
|
||||||
|
for field in ['from_location', 'offer_or_need', 'day_departure', 'message']:
|
||||||
|
val = request.form.get(field)
|
||||||
|
if not val:
|
||||||
|
error = f"One of the forms contains invalid values. ({field})"
|
||||||
|
elif len(val) > 64 and field != 'message':
|
||||||
|
error = "One of the forms contains too long values."
|
||||||
|
elif val not in ['offer', 'need'] and field == 'offer_or_need':
|
||||||
|
error = "Offer or need form is not valid!"
|
||||||
|
elif len(val) > 1000 and field == 'message':
|
||||||
|
error = "The message cannot be longer than 1000 characters!"
|
||||||
|
elif val.count("\n") > 4:
|
||||||
|
error = "Please do not use more than 4 line breaks!"
|
||||||
|
else:
|
||||||
|
payload[field] = val
|
||||||
|
|
||||||
|
order.carpooling_message = payload
|
||||||
|
if not error:
|
||||||
|
await order.edit_answer('carpooling_message', json.dumps(payload))
|
||||||
|
|
||||||
|
else:
|
||||||
|
order.carpooling_message = {}
|
||||||
|
await order.edit_answer('carpooling_message', '{}')
|
||||||
|
|
||||||
|
await order.send_answers()
|
||||||
|
|
||||||
|
return await carpooling_list(request, order=order, error=error)
|
|
@ -85,8 +85,11 @@
|
||||||
<a href="/manage/welcome">Your Booking</a>
|
<a href="/manage/welcome">Your Booking</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="/manage/nosecount">Nose Count</a>
|
<a href="/manage/nosecount">Nose Count</a>
|
||||||
<a href="/manage/stats">Stats</a>
|
|
||||||
{% if order %}
|
{% if order %}
|
||||||
|
<a href="/manage/carpooling">Carpooling</a>
|
||||||
|
{% if not order.room_confirmed %}
|
||||||
|
<a href="/manage/roommate_search">Roommate Search</a>
|
||||||
|
{% endif %}
|
||||||
<a style="float:right;" href="/manage/logout">Logout</a>
|
<a style="float:right;" href="/manage/logout">Logout</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{% block title %}Furizon 2023 Carpooling{% endblock %}
|
||||||
|
{% block main %}
|
||||||
|
<main class="container">
|
||||||
|
<header>
|
||||||
|
<picture>
|
||||||
|
<source srcset="/res/furizon.png" media="(prefers-color-scheme:dark)">
|
||||||
|
<img src="/res/furizon-light.png" style="height:4rem;text-align:center;">
|
||||||
|
</picture>
|
||||||
|
</header>
|
||||||
|
<p>Welcome to the carpooling page! Here you can see all of the available seats of other people attending the con. Use the form below to report if you want to offer a ride yourself or are looking for one!</p>
|
||||||
|
<form action="" method="post">
|
||||||
|
{% if error %}
|
||||||
|
<p class="notice">⚠️ {{error}}</p>
|
||||||
|
{% endif %}
|
||||||
|
<section>
|
||||||
|
<label for="switch"><input type="checkbox" id="wants_carpool" name="wants_carpool" role="switch" onchange="document.getElementById('tripform').style.display = this.checked?'initial':'none';" {{'checked' if order.carpooling_message else ''}}> I need to carpool</label>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div id="tripform" style="{{'display:none;' if not order.carpooling_message else ''}}">
|
||||||
|
<h3>Trip details</h3>
|
||||||
|
<div class="grid">
|
||||||
|
<label for="from_location">
|
||||||
|
Departure
|
||||||
|
<input type="text" id="from_location" name="from_location" placeholder="Example: Milan, Italy" value="{{order.carpooling_message.from_location}}" required>
|
||||||
|
</label>
|
||||||
|
<label for="to_location">
|
||||||
|
Arrival
|
||||||
|
<input type="text" id="to_location" name="to_location" value="Furizon, Cavalese" readonly>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Depending on this, show or hide the below form parts -->
|
||||||
|
<label for="offer_or_need">Are you offering or need a ride?</label>
|
||||||
|
<select name="offer_or_need" id="offer_or_need">
|
||||||
|
<option value="need" {{'selected' if order.carpooling_message.offer_or_need == 'need'}}>I'm looking for a ride</option>
|
||||||
|
<option value="offer" {{'selected' if order.carpooling_message.offer_or_need == 'need'}}>I'm offering a ride</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<label for="day_departure">
|
||||||
|
Day of departure
|
||||||
|
|
||||||
|
<select name="day_departure" id="day_departure">
|
||||||
|
<option value="m29th" {{'selected' if order.carpooling_message.day_departure == 'm29th'}}>May 29th</option>
|
||||||
|
<option value="m30th" {{'selected' if order.carpooling_message.day_departure == 'm30th'}}>May 30th</option>
|
||||||
|
<option value="m31st" {{'selected' if order.carpooling_message.day_departure == 'm31st'}}>May 31st</option>
|
||||||
|
<option value="j1st" {{'selected' if order.carpooling_message.day_departure == 'j1st'}}>June 1st</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<textarea id="message" name="message" style="height:10em;" placeholder="Write here your message" required>{{order.carpooling_message.message}}</textarea>
|
||||||
|
<small>Don't forget to write <strong>how you want to be contacted</strong>, how many seats are available, the estimated time of departure and what kind of baggage you allow. Also, perhaps time to plan the trip back?</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Button -->
|
||||||
|
<button type="submit">Save changes</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<hr />
|
||||||
|
{% if not orders %}
|
||||||
|
<p style="text-align:center;">Nobody sharing a trip yet :(<br />Check back later!</p>
|
||||||
|
{% endif %}
|
||||||
|
{% for o in orders %}
|
||||||
|
<blockquote>
|
||||||
|
<p style="margin-bottom:1em;"><strong>{{o.name}}</strong> {{'is offering' if o.carpooling_message.offer_or_need == 'offer' else 'needs'}} a trip from <strong>{{o.carpooling_message.from_location}}</strong> on the <strong>{{o.carpooling_message.day_departure[1:]}} of {{'May' if o.carpooling_message.day_departure[0] == 'm' else 'June'}}</strong>.</p>
|
||||||
|
<img class="propic propic-{{o.sponsorship}}" style="margin-top:0.5em;margin-right:1em;float:left;max-width:4em;" src="/res/propic/{{o.ans('propic') or 'default.png'}}" />
|
||||||
|
<span style="font-size:.8em;">{{o.carpooling_message.message}}</span>
|
||||||
|
<br clear="both" />
|
||||||
|
</blockquote>
|
||||||
|
{% endfor %}
|
||||||
|
</main>
|
||||||
|
{% endblock %}
|
|
@ -63,11 +63,6 @@
|
||||||
{% include 'blocks/payment.html' %}
|
{% include 'blocks/payment.html' %}
|
||||||
{% include 'blocks/room.html' %}
|
{% include 'blocks/room.html' %}
|
||||||
{% include 'blocks/badge.html' %}
|
{% include 'blocks/badge.html' %}
|
||||||
<!--<details id="security">
|
|
||||||
<summary role="button"><img src="/res/icons/lock.svg" class="icon" />Notifications & 2FA <span class="status">⚠️</span></summary>
|
|
||||||
<p>To receive updates and to keep your private area safer, you can associate your booking to your Telegram account.</p>
|
|
||||||
<a href="https://t.me/FurizonBot?start=aooooooooooo"><img style="display:block;margin:0 auto;" src="/res/icons/login_with_telegram.png" /></a>
|
|
||||||
</details>-->
|
|
||||||
|
|
||||||
<details id="barcard">
|
<details id="barcard">
|
||||||
<summary role="button"><img src="/res/icons/bar.svg" class="icon" />Barcard</summary>
|
<summary role="button"><img src="/res/icons/bar.svg" class="icon" />Barcard</summary>
|
||||||
|
@ -80,14 +75,13 @@
|
||||||
<p>If you want to find out where your friends are staying at the convention, just click this link to see a list of all attendees and their assigned rooms. You'll be able to see which rooms are already occupied and by whom, so you can easily plan meet-ups with your friends.</p>
|
<p>If you want to find out where your friends are staying at the convention, just click this link to see a list of all attendees and their assigned rooms. You'll be able to see which rooms are already occupied and by whom, so you can easily plan meet-ups with your friends.</p>
|
||||||
<a href="/manage/nosecount" role="button">Nose count</a>
|
<a href="/manage/nosecount" role="button">Nose count</a>
|
||||||
</details>
|
</details>
|
||||||
<!--<details id="stats">
|
|
||||||
<summary role="button"><img src="/res/icons/stats.svg" class="icon" />Statistics</summary>
|
<details id="carpooling">
|
||||||
<p>We know that furries love numbers and statistics, which is why we've added even more statistical tracking to this year's convention. Keep an eye out for updates on all the interesting data we'll be collecting throughout the event.</p>
|
<summary role="button"><img src="/res/icons/car.svg" class="icon" />Carpooling</summary>
|
||||||
<a href="/manage/statistics" role="button">See statistics</a>
|
<p>We want to make it easy for attendees to find and offer carpooling options. If you have seats available in your car, you can use our carpooling system to offer rides to other attendees. And if you need a ride, you can search for leftover seats in cars that are already heading to the convention. This is a great way to save money on gas and reduce your carbon footprint, while also getting to know other attendees and making new friends.</p>
|
||||||
</details>-->
|
<div class="grid"><a href="/manage/carpooling" role="button">Find or offer a trip</a></div>
|
||||||
<!--<details id="roommates">
|
</details>
|
||||||
<summary role="button"><img src="/res/icons/roommates.svg" class="icon" />Roommate search</summary>
|
|
||||||
</details>-->
|
|
||||||
<details id="telegram">
|
<details id="telegram">
|
||||||
<summary role="button"><img src="/res/icons/telegram.svg" class="icon" />Group Chat & Channels</summary>
|
<summary role="button"><img src="/res/icons/telegram.svg" class="icon" />Group Chat & Channels</summary>
|
||||||
<p>We encourage you to join these groups and participate in the conversations so you can stay in the loop and connect with other attendees. To join the groups, simply click on the links provided down below!</p>
|
<p>We encourage you to join these groups and participate in the conversations so you can stay in the loop and connect with other attendees. To join the groups, simply click on the links provided down below!</p>
|
||||||
|
@ -103,34 +97,6 @@
|
||||||
</table>
|
</table>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<!--
|
|
||||||
<details id="carpooling" open>
|
|
||||||
<summary role="button"><img src="/res/icons/car.svg" class="icon" />Carpooling</summary>
|
|
||||||
<p>We want to make it easy for attendees to find and offer carpooling options. If you have seats available in your car, you can use our carpooling system to offer rides to other attendees. And if you need a ride, you can search for leftover seats in cars that are already heading to the convention. This is a great way to save money on gas and reduce your carbon footprint, while also getting to know other attendees and making new friends.</p>
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td>Noticeboard</td>
|
|
||||||
<td><a href="https://t.me/APSFurizon">@APSFurizon</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Group Chat</td>
|
|
||||||
<td><a href="https://t.me/+H-vcfRyHQAxkODk8">https://t.me/+H-vcfRyHQAxkODk8</a></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<h2>All about the Convention</h2>
|
|
||||||
<details id="fursuiters">
|
|
||||||
<summary role="button"><img src="/res/icons/mask.svg" class="icon" />Services for Fursuiters</summary>
|
|
||||||
</details>
|
|
||||||
<details id="badge">
|
|
||||||
<summary role="button">Roommate search</summary>
|
|
||||||
</details>
|
|
||||||
<details id="badge">
|
|
||||||
<summary role="button">Group Chat & Summary</summary>
|
|
||||||
</details>
|
|
||||||
</main> -->
|
|
||||||
|
|
||||||
{% include 'blocks/room_extra.html' %}
|
{% include 'blocks/room_extra.html' %}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue