80 lines
1.8 KiB
Python
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)
|