diff --git a/app.py b/app.py index 82416c7..af5dffc 100644 --- a/app.py +++ b/app.py @@ -1,29 +1,31 @@ from flask import Flask, render_template, request, redirect, url_for, flash, send_from_directory -from flask_pymongo import PyMongo, ObjectId +#from flask_pymongo import PyMongo, ObjectId from flask_login import LoginManager, UserMixin, login_user, login_required, current_user, logout_user from werkzeug.utils import secure_filename from werkzeug.security import generate_password_hash, check_password_hash -from datetime import datetime -from flask_pymongo import ObjectId +#from datetime import datetime +#from flask_pymongo import ObjectId import os from uuid import uuid4 -from flask_wtf import FlaskForm -from wtforms import StringField, FileField, SubmitField, DateTimeField, SelectField, PasswordField -from wtforms.validators import DataRequired, Length +#from flask_wtf import FlaskForm +#from wtforms import StringField, FileField, SubmitField, DateTimeField, SelectField, PasswordField +#from wtforms.validators import DataRequired, Length import requests from config import Config from geopy.geocoders import Nominatim +from forms import * +from db import mongo geolocator = Nominatim(user_agent="Bachemapa @ baches.qro.mx") def create_app(config=Config): app = Flask(__name__) app.config.from_object(config) - mongo = PyMongo(app) + mongo.init_app(app) login_manager = LoginManager(app) login_manager.session_protection = "strong" - class User(UserMixin): + """ class User(UserMixin): def __init__(self, user_data): self.id = str(user_data['_id']) self.username = user_data['username'] @@ -67,7 +69,7 @@ def create_app(config=Config): def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS'] - + """ @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'GET': diff --git a/db.py b/db.py new file mode 100644 index 0000000..959d62e --- /dev/null +++ b/db.py @@ -0,0 +1,3 @@ +from flask_pymongo import PyMongo + +mongo = PyMongo() \ No newline at end of file diff --git a/forms.py b/forms.py new file mode 100644 index 0000000..383df0c --- /dev/null +++ b/forms.py @@ -0,0 +1,58 @@ +from flask_login import UserMixin +from flask_pymongo import PyMongo, ObjectId +from flask_wtf import FlaskForm +from datetime import datetime +from wtforms import StringField, FileField, SubmitField, DateTimeField, SelectField, PasswordField +from wtforms.validators import DataRequired, Length +#Init Mongo +from db import mongo +#User object creation + +class User(UserMixin): + def __init__(self,user_data): + self.id = str(user_data['_id']) + self.username = user_data["username"] + self.referral_code = user_data["referral_code"] + self.invited_by = user_data.get('invited_by') + self.is_admin = user_data.get('is_admin', False) + seelf.pwd = user_data.get('pwd') + + #Getter method + @staticmethod + def get(user_id): + user_data = mongo.db.users.find_one({"_id": ObjectId(user_id)}) + if user_data: + return User(user_data) + else: + return None + +#Pin creation form +class PinForm(FlaskForm): + description = StringField('¿Qué estamos viendo?', validators=[DataRequired()]) + photo = FileField('Evidencia fotogénica', validators=[DataRequired()]) + timedate = DateTimeField(default=datetime.now()) + typeofpin = SelectField('Tipo de cosa', choices=['bache', 'coladera', 'obra sin terminar', 'escombro', 'robo-asalto', 'biciestacionamiento', 'mala iluminación', 'bici blanca', 'zapato blanco']) + submit = SubmitField('Agregar') + +class LoginForm(FlaskForm): + username = StringField('Usuario', validators=[DataRequired()]) + pwd = PasswordField('Tu clave', validators= [DataRequired()]) + submit = SubmitField('Entrar') + +#decorator to simplify mongo unique validation calls +def Unique(model, field, message=None): + def _unique(form, field_data): + if mongo.db[model.__name__.lower()].find_one({field.name: field_data.data}): + raise ValidationError(message or f"{field.name} must be unique.") + return _unique + +class RegistrationForm(FlaskForm): + username = StringField('Nombre de usuarix', validators=[DataRequired(), Unique('users', StringField('username', message="Este usuario ya existe"))]) + pwd = PasswordField('Clave', validators=[DataRequired(), Length(min=10), Unique('users', StringField('pwd', message="Esta clave no es muy buena, escoge otra"))]) + referral = StringField('ID de quien te invito', [DataRequired()]) + submit = SubmitField('Registrar') + + +#restrict allowed file types~ +def allowed_file(filename): + return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS'] diff --git a/requirements.txt b/requirements.txt index c366df3..f51b5a7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,6 +7,8 @@ Flask==3.0.3 Flask-Login==0.6.3 Flask-PyMongo==2.3.0 Flask-WTF==1.2.1 +geographiclib==2.0 +geopy==2.4.1 idna==3.8 itsdangerous==2.2.0 Jinja2==3.1.3