Release 1.2: bulk upload, S3/SFTP/FTP, SMTP, password reset, user groups, git deploy
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+68
-2
@@ -1,9 +1,10 @@
|
||||
import os
|
||||
import re
|
||||
|
||||
from sqlalchemy import inspect, text
|
||||
|
||||
from app import db
|
||||
from app.models import User
|
||||
from app.models import User, UserGroup
|
||||
|
||||
|
||||
def ensure_schema():
|
||||
@@ -18,6 +19,62 @@ def ensure_schema():
|
||||
)
|
||||
db.session.commit()
|
||||
|
||||
if "users" in tables and "user_groups" in tables:
|
||||
columns = {col["name"] for col in inspector.get_columns("users")}
|
||||
if "group_id" not in columns:
|
||||
db.session.execute(
|
||||
text("ALTER TABLE users ADD COLUMN group_id INTEGER REFERENCES user_groups(id)")
|
||||
)
|
||||
db.session.commit()
|
||||
|
||||
|
||||
def ensure_default_group(app):
|
||||
default_quota = int(os.getenv("DEFAULT_GROUP_QUOTA_MB", "100"))
|
||||
default_group = UserGroup.query.filter_by(is_default=True).first()
|
||||
|
||||
if not default_group:
|
||||
default_group = UserGroup.query.filter_by(slug="users").first()
|
||||
if default_group:
|
||||
default_group.is_default = True
|
||||
else:
|
||||
default_group = UserGroup(
|
||||
name="Пользователи",
|
||||
slug="users",
|
||||
disk_quota_mb=default_quota,
|
||||
is_default=True,
|
||||
)
|
||||
db.session.add(default_group)
|
||||
db.session.commit()
|
||||
app.logger.info("Default user group 'users' created with %s MB quota", default_quota)
|
||||
|
||||
User.query.filter(User.group_id.is_(None)).update({"group_id": default_group.id})
|
||||
db.session.commit()
|
||||
|
||||
|
||||
def ensure_site_settings(app):
|
||||
from app.models import SiteSettings
|
||||
|
||||
if SiteSettings.query.get(1) is None:
|
||||
db.session.add(SiteSettings(id=1))
|
||||
db.session.commit()
|
||||
app.logger.info("Site settings initialized")
|
||||
|
||||
|
||||
def ensure_photo_storage_column():
|
||||
inspector = inspect(db.engine)
|
||||
if "photos" not in inspector.get_table_names():
|
||||
return
|
||||
columns = {col["name"] for col in inspector.get_columns("photos")}
|
||||
if "storage_backend" not in columns:
|
||||
db.session.execute(text("ALTER TABLE photos ADD COLUMN storage_backend VARCHAR(20) DEFAULT 'local'"))
|
||||
db.session.commit()
|
||||
|
||||
|
||||
def slugify(name):
|
||||
slug = re.sub(r"[^a-z0-9]+", "-", name.lower().strip())
|
||||
slug = slug.strip("-") or "group"
|
||||
return slug[:80]
|
||||
|
||||
|
||||
def create_first_admin(app):
|
||||
username = os.getenv("ADMIN_USERNAME", "").strip()
|
||||
@@ -31,15 +88,24 @@ def create_first_admin(app):
|
||||
if User.query.filter_by(is_admin=True).first():
|
||||
return None
|
||||
|
||||
default_group = UserGroup.query.filter_by(is_default=True).first()
|
||||
|
||||
if User.query.filter_by(username=username).first():
|
||||
user = User.query.filter_by(username=username).first()
|
||||
user.is_admin = True
|
||||
user.set_password(password)
|
||||
if default_group and not user.group_id:
|
||||
user.group_id = default_group.id
|
||||
db.session.commit()
|
||||
app.logger.info("Existing user '%s' promoted to admin", username)
|
||||
return user
|
||||
|
||||
user = User(username=username, email=email, is_admin=True)
|
||||
user = User(
|
||||
username=username,
|
||||
email=email,
|
||||
is_admin=True,
|
||||
group_id=default_group.id if default_group else None,
|
||||
)
|
||||
user.set_password(password)
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
|
||||
Reference in New Issue
Block a user