fix the circular import hell

This commit is contained in:
deflax 2024-04-01 17:41:45 +03:00
parent 1de078d47e
commit 4e7d8bc743
12 changed files with 38 additions and 41 deletions

View file

@ -4,10 +4,9 @@ from flask_login import fresh_login_required, login_user, logout_user
from . import admin from . import admin
from .. import db from mailsender import send_email
from ..mailsender import send_email from models import db, User, Item
from ..models import User, Item from decorators import admin_required, permission_required
from ..decorators import admin_required, permission_required
import base64 import base64
import string import string

View file

@ -17,26 +17,18 @@ from waitress import serve
from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap from flask_bootstrap import Bootstrap
from flask_mail import Mail from flask_mail import Mail
from flask_login import LoginManager
from flask_wtf.csrf import CSRFProtect, CSRFError from flask_wtf.csrf import CSRFProtect, CSRFError
from flask_moment import Moment from flask_moment import Moment
from models import lm
sys.stderr.write("worker uid={} gid={}".format(os.getuid(), os.getgid())) sys.stderr.write("worker uid={} gid={}".format(os.getuid(), os.getgid()))
sys.stderr.flush() sys.stderr.flush()
app = Flask(__name__) app = Flask(__name__)
app.config.from_object("config.Config") app.config.from_object("config.Config")
db = SQLAlchemy(app)
#db.init_app(app)
#apiauth = HTTPBasicAuth()
lm = LoginManager()
lm.init_app(app) lm.init_app(app)
lm.login_view = 'auth.login'
lm.login_message = 'Login Required.'
lm.session_protection = 'strong'
#lm.session_protection = 'basic'
mail = Mail() mail = Mail()
mail.init_app(app) mail.init_app(app)

View file

@ -3,8 +3,8 @@ from flask_wtf import FlaskForm, RecaptchaField
from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, DecimalField from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, DecimalField
from wtforms import validators, ValidationError from wtforms import validators, ValidationError
from wtforms.fields import EmailField from wtforms.fields import EmailField
from ..models import User
from models import User
class LoginForm(FlaskForm): class LoginForm(FlaskForm):
email = EmailField('E-Mail', [validators.DataRequired(), validators.Length(1,64), validators.Email()]) email = EmailField('E-Mail', [validators.DataRequired(), validators.Length(1,64), validators.Email()])

View file

@ -2,11 +2,11 @@ from flask import render_template, redirect, request, url_for, flash, session, a
from flask_login import login_required, login_user, logout_user, current_user from flask_login import login_required, login_user, logout_user, current_user
from . import auth from . import auth
from .. import db
from ..models import User
from ..mailsender import send_email
from .forms import LoginForm, TwoFAForm, RegistrationForm, ChangePasswordForm, PasswordResetRequestForm, PasswordResetForm from .forms import LoginForm, TwoFAForm, RegistrationForm, ChangePasswordForm, PasswordResetRequestForm, PasswordResetForm
from ..decorators import admin_required, permission_required
from decorators import admin_required, permission_required
from mailsender import send_email
from models import db, User
from io import BytesIO from io import BytesIO
import pyqrcode import pyqrcode

View file

@ -1,7 +1,6 @@
from functools import wraps from functools import wraps
from flask import abort from flask import abort
from flask_login import current_user from flask_login import current_user
from .models import Permission
from threading import Thread from threading import Thread
def asyncfn(f): def asyncfn(f):
@ -21,5 +20,6 @@ def permission_required(permission):
return decorator return decorator
def admin_required(f): def admin_required(f):
from models import Permission
return permission_required(Permission.ADMINISTER)(f) return permission_required(Permission.ADMINISTER)(f)

View file

@ -1,8 +1,7 @@
from threading import Thread from threading import Thread
from flask import current_app, render_template from flask import current_app, render_template
from flask_mail import Message from flask_mail import Message
from . import app, mail from decorators import asyncfn
from .decorators import asyncfn
@asyncfn @asyncfn
def send_async_email(app, msg): def send_async_email(app, msg):

View file

@ -3,7 +3,7 @@ from flask_wtf import FlaskForm, RecaptchaField
from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, DecimalField from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, DecimalField
from wtforms import validators, ValidationError from wtforms import validators, ValidationError
from wtforms.fields import EmailField from wtforms.fields import EmailField
from ..models import User from models import User
class LoginForm(FlaskForm): class LoginForm(FlaskForm):
email = EmailField('', [validators.DataRequired(), validators.Length(1,64), validators.Email()], render_kw={"placeholder": "username"}) email = EmailField('', [validators.DataRequired(), validators.Length(1,64), validators.Email()], render_kw={"placeholder": "username"})
@ -22,4 +22,4 @@ class RegistrationForm(FlaskForm):
accept_tos = BooleanField('I accept the <a href="/terms">Terms of Service</a>', [validators.DataRequired()]) accept_tos = BooleanField('I accept the <a href="/terms">Terms of Service</a>', [validators.DataRequired()])
recaptcha = RecaptchaField() recaptcha = RecaptchaField()
submit = SubmitField('REGISTER') submit = SubmitField('REGISTER')

View file

@ -4,9 +4,9 @@ from flask_login import login_required, login_user, logout_user, current_user
from . import main from . import main
from .forms import LoginForm, RegistrationForm from .forms import LoginForm, RegistrationForm
from .. import db
from ..mailsender import send_email from mailsender import send_email
from ..models import User, Permission, Item from models import db, User, Permission, Item
import base64 import base64

View file

@ -1,9 +1,9 @@
from werkzeug.security import generate_password_hash, check_password_hash from werkzeug.security import generate_password_hash, check_password_hash
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer from itsdangerous import URLSafeTimedSerializer as Serializer
from flask import current_app, request, url_for from flask import current_app, request, url_for
from flask_login import UserMixin, AnonymousUserMixin from flask_sqlalchemy import SQLAlchemy
from . import db, lm from flask_login import LoginManager, UserMixin, AnonymousUserMixin
import os import os
import random import random
@ -14,6 +14,14 @@ import json
from datetime import date, time, datetime, timedelta from datetime import date, time, datetime, timedelta
import onetimepass import onetimepass
db = SQLAlchemy()
lm = LoginManager()
lm.login_view = 'auth.login'
lm.login_message = 'Login Required.'
lm.session_protection = 'strong'
lm.anonymous_user = AnonymousUserMixin
class Permission: class Permission:
DEPLOY = 0x01 DEPLOY = 0x01
ADMINISTER = 0xff ADMINISTER = 0xff
@ -189,8 +197,6 @@ class AnonymousUser(AnonymousUserMixin):
def is_administrator(self): def is_administrator(self):
return False return False
lm.anonymous_user = AnonymousUser
@lm.user_loader @lm.user_loader
def load_user(user_id): def load_user(user_id):
return User.query.get(int(user_id)) return User.query.get(int(user_id))
@ -202,4 +208,4 @@ class Item(db.Model):
user_id = db.Column(db.ForeignKey('users.id')) #FK user_id = db.Column(db.ForeignKey('users.id')) #FK
key = db.Column(db.Integer, default=0) key = db.Column(db.Integer, default=0)
description = db.Column(db.Unicode) description = db.Column(db.Unicode)
date_created = db.Column(db.DateTime, default=datetime.utcnow) date_created = db.Column(db.DateTime, default=datetime.utcnow)

View file

@ -1,11 +1,11 @@
flask import render_template, abort, redirect, url_for, abort, flash, request, current_app, make_response, g from flask import render_template, abort, redirect, url_for, abort, flash, request, current_app, make_response, g
from flask_login import login_required, login_user, logout_user, current_user from flask_login import login_required, login_user, logout_user, current_user
#from flask_sqlalchemy import get_recorded_queries #from flask_sqlalchemy import get_recorded_queries
from . import panel from . import panel
from .. import db
from ..mailsender import send_email from mailsender import send_email
from ..models import User, Permission, Item from models import db, User, Permission, Item
import base64 import base64
from datetime import date, time, datetime from datetime import date, time, datetime

View file

@ -1,7 +1,8 @@
from iso3166 import countries from iso3166 import countries
import string import string
import random import random
from ..models import User, Role
from models import User, Role
from flask_wtf import FlaskForm, RecaptchaField from flask_wtf import FlaskForm, RecaptchaField
from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, DecimalField from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, DecimalField

View file

@ -5,9 +5,9 @@ from sqlalchemy import desc
from . import settings from . import settings
from .forms import EditProfileForm, EditProfileAdminForm from .forms import EditProfileForm, EditProfileAdminForm
from ..mailsender import send_email from mailsender import send_email
from .. import db from models import db, User
from ..models import User
import sys import sys
#PROFILE #PROFILE