forked from orson/bachemap
Compare commits
2 Commits
main
...
fine_tunni
| Author | SHA1 | Date | |
|---|---|---|---|
| c2f988b899 | |||
| a3e9179954 |
56
app.py
56
app.py
@ -1,73 +1,25 @@
|
|||||||
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():
|
||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
|
|||||||
58
forms.py
Normal file
58
forms.py
Normal 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']
|
||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user