Changeset - 10cfc4437178
[Not reviewed]
crypto
0 3 0
Dennis Fink - 3 years ago 2022-01-17 22:47:32
dennis.fink@c3l.lu
Unify cryptocurrencies handling

This allows us to add new cryptocurrencies without adding new code
3 files changed with 28 insertions and 86 deletions:
0 comments (0 inline, 0 general)
c3l_membership/__init__.py
Show inline comments
 
@@ -15,65 +15,49 @@ qrcode = QRcode()
 
babel = Babel()
 
babel_cli = AppGroup("babel")
 

	
 

	
 
def create_app():
 

	
 
    app = Flask(__name__)
 

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

	
 
    qrcode.init_app(app)
 
    babel.init_app(app)
 

	
 
    _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["LANGUAGES"] = ["en", "de", "fr", "lb"]
 

	
 
    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(
 
        "ETHEREUM_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"
 
    )
 
    app.config.setdefault("CRYPTOCURRENCIES", dict())
 

	
 
    @babel.localeselector
 
    def get_locale():
 
        if not g.get("lang_code", None):
 
            g.lang_code = request.accept_languages.best_match(app.config["LANGUAGES"])
 
        return g.lang_code
 

	
 
    from .views import root_page
 

	
 
    app.register_blueprint(root_page)
 

	
 
    @app.route("/")
 
    def home():
 
        g.lang_code = request.accept_languages.best_match(app.config["LANGUAGES"])
 
        return redirect(url_for("root.index"))
 

	
 
    app.cli.add_command(babel_cli)
 

	
 
    return app
 

	
 

	
 
@babel_cli.command("extract")
 
def babel_extract():
 
    subprocess.run(
c3l_membership/templates/member.html
Show inline comments
 
@@ -66,97 +66,58 @@
 
      <div>
 
        <div>{% trans %}Payment:{% endtrans %}</div>
 
        <div>{{ form.payment.data }}</div>
 
      </div>
 
      <div>
 
        <div>{% trans %}Agreed to Terms &amp; Conditions:{% endtrans %}</div>
 
        <div>{{ _("Yes") if form.terms.data else _("No") }}</div>
 
      </div>
 
      <div>
 
        <div>{% trans %}Minor Member:{% endtrans %}</div>
 
        <div>{{ _("Yes") if form.minor_member.data else _("No") }}</div>
 
      </div>
 
    </div>
 
    <p>{% trans %}Send this document to the Chaos Computer Club Lëtzebuerg!{% endtrans %}</p>
 
    {% if form.payment.data == 'wire transfer' %}
 
      <ul class="bank">
 
        <li>{% trans %}Account Holder:{% endtrans %} Chaos Computer Club Lëtzebuerg</li>
 
        <li>BIC/Swift: BCEELULLXXX</li>
 
        <li>IBAN: LU29 0019 2855 3890 4000</li>
 
        <li>{% trans %}Message:{% endtrans %} Membership fee {{ year }} {{ form.username.data }}</li>
 
        <li>{% trans %}Amount: {{ price }}€{% endtrans %}</li>
 
      </ul>
 
    {% elif form.payment.data == 'cash' %}
 
      <p>{% trans %}Please bring {{ price }}€ with you the next time you meet us!{% endtrans %}</p>
 
    {% elif form.payment.data == 'bitcoin' %}
 
      <div class="btccontainer">
 
        <div>
 
          <ul class="btctext">
 
            <li><b>{% trans %}Address:{% endtrans %}</b> {{ config["BITCOIN_ADDRESS"] }}</li>
 
            <li><b>{% trans %}Label:{% endtrans %}</b> Membership Fee</li>
 
            <li><b>{% trans %}Message:{% endtrans %}</b> {{ year }} {{ form.username.data }}</li>
 
            <li><b>{% trans %}Amount:{% endtrans %}</b> {{ price }} BTC</li>
 
          </ul>
 
        </div>
 
        {% 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) }}" /></div>
 
      </div>
 
    {% elif form.payment.data == 'ethereum' %}
 
    {% elif form.payment.data in config["CRYPTOCURRENCIES"] %}
 
      <div class="btccontainer">
 
        <div>
 
          <ul class="btctext">
 
            <li><b>{% trans %}Address:{% endtrans %}</b> {{ config["ETHEREUM_ADDRESS"] }}</li>
 
            <li><b>{% trans %}Label:{% endtrans %}</b> Membership Fee</li>
 
            <li><b>{% trans %}Message:{% endtrans %}</b> {{ year }} {{ form.username.data }}</li>
 
            <li><b>{% trans %}Amount:{% endtrans %}</b> {{ price }} ETH</li>
 
          </ul>
 
        </div>
 
        {% set ethereum_url=config["ETHEREUM_ADDRESS"] %}
 
        <div><img class="btcqrcode" src="{{ qrcode(ethereum_url) }}" /></div>
 
      </div>
 
    {% elif form.payment.data == 'monero' %}
 
      <div class="btccontainer">
 
        <div>
 
          <ul class="btctext">
 
            <li><b>{% trans %}Address:{% endtrans %}</b> {{ config["MONERO_ADDRESS"] }}</li>
 
            <li><b>{% trans %}Address:{% endtrans %}</b> {{ config["CRYPTOCURRENCIES"][form.payment.data]["ADDRESS"] }}</li>
 
            <li><b>{% trans %}Label:{% endtrans %}</b> Membership Fee</li>
 
            <li><b>{% trans %}Message:{% endtrans %}</b> {{ year }} {{ form.username.data }}</li>
 
            <li><b>{% trans %}Amount:{% endtrans %}</b> {{ price }} XMR</li>
 
            <li><b>{% trans %}Amount:{% endtrans %}</b> {{ price }} {{ config["CRYPTOCURRENCIES"][form.payment.data]["COMMODITY"] }}</li>
 
          </ul>
 
        </div>
 
        {% set monero_url=config["MONERO_ADDRESS"] %}
 
        <div><img class="btcqrcode" src="{{ qrcode(monero_url) }}" /></div>
 
      </div>
 
    {% elif form.payment.data == 'zcash' %}
 
      <div class="btccontainer">
 
        <div>
 
          <ul class="btctext">
 
            <li><b>{% trans %}Address:{% endtrans %}</b> {{ config["ZCASH_ADDRESS"] }}</li>
 
            <li><b>{% trans %}Label:{% endtrans %}</b> Membership Fee</li>
 
            <li><b>{% trans %}Message:{% endtrans %}</b> {{ year }} {{ form.username.data }}</li>
 
            <li><b>{% trans %}Amount:{% endtrans %}</b> {{ price }} ZEC</li>
 
          </ul>
 
        </div>
 
        {% set zcash_url=config["ZCASH_ADDRESS"] %}
 
        <div><img class="btcqrcode" src="{{ qrcode(zcash_url) }}" /></div>
 
        {% set crypto_url={{ config["CRYPTOCURRENCIES"][form.payment.data]["URL"] }}.format(amount=price, year=year, username=form.username.data) %}
 
        <div><img class="btcqrcode" src="{{ qrcode(crypto_url) }}" /></div>
 
      </div>
 
    {% elif form.payment.data == 'digicash' %}
 
      <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) %}
 
        <div><p>{% trans %}Pay with digicash!{% endtrans %}</p></div>
 
        <div><img src="{{ digicash_url }}" /></div>
 
      </div>
 
    {% endif %}
 
    <div class="signature">
 
      <p class="membersignature">{% trans %}Luxembourg, the{% endtrans %}</p>
 
      <p class="adminsignature">
 
        {{ _("Signature of your legal representative") if form.minor_member.data else _("Your signature") }}
 
      </p>
 
    </div>
 
    <footer>
 
      <hr />
 
      <b>C</b>haos <b>C</b>omputer <b>C</b>lub <b>L</b>ëtzebuerg A.S.B.L.<br />
 
      Halle Victor Hugo - 60 Avenue Victor Hugo L-1750 Luxembourg (Europe)<br />
 
      info@c3l.lu - <a href="https://c3l.lu">http://c3l.lu</a>
 
    </footer>
 
  </body>
 
</html>
c3l_membership/views.py
Show inline comments
 
@@ -13,106 +13,103 @@ 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.url_defaults
 
def add_lang_code(endpoint, values):
 
    values.setdefault("lang_code", g.lang_code)
 

	
 

	
 
@root_page.url_value_preprocessor
 
def pull_lang_code(endpoint, values):
 
    lang_code = values.pop("lang_code")
 
    if lang_code != "favicon.ico":
 
        g.lang_code = lang_code
 

	
 

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

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

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

	
 
    for cryptocurrency_label, options in current_app.config["CRYPTOCURRENCIES"].items():
 
        if options["ENABLED"]:
 
            choices.append(
 
                (
 
                    cryptocurrency_label,
 
                    " ".format((gettext("by"), options)),
 
                ),
 
            )
 

	
 
    form.payment.choices = choices
 

	
 
    if form.validate_on_submit():
 

	
 
        xml_data = {}
 

	
 
        if (
 
            form.minor_member.data
 
            or form.student.data
 
            or form.membership.data == "supporting"
 
        ):
 
            price = current_app.config["SUPPORTING_FEE"]
 
            xml_data["voting"] = 0
 
        elif form.membership.data == "regular":
 
            price = current_app.config["REGULAR_FEE"]
 
            xml_data["voting"] = 1
 

	
 
        if form.starving.data:
 
            price = 1
 
            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 if form.birthday.data is not None else date(9999, 12, 12)
 
        )
 
        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(
 
                [current_app.config["BITCOIN_CONVERSION_SCRIPT"], str(price)]
 
            ).decode("utf-8")
 
        elif form.payment.data == "ethereum":
 
            price = subprocess.check_output(
 
                [current_app.config["ETHEREUM_CONVERSION_SCRIPT"], str(price)]
 
            ).decode("utf-8")
 
        elif form.payment.data == "monero":
 
            price = subprocess.check_output(
 
                [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")
 
        if form.payment.data in current_app.config["CRYPTOCURRENCIES"]:
 
            price = subprocess.run(
 
                [
 
                    current_app.config["CRYPTOCURRENCIES_CONVERSION_SCRIPT"],
 
                    str(price),
 
                    form.payment.data,
 
                ],
 
                capture_output=True,
 
                encoding="utf-8",
 
            ).stdout
 
        elif form.payment.data == "digicash":
 
            price = price * 100
 

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

	
 
        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)