slinky/slinky/web.py
2021-12-20 15:09:30 +00:00

80 lines
1.8 KiB
Python

"""
Web component
"""
from datetime import datetime
from flask import Blueprint, render_template
from flask_wtf import FlaskForm
from wtforms import DateTimeLocalField, IntegerField, StringField
from wtforms.validators import DataRequired, Length
from slinky import add_shortcode
slinky_webapp = Blueprint('webapp', __name__, template_folder='templates')
class ShortURLForm(FlaskForm): # type: ignore[misc]
"""
Web form definition
"""
url = StringField(
'URL',
validators=[DataRequired(), Length(1, 2048)],
render_kw={
'size': 64,
'maxlength': 2048,
'placeholder': 'e.g. www.example.com',
},
)
fixed_views = IntegerField(
'Fixed number of views',
validators=[DataRequired()],
render_kw={
'size': 3,
'value': 0,
},
)
length = IntegerField(
'Shortcode length',
validators=[DataRequired()],
render_kw={
'size': 3,
'value': 4,
},
)
expiry = DateTimeLocalField(
'Expiry',
format='%Y-%m-%dT%H:%M',
render_kw={
'size': 8,
'maxlength': 10,
},
)
@slinky_webapp.route('/add', methods=['GET', 'POST'])
def add() -> str:
"""
Create and add a new shorturl
Returns:
str: shortcode for the URL
"""
shortcode = ''
url = ''
form = ShortURLForm(meta={'csrf': False})
if form.is_submitted():
url = form.url.data.strip()
length = form.length.data
fixed_views = form.fixed_views.data
expiry = form.expiry.data or datetime.max
if url:
shortcode = add_shortcode(url, length, fixed_views, expiry)
return render_template('add.html', form=form, shortcode=shortcode)