Changeset - 587a9a50643f
[Not reviewed]
default
0 3 0
Dennis Fink - 4 years ago 2021-07-01 20:35:01
dennis.fink@c3l.lu
Use flexbox layout and add qrcode for automatic data import into MeVeSc
3 files changed with 163 insertions and 65 deletions:
0 comments (0 inline, 0 general)
c3l_membership/static/pdf.css
Show inline comments
 
@@ -12,8 +12,6 @@ body {
 

	
 
img {
 
    width: 250px;
 
    margin-left: auto;
 
    margin-right: auto;
 
    display: block;
 
    margin-bottom: 1.5em;
 
}
 
@@ -28,23 +26,27 @@ p {
 
    margin-bottom: 1em;
 
}
 

	
 
dl {
 
    margin-top: 0;
 
    margin-bottom: 1em;
 
.logos {
 
    display: flex;
 
    justify-content: space-between;
 
    align-items: center;
 
}
 

	
 
dt {
 
    float: left;
 
    width: 360px;
 
    clear: left;
 
    text-align: left;
 
    font-weight: 700;
 
    margin-bottom: 1px;
 
.data {
 
    margin-top: 0;
 
    margin-bottom: 1em;
 
    display: flex;
 
    justify-content: space-between;
 
    flex-direction: column;
 
}
 

	
 
dd {
 
    margin-left: 240px;
 
    margin-bottom: 1px;
 
.data > div {
 
    display: flex;
 
    justify-content: space-between;
 
}
 

	
 
.data > div > div:first-child {
 
    font-weight: 700;
 
}
 

	
 
footer {
 
@@ -55,6 +57,10 @@ footer {
 
    width: 100%;
 
}
 

	
 
.signature {
 
    padding-top: 1em;
 
}
 

	
 
.membersignature {
 
    height: 2em;
 
    width: 45%;
 
@@ -81,20 +87,29 @@ footer {
 
    padding: 0;
 
}
 

	
 

	
 
.btccontainer {
 
    display: flex;
 
    justify-content: space-between;
 
}
 

	
 
.btctext {
 
    list-style-type: none;
 
    margin: 0;
 
    padding: 0;
 
    position: relative;
 
    float: left;
 
    width: 45%;
 
}
 

	
 
.btcqrcode {
 
    position: relative;
 
    float: left;
 
    width: 25%;
 
    padding-left: 10em;
 
    width: 10em;
 
}
 

	
 
.digicash {
 
    display: flex;
 
    justify-content: space-evenly;
 
}
 

	
 
.digicash img {
 
    width: 10em;
 
}
 

	
 
a {
c3l_membership/templates/member.html
Show inline comments
 
@@ -5,40 +5,77 @@
 
   <link rel="stylesheet" href="{{ url_for('static', filename='pdf.css') }}" />
 
  </head>
 
  <body>
 
    <div class="logos">
 
      <div>
 
    <img src="{{ url_for('static', filename='images/logo.png') }}"></img>
 
      </div>
 
      <div>
 
        <img src="{{ qrcode(xml|safe, border=1) }}"></img>
 
      </div>
 
    </div>
 
    <h1>Membership Application</h1>
 
    <dl>
 
      <dt>Username:</dt>
 
      <dd>{{ form.username.data }}</dd>
 
      <dt>E-Mail:</dt>
 
      <dd>{{ form.email.data }}</dd>
 
      <dt>Full Name:</dt>
 
      <dd>{{ form.fullname.data }}</dd>
 
      <dt>Birthday:</dt>
 
      <dd>{{ form.birthday.data }}</dd>
 
      <dt>Street:</dt>
 
      <dd>{{ form.street.data if form.street.data else "<i>Not specified</i>"|safe }}</dd>
 
      <dt>ZIP-Code:</dt>
 
      <dd>{{ form.zip.data if form.zip.data else "<i>Not specified</i>"|safe }}</dd>
 
      <dt>City:</dt>
 
      <dd>{{ form.city.data if form.city.data else "<i>Not specified</i>"|safe }}</dd>
 
      <dt>State/County/Province:</dt>
 
      <dd>{{ form.state.data if form.state.data else "<i>Not specified</i>"|safe }}</dd>
 
      <dt>Country:</dt>
 
      <dd>{{ form.country.data if form.country.data else "<i>Not specified</i>"|safe }}</dd>
 
      <dt>Membership Plan:</dt>
 
      <dd>{{ form.membership.data }}</dd>
 
      <dt>Student:</dt>
 
      <dd>{{ "Yes" if form.student.data else "No" }}</dd>
 
      <dt>Starving:</dt>
 
      <dd>{{ "Yes" if form.starving.data else "No" }}</dd>
 
      <dt>Payment:</dt>
 
      <dd>{{ form.payment.data }}</dd>
 
      <dt>Agreed to Terms &amp; Conditions:</dt>
 
      <dd>{{ "Yes" if form.terms.data else "No" }}</dd>
 
      <dt>Minor Member:</dt>
 
      <dd>{{ "Yes" if form.minor_member.data else "No" }}</dd>
 
    </dl>
 
    <div class="data">
 
      <div>
 
        <div>Username:</div>
 
        <div>{{ form.username.data }}</div>
 
      </div>
 
      <div>
 
        <div>E-Mail:</div>
 
        <div>{{ form.email.data }}</div>
 
      </div>
 
      <div>
 
        <div>Full Name:</div>
 
        <div>{{ form.fullname.data }}</div>
 
      </div>
 
      <div>
 
        <div>Birthday:</div>
 
        <div>{{ form.birthday.data }}</div>
 
      </div>
 
      <div>
 
        <div>Street:</div>
 
        <div>{{ form.street.data if form.street.data else "<i>Not specified</i>"|safe }}</div>
 
      </div>
 
      <div>
 
        <div>ZIP-Code:</div>
 
        <div>{{ form.zip.data if form.zip.data else "<i>Not specified</i>"|safe }}</div>
 
      </div>
 
      <div>
 
        <div>City:</div>
 
        <div>{{ form.city.data if form.city.data else "<i>Not specified</i>"|safe }}</div>
 
      </div>
 
      <div>
 
        <div>State/County/Province:</div>
 
        <div>{{ form.state.data if form.state.data else "<i>Not specified</i>"|safe }}</div>
 
      </div>
 
      <div>
 
        <div>Country:</div>
 
        <div>{{ form.country.data if form.country.data else "<i>Not specified</i>"|safe }}</div>
 
      </div>
 
      <div>
 
        <div>Membership Plan:</div>
 
        <div>{{ form.membership.data }}</div>
 
      </div>
 
      <div>
 
        <div>Student:</div>
 
        <div>{{ "Yes" if form.student.data else "No" }}</div>
 
      </div>
 
      <div>
 
        <div>Starving:</div>
 
        <div>{{ "Yes" if form.starving.data else "No" }}</div>
 
      </div>
 
      <div>
 
        <div>Payment:</div>
 
        <div>{{ form.payment.data }}</div>
 
      </div>
 
      <div>
 
        <div>Agreed to Terms &amp; Conditions:</div>
 
        <div>{{ "Yes" if form.terms.data else "No" }}</div>
 
      </div>
 
      <div>
 
        <div>Minor Member:</div>
 
        <div>{{ "Yes" if form.minor_member.data else "No" }}</div>
 
      </div>
 
    </div>
 
    <p>Send this document to the Chaos Computer Club Lëtzebuerg!</p>
 
    {% if form.payment.data == 'wire transfer' %}
 
      <ul class="bank">
 
@@ -51,34 +88,40 @@
 
    {% elif form.payment.data == 'cash' %}
 
      <p>Please bring {{ price }}€ with you the next time you meet us!</p>
 
    {% elif form.payment.data == 'bitcoin' %}
 
      <div class="btccontainer">
 
      <div>
 
          <ul class='btctext'>
 
          <ul class="btctext">
 
            <li><b>Address:</b> 3BV5UPToMUmXJiqUVndHjSSq2HqDW8npRd</li>
 
            <li><b>Label:</b> Membership Fee</li>
 
            <li><b>Message:</b> {{ year }} {{ form.username.data }}</li>
 
            <li><b>Amount:</b> {{ price }} BTC</li>
 
         </ul>
 
         {% set bitcoin_url= 'bitcoin:3BV5UPToMUmXJiqUVndHjSSq2HqDW8npRd?amount={amount}&label=Membership Fee {year} {username}&message=Membership Fee {year} {username}'.format(amount=price, year=year, username=form.username.data) %}
 
         <img class='btcqrcode' src="{{ qrcode(bitcoin_url) }}"></img>
 
        </div>
 
        {% set bitcoin_url="bitcoin:3BV5UPToMUmXJiqUVndHjSSq2HqDW8npRd?amount={amount}&label=Membership Fee {year} {username}&message=Membership Fee {year} {username}".format(amount=price, year=year, username=form.username.data) %}
 
        <div><img class="btcqrcode" src="{{ qrcode(bitcoin_url) }}"></img></div>
 
      </div>
 
    {% elif form.payment.data == 'ethereum' %}
 
      <div class="btccontainer">
 
      <div>
 
        <ul class='btctext'>
 
          <ul class="btctext">
 
          <li><b>Address:</b> 0x1C05b4C236914B218B57e0E25948d416B4885655</li>
 
          <li><b>Label:</b> Membership Fee</li>
 
          <li><b>Message:</b> {{ year }} {{ form.username.data }}</li>
 
          <li><b>Amount:</b> {{ price }} ETH</li>
 
        </ul>
 
        {% set ethereum_url= '0x1C05b4C236914B218B57e0E25948d416B4885655' %}
 
          <img class="btcqrcode" src="{{ qrcode(ethereum_url) }}"></img>
 
        </div>
 
        {% set ethereum_url="0x1C05b4C236914B218B57e0E25948d416B4885655" %}
 
        <div><img class="btcqrcode" src="{{ qrcode(ethereum_url) }}"></img></div>
 
      </div>
 
      </div>
 
    {% elif form.payment.data == 'digicash' %}
 
      <div>
 
      <div class="digicash">
 
        {% set digicash_url='https://pos.digica.sh/qrcode/generator?merchantId=CHAOSPC1&amount={amount}&transactionReference=Membership_{username}'.format(amount=price, username=form.username.data) %}
 
        <img class="btqrcode" src="{{ digicash_url }}"></img>
 
        <div><p>Pay with digicash!</p></div>
 
        <div><img src="{{ digicash_url }}"></img></div>
 
      </div>
 
    {% endif %}
 
    <div>
 
    <div class="signature">
 
      <p class="membersignature">
 
        Luxembourg, the 
 
      </p>
c3l_membership/views.py
Show inline comments
 
import re
 
import subprocess
 
from datetime import date
 

	
 
@@ -8,24 +9,54 @@ from .forms import MembershipForm
 

	
 
root_page = Blueprint("root", __name__)
 

	
 
xml_template = "<member><numm>{name}</numm><gebuertsdag>{birthday:%d.%m.%Y}</gebuertsdag><address>{address}</address><nick>{username}</nick><email>{email}</email><status>{status}</status><stemmrecht>{voting}</stemmrecht></member>"
 

	
 

	
 
@root_page.route("/", methods=("GET", "POST"))
 
def index():
 
    form = MembershipForm()
 
    if form.validate_on_submit():
 

	
 
        xml_data = {}
 

	
 
        if (
 
            form.minor_member.data
 
            or form.student.data
 
            or form.membership.data == "supporting"
 
        ):
 
            price = 40
 
            xml_data["voting"] = 0
 
        elif form.membership.data == "regular":
 
            price = 120
 
            xml_data["voting"] = 1
 

	
 
        if form.starving.data:
 
            price = 1
 

	
 
        if form.starving.data:
 
            xml_data["status"] = "Starving"
 
        elif form.minor_member.data or form.student.data:
 
            xml_data["status"] = "Student"
 
        elif form.membership.data == "supporting":
 
            xml_data["status"] = "Supporter"
 
        else:
 
            xml_data["status"] = "Regular"
 

	
 
        xml_data["name"] = form.fullname.data
 
        xml_data["birthday"] = form.birthday.data
 
        xml_data["username"] = form.username.data
 
        xml_data["email"] = form.email.data
 
        xml_data["address"] = " ".join(
 
            (
 
                form.street.data,
 
                form.zip.data,
 
                form.city.data,
 
                form.state.data,
 
                form.country.data,
 
            )
 
        )
 
        xml_data["address"] = re.sub("\s+", " ", xml_data["address"])
 

	
 
        if form.payment.data == "bitcoin":
 
            price = subprocess.check_output(
 
                ["/usr/local/share/btc/BTC_Membership.pl", str(price)]
 
@@ -34,11 +65,20 @@ def index():
 
            price = subprocess.check_output(
 
                ["/usr/local/share/eth/ETH_Membership.pl", str(price)]
 
            ).decode("utf-8")
 
        elif form.payment.data == "monero":
 
            price = subprocess.check_output(
 
                ["/usr/local/share/xmr/XMR_Membership.pl", str(price)]
 
            ).decode("utf-8")
 
        elif form.payment.data == "digicash":
 
            price = price * 100
 

	
 
        year = date.today().year
 
        now = date.today()
 
        year = now.year
 
        xml_data["date"] = now
 

	
 
        html = render_template("member.html", form=form, price=price, year=year)
 
        xml = xml_template.format(**xml_data)
 
        html = render_template(
 
            "member.html", form=form, price=price, year=year, xml=xml
 
        )
 
        return render_pdf(HTML(string=html))
 
    return render_template("index.html", form=form)
0 comments (0 inline, 0 general)