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

56
app.py
View File

@ -1,73 +1,25 @@
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 werkzeug.utils import secure_filename
from werkzeug.security import generate_password_hash, check_password_hash
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
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):
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'])
def index():
if request.method == 'GET':

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-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