Changeset - 7cf7d1e162a4
[Not reviewed]
default
0 5 0
Dennis Fink - 3 years ago 2021-12-27 21:52:14
dennis.fink@c3l.lu
Make alot of things configurable
5 files changed with 85 insertions and 45 deletions:
0 comments (0 inline, 0 general)
c3l_membership/__init__.py
Show inline comments
 
import base64
 
import json
 
import os.path
 
import secrets
 

	
 
from flask import Flask
 
from flask_pure import Pure
 
from flask_qrcode import QRcode
 

	
 
config_file = os.path.abspath("config.json")
 
config_file = os.path.abspath("/etc/membership.json")
 

	
 
pure = Pure()
 
qrcode = QRcode()
 
@@ -15,27 +17,8 @@ def create_app():
 

	
 
    app = Flask(__name__)
 

	
 
    if not hasattr(app.config, "from_json"):
 

	
 
        def from_json(file, silent=True):
 
            try:
 
                with open(file, encoding="utf-8") as json_file:
 
                    obj = json.load(json_file)
 
            except IOError:
 
                if silent:
 
                    return False
 
                raise
 

	
 
            for key in obj:
 
                if key.isupper():
 
                    app.config[key] = obj[key]
 

	
 
            return True
 

	
 
        app.config.from_json = from_json
 

	
 
    try:
 
        app.config.from_json(config_file)
 
        app.config.from_file(config_file, load=json.load)
 
    except FileNotFoundError:
 
        pass
 

	
 
@@ -46,7 +29,30 @@ def create_app():
 

	
 
    qrcode.init_app(app)
 

	
 
    app.config["SECRET_KEY"] = "foobar"
 
    _default_secret_key = base64.b64encode(secrets.token_bytes()).decode("utf-8")
 
    app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY", _default_secret_key)
 

	
 
    app.config.setdefault("SUPPORTING_FEE", 40)
 
    app.config.setdefault("REGULAR_FEE", 120)
 

	
 
    app.config.setdefault("DIGICASH_ENABLED", True)
 
    app.config.setdefault("BITCOIN_ENABLED", True)
 
    app.config.setdefault("ETHEREUM_ENABLED", True)
 
    app.config.setdefault("MONERO_ENABLED", True)
 
    app.config.setdefault("ZCASH_ENABLED", True)
 

	
 
    app.config.setdefault(
 
        "BITCOIN_CONVERSION_SCRIPT", "/usr/local/share/btc/BTC_Membership.pl"
 
    )
 
    app.config.setdefault(
 
        "ETHERUM_CONVERSION_SCRIPT", "/usr/local/share/eth/ETH_Membership.pl"
 
    )
 
    app.config.setdefault(
 
        "MONERO_CONVERSION_SCRIPT", "/usr/local/share/xmr/XMR_Membership.pl"
 
    )
 
    app.config.setdefault(
 
        "ZCASH_CONVERSION_SCRIPT", "/usr/local/share/zcash/ZCASH_Membership.pl"
 
    )
 

	
 
    from .views import root_page
 

	
c3l_membership/forms.py
Show inline comments
 
from datetime import date
 

	
 
from flask_wtf import Form
 
from wtforms import BooleanField, RadioField, StringField, SubmitField
 
from wtforms.fields.html5 import DateField
 
from wtforms.validators import Email, InputRequired, Length, Optional, Required
 
from flask_wtf import FlaskForm
 
from wtforms import BooleanField, DateField, RadioField, StringField, SubmitField
 
from wtforms.validators import Email, InputRequired, Length, Optional
 

	
 

	
 
class MembershipForm(Form):
 
class MembershipForm(FlaskForm):
 

	
 
    username = StringField(
 
        "Username",
 
@@ -48,13 +47,6 @@ class MembershipForm(Form):
 
    payment = RadioField(
 
        "Payment Options",
 
        validators=[InputRequired("Please select one of the options!")],
 
        choices=[
 
            ("cash", "by cash"),
 
            ("wire transfer", "by wire transfer"),
 
            ("digicash", "by DigiCash"),
 
            ("bitcoin", "by bitcoin"),
 
            ("ethereum", "by ethereum"),
 
        ],
 
    )
 

	
 
    birthday = DateField("Birthday")
 
@@ -96,5 +88,4 @@ class MembershipForm(Form):
 
            "I am under 18 years of age and have the approval of my legal representative."
 
        ),
 
    )
 

	
 
    submit = SubmitField("Become a member")
c3l_membership/templates/index.html
Show inline comments
 
@@ -87,7 +87,7 @@
 
            </ul>
 
            <p>You can read more on the membership <a href="https://wiki.c3l.lu/doku.php?id=organization:membership">here</a>.</p>
 
            <h3>What are the membership fees?</h3>
 
            <p>The membership fee for the regular membership is 120€ per year. The membership fee for the supporting membership is 40€ per year. If you are a student, all membership fees are 40€ per year. For that please select the corresponding option.</p>
 
            <p>The membership fee for the regular membership is {{ config["REGULAR_FEE"] }}€ per year. The membership fee for the supporting membership is {{ config["SUPPORTING_FEE"] }}€ per year. If you are a student, all membership fees are {{ config["SUPPORTING_FEE"] }}€ per year. For that please select the corresponding option.</p>
 
            <h3>I cannot afford the membership?</h3>
 
            <p>If you cannot afford the membership, please contact us via info@c3l.lu first, before filling out the membership form. We will try to find a solution together.</p>
 
          </div>
c3l_membership/templates/member.html
Show inline comments
 
@@ -91,28 +91,53 @@
 
      <div class="btccontainer">
 
        <div>
 
          <ul class="btctext">
 
            <li><b>Address:</b> 3BV5UPToMUmXJiqUVndHjSSq2HqDW8npRd</li>
 
            <li><b>Address:</b> {{ config["BITCOIN_ADDRESS"] }}</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>
 
        </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) %}
 
        {% set bitcoin_url="bitcoin:" + config["BITCOIN_ADDRESS"] + "?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">
 
            <li><b>Address:</b> 0x1C05b4C236914B218B57e0E25948d416B4885655</li>
 
            <li><b>Address:</b> {{ config["ETHEREUM_ADDRESS"] }}</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>
 
        </div>
 
        {% set ethereum_url="0x1C05b4C236914B218B57e0E25948d416B4885655" %}
 
        {% set ethereum_url=config["ETHEREUM_ADDRESS"] %}
 
        <div><img class="btcqrcode" src="{{ qrcode(ethereum_url) }}"></img></div>
 
      </div>
 
    {% elif form.payment.data == 'monero' %}
 
      <div class="btccontainer">
 
        <div>
 
          <ul class="btctext">
 
            <li><b>Address:</b> {{ config["MONERO_ADDRESS"] }}</li>
 
            <li><b>Label:</b> Membership Fee</li>
 
            <li><b>Message:</b> {{ year }} {{ form.username.data }}</li>
 
            <li><b>Amount:</b> {{ price }} XMR</li>
 
          </ul>
 
        </div>
 
        {% set monero_url=config["MONERO_ADDRESS"] %}
 
        <div><img class="btcqrcode" src="{{ qrcode(monero_url) }}"></img></div>
 
      </div>
 
    {% elif form.payment.data == 'zcash' %}
 
      <div class="btccontainer">
 
        <div>
 
          <ul class="btctext">
 
            <li><b>Address:</b> {{ config["ZCASH_ADDRESS"] }}</li>
 
            <li><b>Label:</b> Membership Fee</li>
 
            <li><b>Message:</b> {{ year }} {{ form.username.data }}</li>
 
            <li><b>Amount:</b> {{ price }} ZEC</li>
 
          </ul>
 
        </div>
 
        {% set zcash_url=config["ZCASH_ADDRESS"] %}
 
        <div><img class="btcqrcode" src="{{ qrcode(zcash_url) }}"></img></div>
 
      </div>
 
    {% elif form.payment.data == 'digicash' %}
 
      <div class="digicash">
c3l_membership/views.py
Show inline comments
 
@@ -15,6 +15,20 @@ xml_template = "<member><numm>{name}</nu
 
@root_page.route("/", methods=("GET", "POST"))
 
def index():
 
    form = MembershipForm()
 

	
 
    choices = [("cash", "by cash"), ("wire transfer", "by wire transfer")]
 

	
 
    for k, v in (
 
        ("DIGICASH_ENABLED", ("digicash", "by DigiCash")),
 
        ("BITCOIN_ENABLED", ("bitcoin", "by bitcoin")),
 
        ("ETHEREUM_ENABLED", ("ethereum", "by ethereum")),
 
        ("MONERO_ENABLED", ("monero", "by monero")),
 
        ("ZCASH_ENABLED", ("zcash", "by zcash")),
 
    ):
 
        if current_app.config[k]:
 
            choices.append(v)
 
    form.payment.choices = choices
 

	
 
    if form.validate_on_submit():
 

	
 
        xml_data = {}
 
@@ -24,10 +38,10 @@ def index():
 
            or form.student.data
 
            or form.membership.data == "supporting"
 
        ):
 
            price = 40
 
            price = current_app.config["SUPPORTING_FEE"]
 
            xml_data["voting"] = 0
 
        elif form.membership.data == "regular":
 
            price = 120
 
            price = current_app.config["REGULAR_FEE"]
 
            xml_data["voting"] = 1
 

	
 
        if form.starving.data:
 
@@ -59,15 +73,19 @@ def index():
 

	
 
        if form.payment.data == "bitcoin":
 
            price = subprocess.check_output(
 
                ["/usr/local/share/btc/BTC_Membership.pl", str(price)]
 
                [current_app.config["BITCOIN_CONVERSION_SCRIPT"], str(price)]
 
            ).decode("utf-8")
 
        elif form.payment.data == "ethereum":
 
            price = subprocess.check_output(
 
                ["/usr/local/share/eth/ETH_Membership.pl", str(price)]
 
                [current_app.config["ETHERUM_CONVERSION_SCRIPT"], str(price)]
 
            ).decode("utf-8")
 
        elif form.payment.data == "monero":
 
            price = subprocess.check_output(
 
                ["/usr/local/share/xmr/XMR_Membership.pl", str(price)]
 
                [current_app.config["MONERO_CONVERSION_SCRIPT"], str(price)]
 
            ).decode("utf-8")
 
        elif form.payment.data == "zcash":
 
            price = subprocess.check_output(
 
                [current_app.config["ZCASH_CONVERSION_SCRIPT"], str(price)]
 
            ).decode("utf-8")
 
        elif form.payment.data == "digicash":
 
            price = price * 100
0 comments (0 inline, 0 general)