Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,5 @@ __pycache__/*
../.DS_Store
../.DS_Store/*
.DS_Store/

*migrations/versions/
Binary file added Pegabot - Grupo EA.pdf
Binary file not shown.
File renamed without changes.
15 changes: 13 additions & 2 deletions app/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
import settings as s
from flask import Flask
from flask_login import LoginManager

app = Flask(__name__) # Flask core instance initiated
app = Flask(__name__, template_folder="templates/") # Flask core instance initiated
app.config["SQLALCHEMY_DATABASE_URI"] = s.os.environ.get("DATABASE_URL")
app.config['JSON_SORT_KEYS'] = False
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] ="LOINPV0898h-987hoIUB086vgo(*¨F(&tvOUYVhygvioutgf97VUvg"

from app.routes import routes
login_manager = LoginManager()
login_manager.init_app(app)

from app.routes.analise.route import router as analise_router
from app.routes.auth.route import router as auth_router
from app.routes.lab.route import router as lab_router

app.register_blueprint(analise_router)
app.register_blueprint(auth_router)
app.register_blueprint(lab_router)
35 changes: 35 additions & 0 deletions app/models/auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""Database models."""
from flask_login import UserMixin
from werkzeug.security import check_password_hash, generate_password_hash

from . import db


class User(UserMixin, db.Model):
"""User account model."""

__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False, unique=False)
email = db.Column(db.String(40), unique=True, nullable=False)
password = db.Column(
db.String(200), primary_key=False, unique=False, nullable=False
)
created_on = db.Column(db.DateTime, index=False, unique=False, nullable=True)
last_login = db.Column(db.DateTime, index=False, unique=False, nullable=True)

twitter_api_key = db.Column(db.String(300), nullable=False, unique=False)
twitter_api_secret = db.Column(db.String(300), nullable=False, unique=False)
twitter_access_token = db.Column(db.String(300), nullable=False, unique=False)
twitter_access_token_secret = db.Column(db.String(300), nullable=False, unique=False)

def set_password(self, password):
"""Create hashed password."""
self.password = generate_password_hash(password, method="sha256")

def check_password(self, password):
"""Check hashed password."""
return check_password_hash(self.password, password)

def __repr__(self):
return "<User {}>".format(self.username)
23 changes: 18 additions & 5 deletions app/models/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,25 @@
#Importa a classe de preparação de dados
from app.models.prepare_data import MLTools

class AnalisesGroup(db.Model):
__tablename__ = 'analises_group'
id = db.Column(db.Integer, primary_key=True)
user = db.Column(
db.Integer,
db.ForeignKey("users.id")
)
term = db.Column(db.String(80), nullable=False)

class Analises(db.Model):
__tablename__ = 'analises'
id = db.Column(db.Integer, primary_key=True)
group = db.Column(
db.Integer,
db.ForeignKey("analises_group.id"),
nullable=True
)
handle = db.Column(db.String(80), nullable=False)
total = db.Column(db.String(120), nullable=True)
friends = db.Column(db.String(120), nullable=True)
network = db.Column(db.String(120), nullable=True)
sentiment = db.Column(db.String(120), nullable=True)
temporal = db.Column(db.String(120), nullable=True)
twitter_id = db.Column(db.String(120), nullable=True)
twitter_handle = db.Column(db.String(120), nullable=True)
twitter_user_name = db.Column(db.String(120), nullable=True)
Expand All @@ -40,7 +50,10 @@ class Analises(db.Model):

def process_bind_param(value):
if type(value) is str:
return datetime.strptime(value, '%Y-%m-%dT %H:%M:%S')
try:
return datetime.strptime(value, '%Y-%m-%dT %H:%M:%S')
except:
return datetime.strptime(value, "%a %b %d %H:%M:%S %z %Y")
return value

def __repr__(self):
Expand Down
37 changes: 37 additions & 0 deletions app/routes/analise/route.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from flask import Blueprint
from flask import jsonify, request

from app.models.models import Analises, AnaliseSchema
from app.services.botometer_service import BotometerService

router = Blueprint(
"analise",
__name__
)

@router.get("/catch")
def catch():
handle = str(request.args.get('profile'))
botometer_service = BotometerService()
response = botometer_service.catch(handle)
return jsonify(response), 200


@router.get('/botprobability') # test only
def botprobability():
handle = str(request.args.get('profile'))
botometer_service = BotometerService()
response = botometer_service.botProbability(handle)
return jsonify(response), 200

@router.get('/complete')
def complete():
handle = str(request.args.get('profile'))
result = Analises.query.filter_by(handle=handle).first()
# result = Analises.query.get(1);
analise_schema = AnaliseSchema()
return jsonify(analise_schema.dump(result))

@router.post('/feedback')
def feedback():
return jsonify("feedback")
49 changes: 49 additions & 0 deletions app/routes/auth/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
"""Sign-up & log-in forms."""
from flask_wtf import FlaskForm
from wtforms import PasswordField, StringField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo, Length, Optional


class SignupForm(FlaskForm):
"""User Sign-up Form."""

name = StringField("Name", validators=[DataRequired()])
email = StringField(
"Email",
validators=[
Length(min=6),
Email(message="Enter a valid email."),
DataRequired(),
],
)
password = PasswordField(
"Password",
validators=[
DataRequired(),
Length(min=6, message="Select a stronger password."),
],
)
confirm = PasswordField(
"Confirm Your Password",
validators=[
DataRequired(),
EqualTo("password", message="Passwords must match."),
],
)

twitter_api_key = StringField("Twitter API Key", validators=[DataRequired()])
twitter_api_secret = StringField("Twitter API Secret", validators=[DataRequired()])
twitter_access_token = StringField("Twitter Access Token", validators=[DataRequired()])
twitter_access_token_secret = StringField("Twitter Access Token Secret", validators=[DataRequired()])

submit = SubmitField("Register")


class LoginForm(FlaskForm):
"""User Log-in Form."""

email = StringField(
"Email", validators=[DataRequired(), Email(message="Enter a valid email.")]
)
password = PasswordField("Password", validators=[DataRequired()])
submit = SubmitField("Log In")
89 changes: 89 additions & 0 deletions app/routes/auth/route.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
from flask import Blueprint, flash, redirect, render_template, request, url_for
from flask import jsonify, request
from flask_login import current_user, login_user

from app import login_manager
from app.routes.auth.forms import SignupForm, LoginForm
from app.models.auth import User
from app.models import db

router = Blueprint(
"auth",
__name__,
url_prefix="/auth",
template_folder="templates"
)

@router.route("/login", methods=["GET", "POST"])
def login():
"""
Log-in page for registered users.

GET requests serve Log-in page.
POST requests validate and redirect user to dashboard.
"""
# Bypass if user is logged in
if current_user.is_authenticated:
return redirect(url_for("lab.home"))

form = LoginForm()
# Validate login attempt
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user and user.check_password(password=form.password.data):
login_user(user)
next_page = request.args.get("next")
return redirect(next_page or url_for("lab.home"))
flash("Invalid username/password combination")
return redirect(url_for("auth.login"))
return render_template(
"login.html",
form=form,
title="Log in.",
template="login-page",
body="Log in with your User account.",
)

@login_manager.user_loader
def load_user(user_id):
"""Check if user is logged-in upon page load."""
if user_id is not None:
try:
return User.query.get(user_id)
except:
return None
return None

@router.route("/signup", methods=["GET", "POST"])
def signup():
"""
User sign-up page.

GET requests serve sign-up page.
POST requests validate form & user creation.
"""
form = SignupForm()
if form.validate_on_submit():
existing_user = User.query.filter_by(email=form.email.data).first()
if existing_user is None:
user = User(
name=form.name.data,
email=form.email.data,
twitter_api_key=form.twitter_api_key.data,
twitter_api_secret=form.twitter_api_secret.data,
twitter_access_token=form.twitter_access_token.data,
twitter_access_token_secret=form.twitter_access_token_secret.data
)
user.set_password(form.password.data)
db.session.add(user)
db.session.commit() # Create new user

return redirect(url_for("auth.login"))
flash("A user already exists with that email address.")
return render_template(
"signup.html",
title="Create an Account.",
form=form,
template="signup-page",
body="Sign up for a user account.",
)
50 changes: 50 additions & 0 deletions app/routes/auth/templates/login.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{% extends "base.html" %}

{% block content %}
<div class="form-wrapper">

{% for message in get_flashed_messages() %}
<div class="alert alert-warning">
<button type="button" class="close" data-dismiss="alert">&times;</button>
{{ message }}
</div>
{% endfor %}

<h1>Log In</h1>

<form method="POST" action="/auth/login">
{{ form.csrf_token }}

<fieldset class="email">
{{ form.email.label }}
{{ form.email(placeholder='youremail@example.com') }}
{% if form.email.errors %}
<ul class="errors">
{% for error in form.email.errors %}
<li>{{ error }}</li>{% endfor %}
</ul>
{% endif %}
</fieldset>

<fieldset class="password">
{{ form.password.label }}
{{ form.password }}
{% if form.password.errors %}
<ul class="errors">
{% for error in form.password.errors %}
<li>{{ error }}</li>{% endfor %}
</ul>
{% endif %}
</fieldset>

<div class="submit-button">
{{ form.submit }}
</div>

<div class="login-signup">
<span>Don't have an account? <a href="{{ url_for('auth.signup') }}">Sign up.</a></span>
</div>

</form>
</div>
{% endblock %}
Loading