83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
from datetime import datetime, timezone
|
|
|
|
import sqlalchemy
|
|
from flask import Blueprint, Response, flash, render_template
|
|
from flask.typing import ResponseReturnValue
|
|
from flask_wtf import FlaskForm
|
|
from wtforms import BooleanField, IntegerField, SubmitField
|
|
|
|
from app.extensions import db
|
|
from app.models.mirrors import Country
|
|
|
|
bp = Blueprint("country", __name__)
|
|
|
|
_SECTION_TEMPLATE_VARS = {
|
|
"section": "country",
|
|
"help_url": "https://bypass.censorship.guide/user/countries.html",
|
|
}
|
|
|
|
|
|
@bp.app_template_filter("country_flag")
|
|
def filter_country_flag(country_code: str) -> str:
|
|
country_code = country_code.upper()
|
|
|
|
# Calculate the regional indicator symbol for each letter in the country code
|
|
base = ord("\U0001F1E6") - ord("A")
|
|
flag = "".join([chr(ord(char) + base) for char in country_code])
|
|
|
|
return flag
|
|
|
|
|
|
@bp.route("/list")
|
|
def country_list() -> ResponseReturnValue:
|
|
countries = Country.query.filter(Country.destroyed.is_(None)).all()
|
|
print(len(countries))
|
|
return render_template(
|
|
"list.html.j2",
|
|
title="Countries",
|
|
item="country",
|
|
new_link=None,
|
|
items=sorted(countries, key=lambda x: x.country_code),
|
|
**_SECTION_TEMPLATE_VARS
|
|
)
|
|
|
|
|
|
class EditCountryForm(FlaskForm): # type: ignore[misc]
|
|
risk_level_override = BooleanField("Force Risk Level Override?")
|
|
risk_level_override_number = IntegerField(
|
|
"Forced Risk Level", description="Number from 0 to 20", default=0
|
|
)
|
|
submit = SubmitField("Save Changes")
|
|
|
|
|
|
@bp.route("/edit/<country_id>", methods=["GET", "POST"])
|
|
def country_edit(country_id: int) -> ResponseReturnValue:
|
|
country = Country.query.filter(Country.id == country_id).first()
|
|
if country is None:
|
|
return Response(
|
|
render_template(
|
|
"error.html.j2",
|
|
section="country",
|
|
header="404 Country Not Found",
|
|
message="The requested country could not be found.",
|
|
),
|
|
status=404,
|
|
)
|
|
form = EditCountryForm(
|
|
risk_level_override=country.risk_level_override is not None,
|
|
risk_level_override_number=country.risk_level_override,
|
|
)
|
|
if form.validate_on_submit():
|
|
if form.risk_level_override.data:
|
|
country.risk_level_override = form.risk_level_override_number.data
|
|
else:
|
|
country.risk_level_override = None
|
|
country.updated = datetime.now(tz=timezone.utc)
|
|
try:
|
|
db.session.commit()
|
|
flash("Saved changes to country.", "success")
|
|
except sqlalchemy.exc.SQLAlchemyError:
|
|
flash("An error occurred saving the changes to the country.", "danger")
|
|
return render_template(
|
|
"country.html.j2", section="country", country=country, form=form
|
|
)
|