1
0
forked from orson/bachemap

Compare commits

...

2 Commits

Author SHA1 Message Date
c2f988b899 Code clean up on app and forms 2024-10-06 18:12:31 -06:00
a3e9179954 Initial refactor to splice forms from main app 2024-10-06 17:49:26 -06:00
4 changed files with 67 additions and 52 deletions

54
app.py
View File

@ -1,72 +1,24 @@
from flask import Flask, render_template, request, redirect, url_for, flash, send_from_directory from flask import Flask, render_template, request, redirect, url_for, flash, send_from_directory
from flask_pymongo import PyMongo, ObjectId
from flask_login import LoginManager, UserMixin, login_user, login_required, current_user, logout_user from flask_login import LoginManager, UserMixin, login_user, login_required, current_user, logout_user
from werkzeug.utils import secure_filename from werkzeug.utils import secure_filename
from werkzeug.security import generate_password_hash, check_password_hash from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime
from flask_pymongo import ObjectId
import os import os
from uuid import uuid4 from uuid import uuid4
from flask_wtf import FlaskForm
from wtforms import StringField, FileField, SubmitField, DateTimeField, SelectField, PasswordField
from wtforms.validators import DataRequired, Length
import requests import requests
from config import Config from config import Config
from geopy.geocoders import Nominatim from geopy.geocoders import Nominatim
from forms import *
from db import mongo
geolocator = Nominatim(user_agent="Bachemapa @ baches.qro.mx") geolocator = Nominatim(user_agent="Bachemapa @ baches.qro.mx")
def create_app(config=Config): def create_app(config=Config):
app = Flask(__name__) app = Flask(__name__)
app.config.from_object(config) app.config.from_object(config)
mongo = PyMongo(app) mongo.init_app(app)
login_manager = LoginManager(app) login_manager = LoginManager(app)
login_manager.session_protection = "strong" login_manager.session_protection = "strong"
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)
self.pwd = user_data.get('pwd')
@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
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')
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')
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']
@app.route('/', methods=['GET', 'POST']) @app.route('/', methods=['GET', 'POST'])
def index(): def index():

3
db.py Normal file
View File

@ -0,0 +1,3 @@
from flask_pymongo import PyMongo
mongo = PyMongo()

58
forms.py Normal file
View File

@ -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']

View File

@ -7,6 +7,8 @@ Flask==3.0.3
Flask-Login==0.6.3 Flask-Login==0.6.3
Flask-PyMongo==2.3.0 Flask-PyMongo==2.3.0
Flask-WTF==1.2.1 Flask-WTF==1.2.1
geographiclib==2.0
geopy==2.4.1
idna==3.8 idna==3.8
itsdangerous==2.2.0 itsdangerous==2.2.0
Jinja2==3.1.3 Jinja2==3.1.3