From d8ea9e6bd16c79853d401258ba8463b506584cd7 Mon Sep 17 00:00:00 2001 From: Ed Date: Sun, 18 Dec 2022 17:40:39 +0100 Subject: [PATCH] Initial commit --- app.py | 113 ++++++++++++++++++ config.py | 1 + ext.py | 126 +++++++++++++++++++ res/avatar.jpg | Bin 0 -> 99567 bytes res/new.png | Bin 0 -> 3735 bytes room.py | 279 +++++++++++++++++++++++++++++++++++++++++++ tpl/base.html | 21 ++++ tpl/create_room.html | 22 ++++ tpl/error.html | 8 ++ tpl/manage.html | 97 +++++++++++++++ tpl/welcome.html | 228 +++++++++++++++++++++++++++++++++++ 11 files changed, 895 insertions(+) create mode 100644 app.py create mode 100644 config.py create mode 100644 ext.py create mode 100644 res/avatar.jpg create mode 100644 res/new.png create mode 100644 room.py create mode 100644 tpl/base.html create mode 100644 tpl/create_room.html create mode 100644 tpl/error.html create mode 100644 tpl/manage.html create mode 100644 tpl/welcome.html diff --git a/app.py b/app.py new file mode 100644 index 0000000..606b609 --- /dev/null +++ b/app.py @@ -0,0 +1,113 @@ +from sanic import Sanic, response, exceptions +from sanic.response import text, html, redirect, raw +from jinja2 import Environment, FileSystemLoader +from time import time +import httpx +import re +import json +from ext import * +from config import * + +app = Sanic(__name__) +app.static("/res", "res/") + +app.ext.add_dependency(Order, get_order) +app.ext.add_dependency(Quotas, get_quotas) + +from room import bp as room_bp + +app.blueprint([room_bp,]) + +@app.exception(exceptions.SanicException) +async def clear_session(request, exception): + tpl = app.ctx.tpl.get_template('error.html') + response = html(tpl.render(exception=exception)) + + if exception.status_code == 403: + del response.cookies["foxo_code"] + del response.cookies["foxo_secret"] + return response + +@app.before_server_start +async def main_start(*_): + print(">>>>>> main_start <<<<<<") + app.ctx.tpl = Environment(loader=FileSystemLoader("tpl"), autoescape=True) + app.ctx.tpl.globals.update(time=time) + app.ctx.tpl.globals.update(int=int) + app.ctx.tpl.globals.update(len=len) + +@app.route("/furizon/beyond/order///open/") +async def redirect_explore(request, code, secret, order: Order, secret2=None): + + response = redirect(app.url_for("welcome")) + if order and order.code != code: order = None + + if not order: + async with httpx.AsyncClient() as client: + res = await client.get(f"https://reg.furizon.net/api/v1/organizers/furizon/events/beyond/orders/{code}/", headers=headers) + if res.status_code != 200: + raise exceptions.NotFound("This order code does not exist. Check that your order wasn't deleted, or the link is correct.") + + res = res.json() + if secret != res['secret']: + raise exceptions.Forbidden("The secret part of the url is not correct. Check your E-Mail for the correct link, or contact support!") + response.cookies['foxo_code'] = code + response.cookies['foxo_secret'] = secret + return response + +@app.route("/manage/welcome") +async def welcome(request, order: Order, quota: Quotas): + + if not order: + raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!") + + pending_roommates = [] + if order.pending_roommates: + print('Oleee') + print(order.ans('pending_roommates')) + for pr in order.pending_roommates: + if not pr: continue + print(pr) + pending_roommates.append(await get_order(code=pr, insecure=True)) + + print(pending_roommates) + + room_members = [] + if order.room_id: + if order.room_id != order.code: + room_owner = await get_order(code=order.room_id, insecure=True) + else: + room_owner = order + + room_members.append(room_owner) + + for member_id in room_owner.ans('room_members').split(','): + if member_id == room_owner.code: continue + if member_id == order.code: + room_members.append(order) + else: + room_members.append(await get_order(code=member_id, insecure=True)) + + tpl = app.ctx.tpl.get_template('welcome.html') + return html(tpl.render(order=order, quota=quota, room_members=room_members, pending_roommates=pending_roommates)) + + +@app.route("/manage/download_ticket") +async def download_ticket(request, order: Order, quota: Quotas): + + if not order: + raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!") + + if not order.status != 'confirmed': + raise exceptions.Forbidden("You are not allowed to download this ticket.") + + async with httpx.AsyncClient() as client: + res = await client.get(f"https://reg.furizon.net/api/v1/organizers/furizon/events/beyond/orders/{order.code}/download/pdf/", headers=headers) + if res.status_code != 200: + raise exceptions.FileNotFound("Your ticket hasn't been generated yet. Please try later!") + + return raw(res.content, content_type='application/pdf') + print(res.content) + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=8188, dev=True) diff --git a/config.py b/config.py new file mode 100644 index 0000000..17fa113 --- /dev/null +++ b/config.py @@ -0,0 +1 @@ +headers = {'Authorization': 'Token 2q5h7a2z9tqfz8ogu0qpriclwufelswc7obapw1mq2l1b4zaos7ebpz424zvz5gv'} diff --git a/ext.py b/ext.py new file mode 100644 index 0000000..8cfc1ec --- /dev/null +++ b/ext.py @@ -0,0 +1,126 @@ +from dataclasses import dataclass +from sanic import Request, exceptions +import httpx +import re +from config import * + +@dataclass +class Order: + def __init__(self, data): + self.data = data + self.status = {'n': 'pending', 'p': 'paid', 'e': 'expired', 'c': 'canceled'}[self.data['status']] + self.code = data['code'] + + for p in self.data['positions']: + if p['item'] not in [16, 38]: + continue + + self.position_id = p['id'] + self.position_positionid = p['positionid'] + self.answers = p['answers'] + + self.name = self.ans('fursona_name') + self.room_id = self.ans('room_id') + self.room_confirmed = self.ans('room_confirmed') + self.pending_room = self.ans('pending_room') + self.pending_roommates = self.ans('pending_roommates').split(',') if self.ans('pending_roommates') else [] + self.room_members = self.ans('room_members').split(',') if self.ans('room_members') else [] + self.room_owner = (self.code == self.room_id) + self.room_secret = self.ans('room_secret') + + def __getitem__(self, var): + return self.data[var] + + def ans(self, name): + for a in self.answers: + if a['question_identifier'] == name: + if a['answer'] in ['True', 'False']: + return bool(a['answer'] == 'True') + return a['answer'] + return None + + async def edit_answer(self, name, new_answer): + found = False + for key in range(len(self.answers)): + if self.answers[key]['question_identifier'] == name: + if new_answer != None: + print('EXISTING ANSWER UPDATE', name, '=>', new_answer) + self.answers[key]['answer'] = new_answer + found = True + else: + print('DEL ANSWER', name, '=>', new_answer) + del self.answers[key] + + break + + if (not found) and (new_answer is not None): + + async with httpx.AsyncClient() as client: + res = await client.get('https://reg.furizon.net/api/v1/organizers/furizon/events/beyond/questions/', headers=headers) + res = res.json() + + for r in res['results']: + if r['identifier'] != name: continue + + print('ANSWER UPDATE', name, '=>', new_answer) + self.answers.append({ + 'question': r['id'], + 'answer': new_answer, + 'question_identifier': r['identifier'], + 'options': r['options'] + }) + + async def send_answers(self): + async with httpx.AsyncClient() as client: + res = await client.patch(f'https://reg.furizon.net/api/v1/organizers/furizon/events/beyond/orderpositions/{self.position_id}/', headers=headers, json={'answers': self.answers}) + +@dataclass +class Quotas: + def __init__(self, data): + self.data = data + self.capacity_mapping = { + 1: 16, + 2: 17, + 3: 18, + 4: 19, + 5: 20 + } + + def get_left(self, capacity): + for quota in self.data['results']: + if quota['id'] == self.capacity_mapping[capacity]: + return quota['available_number'] + +async def get_quotas(request: Request=None): + async with httpx.AsyncClient() as client: + res = await client.get(f"https://reg.furizon.net/api/v1/organizers/furizon/events/beyond/quotas/?order=id&with_availability=true", headers=headers) + res = res.json() + + return Quotas(res) + +async def get_order(request: Request=None, code=None, secret=None, insecure=False): + if request: + await request.receive_body() + code = request.cookies.get("foxo_code") + secret = request.cookies.get("foxo_secret") + + if re.match('^[A-Z0-9]{5}$', code or '') and (secret is None or re.match('^[a-z0-9]{16,}$', secret)): + print('Trying to get a session from stored', code, secret) + async with httpx.AsyncClient() as client: + res = await client.get(f"https://reg.furizon.net/api/v1/organizers/furizon/events/beyond/orders/{code}/", headers=headers) + if res.status_code != 200: + if request: + raise exceptions.Forbidden("Your session has expired due to order deletion or change! Please check your E-Mail for more info.") + + res = res.json() + + if res['status'] in ['c', 'e']: + if request: + raise exceptions.Forbidden(f"Your order has been deleted. Contact support with your order identifier ({res['code']}) for further info.") + + if secret == res['secret'] or insecure: + return Order(res) + else: + if request: + raise exceptions.Forbidden("Your session has expired due to a token change. Please check your E-Mail for an updated link!") + return None diff --git a/res/avatar.jpg b/res/avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79716d6b9936152048f06c215ae0f33c24d14630 GIT binary patch literal 99567 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 E0Ch0Sz5oCK literal 0 HcmV?d00001 diff --git a/res/new.png b/res/new.png new file mode 100644 index 0000000000000000000000000000000000000000..9fe8e46450da44a3639e669b996f87338edc02ba GIT binary patch literal 3735 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 literal 0 HcmV?d00001 diff --git a/room.py b/room.py new file mode 100644 index 0000000..a1efb2e --- /dev/null +++ b/room.py @@ -0,0 +1,279 @@ +from sanic.response import html, redirect, text +from sanic import Blueprint, exceptions +from random import choice +from ext import * +from config import headers + +bp = Blueprint("room", url_prefix="/manage/room") + +@bp.post("/create") +async def room_create_post(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!") + + error = None + name = request.form.get('name') + + if len(name) > 64 or len(name) < 4: + error = "Your room name is invalid. Please try another one." + + if order.room_id: + error = "You are already in another room. You need to delete (if it's yours) or leave it before creating another." + + if not error: + await order.edit_answer('room_name', name) + await order.edit_answer('room_id', order.code) + await order.edit_answer('room_members', order.code) + await order.edit_answer('room_secret', ''.join(choice('0123456789') for _ in range(6))) + await order.send_answers() + return redirect('/manage/welcome') + + tpl = request.app.ctx.tpl.get_template('create_room.html') + return html(tpl.render(order=order, error=error)) + +@bp.route("/create") +async def room_create(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!") + + tpl = request.app.ctx.tpl.get_template('create_room.html') + return html(tpl.render(order=order)) + +@bp.route("/delete") +async def delete_room(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!") + + if order.room_id != order.code: + raise exceptions.BadRequest("You are not allowed to delete room of others.") + + if order.ans('room_confirmed'): + raise exceptions.BadRequest("You are not allowed to change your room after it has been confirmed.") + + if len(order.room_members) > 1: + raise exceptions.BadRequest("You can only delete a room once there is nobody else inside.") + + await order.edit_answer('room_name', None) + await order.edit_answer('room_id', None) + await order.edit_answer('room_members', None) + await order.edit_answer('room_secret', None) + await order.send_answers() + return redirect('/manage/welcome') + +@bp.post("/join") +async def join_room(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!") + + if order.pending_room: + raise exceptions.BadRequest("There is already a pending join request. Wait for the room owner to accept or refuse it.") + + if order.room_id: + raise exceptions.BadRequest("You are in another room already. Why would you join another?") + + code = request.form.get('code').strip() + room_secret = request.form.get('room_secret').strip() + + if (not code) or (not room_secret): + raise exceptions.BadRequest("The code or pin you provided are not valid.") + + room_owner = await get_order(code=code, insecure=True) + + if not room_owner: + raise exceptions.BadRequest("The code you provided is not valid.") + + if room_owner.room_secret != room_secret: + raise exceptions.BadRequest("The code or pin you provided is not valid.") + + if room_owner.room_confirmed: + raise exceptions.BadRequest("The room you're trying to join has been confirmed already") + + #if room_owner.pending_roommates and (order.code in room_owner.pending_roommates): + #raise exceptions.BadRequest("What? You should never reach this check, but whatever...") + + await order.edit_answer('pending_room', code) + await order.send_answers() + + pending_roommates = room_owner.pending_roommates + if not order.code in pending_roommates: + pending_roommates.append(order.code) + + await room_owner.edit_answer('pending_roommates', ','.join(pending_roommates)) + await room_owner.send_answers() + + return redirect('/manage/welcome') + +@bp.route("/kick/") +async def kick_member(request, code, order: Order): + if not order: + raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!") + + if order.room_confirmed: + raise exceptions.BadRequest("You cannot kick people out of confirmed rooms") + + if not order.room_owner: + raise exceptions.BadRequest("You cannot kick people if you're not the room owner") + + to_kick = await get_order(code=code, insecure=True) + if to_kick.room_id != order.code: + raise exceptions.BadRequest("You cannot kick people of other rooms") + + await to_kick.edit_answer('room_id', None) + await order.edit_answer('room_members', ','.join([x for x in order.room_members if x != to_kick.code]) or None) + + await order.send_answers() + await to_kick.send_answers() + + return redirect('/manage/welcome') + +@bp.route("/renew_secret") +async def renew_secret(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!") + + if not order.room_id: + raise exceptions.BadRequest("What room were you even trying to renew?") + + if not order.room_owner: + raise exceptions.BadRequest("You are not allowed to renew rooms of others.") + + await order.edit_answer('room_secret', ''.join(choice('0123456789') for _ in range(6))) + await order.send_answers() + return redirect('/manage/welcome') + +@bp.route("/cancel_request") +async def renew_secret(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!") + + if not order.pending_room: + raise exceptions.BadRequest("There is no pending room.") + + room_owner = await get_order(code=order.pending_room, insecure=True) + pending_roommates = room_owner.pending_roommates + if order.code in pending_roommates: + pending_roommates.remove(order.code) + await room_owner.edit_answer('pending_roommates', ','.join(pending_roommates) if pending_roommates else None) + await room_owner.send_answers() + + await order.edit_answer('pending_room', None) + await order.send_answers() + return redirect('/manage/welcome') + +@bp.route("/approve/") +async def reject_roomreq(request, code, order: Order): + if not order: + raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!") + + if not code in order.pending_roommates: + raise exceptions.BadRequest("You cannot accept people that didn't request to join your room") + + if order.room_confirmed: + raise exceptions.BadRequest("You cannot accept people to a confirmed room.") + + pending_member = await get_order(code=code, insecure=True) + + if pending_member.room_id: + raise exceptions.BadRequest("You cannot accept people who are in a room.") + + if pending_member.pending_room != order.code: + raise exceptions.BadRequest("You cannot accept people who are in another room or waiting to accept another request.") + + await pending_member.edit_answer('room_id', order.code) + await pending_member.edit_answer('pending_room', None) + + await order.edit_answer('room_members', ','.join([*order.room_members, pending_member.code])) + await order.edit_answer('pending_roommates', (','.join([x for x in order.pending_roommates if x != pending_member.code]) or None)) + + await pending_member.send_answers() + await order.send_answers() + + return redirect('/manage/welcome') + +@bp.route("/reject/") +async def reject_roomreq(request, code, order: Order): + if not order: + raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!") + + if not code in order.pending_roommates: + raise exceptions.BadRequest("You cannot reject people that didn't request to join your room") + + if order.room_confirmed: + raise exceptions.BadRequest("You cannot reject people to a confirmed room.") + + pending_member = await get_order(code=code, insecure=True) + + if pending_member.room_id: + raise exceptions.BadRequest("You cannot reject people who are in a room.") + + if pending_member.pending_room != order.code: + raise exceptions.BadRequest("You cannot reject people who are in another room or waiting to accept another request.") + + await pending_member.edit_answer('pending_room', None) + await order.edit_answer('pending_roommates', (','.join([x for x in order.pending_roommates if x != pending_member.code]) or None)) + + await pending_member.send_answers() + await order.send_answers() + + return redirect('/manage/welcome') + +@bp.route("/confirm") +async def confirm_room(request, order: Order, quotas: Quotas): + if not order: + raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!") + + if not order.room_id: + raise exceptions.BadRequest("Try joining a room before confirming it.") + + if order.room_id != order.code: + raise exceptions.BadRequest("You are not allowed to confirm rooms of others.") + + if quotas.get_left(len(order.room_members)) == 0: + raise exceptions.BadRequest("There are no more rooms of this size to reserve.") + + room_members = [] + for m in order.room_members: + if m == order.code: + res = order + else: + res = await get_order(code=m, insecure=True) + + if res.room_id != order.code: + raise exceptions.BadRequest("Please contact support: some of the members in your room are actually somewhere else") + + if res.status != 'paid': + raise exceptions.BadRequest("Somebody hasn't paid.") + + room_members.append(res) + + for rm in room_members: + await rm.edit_answer('room_id', order.code) + await rm.edit_answer('room_confirmed', "True") + await rm.edit_answer('pending_roommates', None) + await rm.edit_answer('pending_room', None) + + print(room_members) + print(len(room_members)) + + thing = { + 'order': order.code, + 'addon_to': order.position_positionid, + 'item': 39, + 'variation': ([None, 16, 17, 18, 19, 20])[len(room_members)] + } + + async with httpx.AsyncClient() as client: + res = await client.post("https://reg.furizon.net/api/v1/organizers/furizon/events/beyond/orderpositions/", headers=headers, json=thing) + + print(thing) + print(res.json()) + + print(res.status_code) + + if res.status_code != 201: + raise exceptions.BadRequest("Something has gone wrong! Please contact support immediately") + + for rm in room_members: + await rm.send_answers() + + return redirect('/manage/welcome') diff --git a/tpl/base.html b/tpl/base.html new file mode 100644 index 0000000..1a2a971 --- /dev/null +++ b/tpl/base.html @@ -0,0 +1,21 @@ + + + + + {% block title %}{% endblock %} + + + + + {% block main %}{% endblock %} + + diff --git a/tpl/create_room.html b/tpl/create_room.html new file mode 100644 index 0000000..8b3ee3e --- /dev/null +++ b/tpl/create_room.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} +{% block title %}Welcome!{% endblock %} +{% block main %} + +
+
+

Create a new room

+
+ {% if error %} +

{{error}}

+ {% endif %} +

Give a name to your room. This name will be public and shown in the room list, so nothing offensive! :)

+
+ + + +
+
+ +{% endblock %} diff --git a/tpl/error.html b/tpl/error.html new file mode 100644 index 0000000..d75a946 --- /dev/null +++ b/tpl/error.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} +{% block title %}Error {{exception.status_code}}{% endblock %} +{% block main %} +
+

Oh no! Error {{exception.status_code}}

+

{{exception}}

+
+{% endblock %} diff --git a/tpl/manage.html b/tpl/manage.html new file mode 100644 index 0000000..8773d66 --- /dev/null +++ b/tpl/manage.html @@ -0,0 +1,97 @@ +{% extends "base.html" %} +{% block title %}Your Booking{% endblock %} +{% block main %} +
+
+

{{order.ans('fursona_name')}}'s booking

+
+ {% if order.status() == 'pending' %} +

⚠️ Your order is still pending. You will not be able to reserve a room. Check your payment status

+ {% endif %} + {% if not order.ans('propic') %} +

⚠️ You still haven't uploaded a profile pic. Upload one now

+ {% endif %} + +
+

Room Status: + {% if order.ans('room_confirmed') %} + {{order.ans('room_confirmed')}} + room confirmed

+

Your room is confirmed! Enjoy the convention :)

+ {% elif order.ans('room_members') %} + pending room +

You have a room, but it is not confirmed! Make sure all room owners have paid, then use the button below to reserve the room for two people.

+ +
Your room
+
+ {% set room = namespace(forbidden=false) %} + {% for person in roommate_orders %} +
+ +

{{person.ans('fursona_name')}}

+

{{person.ans('staff_title') if person.ans('staff_title') else ''}}{{' · Fursuiter' if person.ans('is_fursuiter') != 'No'}}

+

{{('UNPAID' if person.status() == 'pending')|safe}}

+
+ {% if person.status() != 'paid' %} + {% set room.forbidden = True %} + {% endif %} + {% endfor %} +
+ +
Available rooms
+ + + + + + + + + + + + + + + + + + + + + +
Single room{{room_qty[1]}} available
Double room{{room_qty[2]}} available
Triple room{{room_qty[3]}} available
Quadruple room{{room_qty[4]}} available
Quintuple room{{room_qty[5]}} available
+ + {% if room.forbidden %} +

Since at least one of your roommates still have a pending reservation, you will not be able to reserve a room for now.

+ + {% else %} + + {% endif %} + {% else %} + no room +

You currently don't have any room. If you don't create or join one within 42 days, 10 hours, 32 minutes, 13 seconds, we will assign you to a random one.

+
+
+ + +
+
+ {% endif %} + + +
+
+ + + +{% endblock %} diff --git a/tpl/welcome.html b/tpl/welcome.html new file mode 100644 index 0000000..fd57179 --- /dev/null +++ b/tpl/welcome.html @@ -0,0 +1,228 @@ +{% extends "base.html" %} +{% block title %}{{order.name}}'s Booking{% endblock %} +{% block main %} + +
+
+

{{order.name}}'s Booking

+
+ + +
+

Payment

+ {% if order.status == 'pending' %} +

⚠️ Your order is still pending due to incomplete payment. You will not be able to reserve a room for now. However, you will be able to create one with your friends and confirm it once all attendants have completed the order!

+

If you wish to change payment method, check payment instructions or complete a failed payment please access the payment area.

+ + {% elif order.status == 'paid' %} +

✅ Your order has been completed and approved! See you at furizon!

+ {% endif %} + + + + + + + + + +
Reference ID{{order.code}}
Order total{{order.data['total']}}€ by {{'Credit card' if order.data['payment_provider'] == 'stripe' else 'Bank Transfer'}}
+ {% if order.status == 'paid' %} +

Download ticket

+ {% else %} + + {% endif %} +
+ + +
+

Your room {% if room_members %}- {{room_members[0].ans('room_name')}}{% endif %}

+ + {# Show alert if room owner has wrong people inside #} + {% if order.room_owner and quota.get_left(len(room_members)) == 0 and (not order.room_confirmed) %} +

⚠️ Your room contains {{len(room_members)}} people inside, but sadly there are 0 rooms of this size available. Add or remove people until you reach the size of an available room.

+ {% endif %} + + {# Show alert if room was not confirmed #} + {% if order.room_id and not order.room_confirmed %} +

⚠️ Your room hasn't been confirmed yet. Unconfirmed rooms are subject to changes by the staff as we optimize for hotel capacity.

+ {% endif %} + + {# Show notice if the room is confirmed #} + {% if order.room_confirmed %} +

✅ Your room has been confirmed

+ {% endif %} + + {# Show roommates if room is set #} + {% if order.room_id %} +
+ {% set room = namespace(forbidden=false) %} + {% for person in room_members %} +
+ +

{{person.ans('fursona_name')}}

+ {% if person.code == order.room_id %}

ROOM OWNER

{% endif %} +

{{person.ans('staff_title') if person.ans('staff_title') else ''}}{{' · Fursuiter' if person.ans('is_fursuiter') != 'No'}}

+ {% if person.status == 'pending' %} +

UNPAID

+ {% else %} +

PAID

+ {% endif %} + {% if order.room_owner and person.code != order.code %}KICK{% endif %} +
+ + {% if person.status != 'paid' %} + {% set room.forbidden = True %} + {% endif %} + {% endfor %} + + {% if order.room_id == order.code and not order.room_confirmed and len(room_members) < 5 %} + + {% endif %} +
+ {% elif order.pending_room %} +

You have have asked to join the room of another member. Wait for them to confirm or reject your request.

+ Cancel pending join request + {% else %} +

🎲 If you don't join a room or create your one within the room deadline, we will randomly put you into a room with free spots.

+

To join a room, ask somebody to send you their room code.

+

+ Create a room + Join a room +

+ {% endif %} + + {% if order.room_owner %} + {% if quota.get_left(len(room_members)) == 0 %} +

⚠️ There are no more {{[None,'single','double','triple','quadruple','quintuple'][len(room_members)]}}, therefore you will not be able to confirm this room. Please add or remove people until you reach an available room.

+ {% elif room.forbidden %} +

⚠️ There are roommates who still didn't pay for the order, therefore you will not be able to confirm this room. Please ask them to pay or kick them out from your room.

+ {% endif %} + {% endif %} + + {% if order.room_owner %} +

+ {% if len(room_members) == 1 %} + Delete room + {% endif %} + + {% if not order.room_confirmed %} + 0 %}href="javascript:document.getElementById('modal-roomconfirm').setAttribute('open', 'true');"{% endif %}>Confirm {{[None,'single','double','triple','quadruple','quintuple'][len(room_members)]}} room + {% endif %} +

+ {% endif %} + + {# Pending roommates #} + {% if pending_roommates %} +

Pending roommates

+

These people have asked to join your room.

+ + {% for person in pending_roommates %} + + + + {% if person.status == 'pending' %} + + {% else %} + + {% endif %} + + + + + + {% if person.status != 'paid' %} + {% set room.forbidden = True %} + {% endif %} + {% endfor %} +
{{person.name}}UNPAIDPAIDApproveReject
+ {% endif %} + + {# Room availability is always shown #} +

Room availability

+ + {% for q in quota.data['results'] if 'Room' in q['name'] %} + + + + + {% endfor %} +
{{q['name']}}{{q['available_number']}} left
+
+ + {% if order.room_owner and not order.room_confirmed %} + + +
+ +

Invite your friends!

+ + + + +

Send your Ticket ID and room PIN to other attendants you want in your room.

+

If you want to change the room PIN, use the "Reset PIN" button to change the secret code.

+ +
+
+ + +
+ +

Confirm this room

+

Confirming the room is the only way to guarantee that you will stay with your friends.

+

Confirmed room cannot be changed. You will not be able to add or remove roommates, or change to another size.

+

In case somebody from your room decides to not participate, they will be replaced with a random person, or your room size will be changed.

+ +

Your room

+ + + + + + + + + +
Room type{{[None,'Single','Double','Triple','Quadruple','Quintuple'][len(room_members)]}} Room
Rooms left of this type{{quota.get_left(len(room_members))}}
+ +
+
+ + + {% endif %} + + + {% if not order.room_id %} +
+ +
+ +

Join a room!

+ + + + + +
+
+
+ {% endif %} + +{% endblock %}