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