Added url reporting

This commit is contained in:
xemeds
2020-08-25 13:02:48 +03:00
parent e5e9b7a5f4
commit 661bfb3e46
8 changed files with 77 additions and 8 deletions
+9 -2
View File
@@ -1,5 +1,5 @@
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, ValidationError from wtforms import StringField, SubmitField, TextAreaField, ValidationError
from wtforms.validators import DataRequired, Length, Optional from wtforms.validators import DataRequired, Length, Optional
from tiny0.config import WEBSITE_DOMAIN from tiny0.config import WEBSITE_DOMAIN
from tiny0 import db from tiny0 import db
@@ -105,4 +105,11 @@ class URLForm(FlaskForm):
class ShortURLForm(FlaskForm): class ShortURLForm(FlaskForm):
url = StringField(validators=[DataRequired(), Length(min=len(WEBSITE_DOMAIN) + 7, max=len(WEBSITE_DOMAIN) + 25, message="Invalid short URL"), validate_short_URL]) url = StringField(validators=[DataRequired(), Length(min=len(WEBSITE_DOMAIN) + 7, max=len(WEBSITE_DOMAIN) + 25, message="Invalid short URL"), validate_short_URL])
submit = SubmitField("Track") submit = SubmitField("Submit")
class ReportForm(FlaskForm):
url = StringField(validators=[DataRequired(), Length(min=len(WEBSITE_DOMAIN) + 7, max=len(WEBSITE_DOMAIN) + 25, message="Invalid short URL"), validate_short_URL])
message = TextAreaField(validators=[DataRequired(), Length(1, 200, message="Message too short or too long")])
submit = SubmitField("Submit")
+8
View File
@@ -8,3 +8,11 @@ class URL(db.Model):
def __repr__(self): def __repr__(self):
return f"'{self.id}' '{self.token}' '{self.url}' '{self.clicks}'" return f"'{self.id}' '{self.token}' '{self.url}' '{self.clicks}'"
class Reports(db.Model):
id = db.Column(db.Integer, primary_key=True)
token = db.Column(db.String(16), index=True, nullable=False)
message = db.Column(db.String(200), nullable=False)
def __repr__(self):
return f"'{self.id}' '{self.token}' '{self.message}'"
+23 -3
View File
@@ -1,7 +1,7 @@
from flask import render_template, redirect, url_for from flask import render_template, redirect, url_for
from tiny0 import app, db from tiny0 import app, db
from tiny0.forms import URLForm, ShortURLForm from tiny0.forms import URLForm, ShortURLForm, ReportForm
from tiny0.models import URL from tiny0.models import URL, Reports
from tiny0.token import gen_valid_token from tiny0.token import gen_valid_token
from tiny0.config import WEBSITE_DOMAIN from tiny0.config import WEBSITE_DOMAIN
@@ -95,9 +95,29 @@ def lookup():
# Else if the form was invalid or not submitted # Else if the form was invalid or not submitted
else: else:
# Return the tracker page with the form # Return the lookup page with the form
return render_template("lookup.html", form=form) return render_template("lookup.html", form=form)
# url report route
@app.route("/report", methods=['GET', 'POST'])
def report():
# Create a instance of the form
form = ReportForm()
# If the form was valid
if form.validate_on_submit():
# Add the report to the database
db.session.add(Reports(token=form.url.data, message=form.message.data))
db.session.commit()
# Return the thanks page
return render_template("thanks.html")
# Else if the form was invalid or not submitted
else:
# Return the report page with the form
return render_template("report.html", form=form)
# Donate route # Donate route
@app.route("/donate") @app.route("/donate")
def donate(): def donate():
+7 -1
View File
@@ -216,7 +216,7 @@ body {
.clicks { .clicks {
color: #f68741; color: #f68741;
text-align: center; text-align: center;
margin-top: 230px; margin-top: 20vh;
} }
.clicks h1 { .clicks h1 {
@@ -227,6 +227,12 @@ body {
font-size: 25px; font-size: 25px;
} }
.thanks {
color: #f68741;
text-align: center;
margin-top: 20vh;
}
.donation { .donation {
color: #ffffff; color: #ffffff;
text-align: center; text-align: center;
+1 -1
View File
@@ -5,7 +5,7 @@
<h1>&#60 URL Shortener &#62</h1> <h1>&#60 URL Shortener &#62</h1>
{{ form.hidden_tag() }} {{ form.hidden_tag() }}
{{ form.url(placeholder="Enter the URL here", autofocus=true, class="feedback-input") }} {{ form.url(placeholder="Enter the URL here", autofocus=true, class="feedback-input") }}
{{ form.token(placeholder="Enter the token (optional)", autofocus=true, class="feedback-input") }} {{ form.token(placeholder="Enter the token (optional)", class="feedback-input") }}
<div class="tooltip"> <div class="tooltip">
What's a token? What's a token?
<span class="tooltiptext"><p>tiny0.cc/token</p><p>Token must be between 6 and 16 characters long</p><p>It can only contain letters, numbers, underscores(_) and dashes(-)</p></span> <span class="tooltiptext"><p>tiny0.cc/token</p><p>Token must be between 6 and 16 characters long</p><p>It can only contain letters, numbers, underscores(_) and dashes(-)</p></span>
+1 -1
View File
@@ -20,7 +20,7 @@
<li class="items"><a href="{{ url_for('index') }}">Shortener</a></li> <li class="items"><a href="{{ url_for('index') }}">Shortener</a></li>
<li class="items"><a href="{{ url_for('tracker') }}">Tracker</a></li> <li class="items"><a href="{{ url_for('tracker') }}">Tracker</a></li>
<li class="items"><a href="{{ url_for('lookup') }}">Lookup</a></li> <li class="items"><a href="{{ url_for('lookup') }}">Lookup</a></li>
<li class="items"><a href="#">Report</a></li> <li class="items"><a href="{{ url_for('report') }}">Report</a></li>
<li class="items"><a href="{{ url_for('donate') }}">Donate</a></li> <li class="items"><a href="{{ url_for('donate') }}">Donate</a></li>
<li class="btn"><a href="#"><i class="fas fa-bars"></i></a></li> <li class="btn"><a href="#"><i class="fas fa-bars"></i></a></li>
</ul> </ul>
+21
View File
@@ -0,0 +1,21 @@
{% extends "layout.html" %}
{% block body %}
<form method="POST" action="" class="url-form">
<h1>&#60 Report &#62</h1>
{{ form.hidden_tag() }}
{{ form.url(placeholder="Enter the short URL", autofocus=true, class="feedback-input") }}
{{ form.message(placeholder="Enter a short message explaining the reason for your report", class="feedback-input") }}
{{ form.submit(class="button") }}
{% if form.errors %}
<div class="form-errors">
{% for error in form.url.errors %}
<h4>{{ error }}</h4>
{% endfor %}
{% for error in form.message.errors %}
<h4>{{ error }}</h4>
{% endfor %}
</div>
{% endif %}
</form>
{% endblock %}
+7
View File
@@ -0,0 +1,7 @@
{% extends "layout.html" %}
{% block body %}
<div class="thanks">
<h1>Your report has been submitted</h1>
</div>
{% endblock %}