allow domain change but show warning if it is done after user creation

This commit is contained in:
Your Name 2023-09-02 20:53:32 +00:00 committed by Henri Dickson
parent 1d382c3c4f
commit 86fc011be7
5 changed files with 150 additions and 2 deletions

View file

@ -1,5 +1,14 @@
from django.apps import AppConfig
from django.db.models.signals import post_migrate
class CommonConfig(AppConfig):
name = "common"
def ready(self):
post_migrate.connect(self.setup, sender=self)
def setup(self, **kwargs):
from .setup import Setup
Setup().run()

View file

@ -13,11 +13,32 @@ from users.models import User
class Command(BaseCommand):
help = "Post-Migration Setup"
def create_site(self, domain, service_domain):
TakaheDomain.objects.create(
domain=domain,
local=True,
service_domain=service_domain,
notes="NeoDB",
nodeinfo={},
)
TakaheConfig.objects.update_or_create(
key="public_timeline",
user=None,
identity=None,
domain=None,
defaults={"json": False},
)
def sync_site_config(self):
domain = settings.SITE_INFO["site_domain"]
if not domain:
raise ValueError("Panic: site_domain is not set!")
icon = settings.SITE_INFO["site_logo"]
name = settings.SITE_INFO["site_name"]
service_domain = settings.SITE_INFO.get("site_service_domain")
if not TakaheDomain.objects.filter(domain=domain).exists():
logger.warning(f"Domain {domain} not found, creating...")
self.create_site(domain, service_domain)
TakaheConfig.objects.update_or_create(
key="site_name",
user=None,
@ -55,7 +76,7 @@ class Command(BaseCommand):
else:
user.is_superuser = True
user.save(update_fields=["is_superuser"])
TakaheUser.objects.filter(email="@" + user.username).update(admin=True)
TakaheUser.objects.filter(email=f"@{user.username}").update(admin=True)
logger.info(f"Updated user {user.username} as admin")
def handle(self, *args, **options):

108
common/setup.py Normal file
View file

@ -0,0 +1,108 @@
from django.conf import settings
from loguru import logger
from catalog.search.typesense import Indexer
from takahe.models import Config as TakaheConfig
from takahe.models import Domain as TakaheDomain
from takahe.models import Identity as TakaheIdentity
from takahe.models import User as TakaheUser
from users.models import User
class Setup:
"""
Post-Migration Setup
"""
def create_site(self, domain, service_domain):
TakaheDomain.objects.create(
domain=domain,
local=True,
service_domain=service_domain,
notes="NeoDB",
nodeinfo={},
)
TakaheConfig.objects.update_or_create(
key="public_timeline",
user=None,
identity=None,
domain=None,
defaults={"json": False},
)
def sync_site_config(self):
domain = settings.SITE_INFO["site_domain"]
if not domain:
raise ValueError("Panic: site_domain is not set!")
icon = settings.SITE_INFO["site_logo"]
name = settings.SITE_INFO["site_name"]
service_domain = settings.SITE_INFO.get("site_service_domain")
if not TakaheDomain.objects.filter(domain=domain).exists():
logger.info(f"Domain {domain} not found, creating...")
self.create_site(domain, service_domain)
if (
TakaheIdentity.objects.filter(local=True)
.exclude(domain_id__isnull=True)
.exists()
):
logger.warning(
f"Local identities are found for other domains, there might be a configuration issue."
)
TakaheConfig.objects.update_or_create(
key="site_name",
user=None,
identity=None,
domain=None,
defaults={"json": name},
)
TakaheConfig.objects.update_or_create(
key="site_name",
user=None,
identity=None,
domain_id=domain,
defaults={"json": name},
)
TakaheConfig.objects.update_or_create(
key="site_icon",
user=None,
identity=None,
domain_id=None,
defaults={"json": icon},
)
TakaheConfig.objects.update_or_create(
key="site_icon",
user=None,
identity=None,
domain_id=domain,
defaults={"json": icon},
)
def sync_admin_user(self):
users = User.objects.filter(username__in=settings.SETUP_ADMIN_USERNAMES)
for user in users:
if user.is_superuser:
logger.debug(f"User {user.username} is already admin")
else:
user.is_superuser = True
user.save(update_fields=["is_superuser"])
TakaheUser.objects.filter(email=f"@{user.username}").update(admin=True)
logger.info(f"Updated user {user.username} as admin")
def run(self):
logger.info("Running post-migration setup...")
# Update site name if changed
self.sync_site_config()
# Create/update admin user if configured in env
self.sync_admin_user()
# Create basic emoji if not exists
# Create search index if not exists
Indexer.init()
# Register cron jobs if not yet
logger.info("Finished post-migration setup.")

View file

@ -9,6 +9,5 @@ echo NeoDB initializing...
takahe-manage migrate || exit $?
neodb-manage migrate || exit $?
neodb-manage setup || exit $?
echo NeoDB initialization complete.

View file

@ -16,6 +16,12 @@ service_domain = settings.SITE_INFO.get("site_service_domain")
def init_domain(apps, schema_editor):
User = apps.get_model("users", "User")
if not User.objects.exists():
logger.warning(
"No users found, skip domain migration (if you are running initial migration for new site, pls ignore this)"
)
return
d = TakaheDomain.objects.filter(domain=domain).first()
if not d:
logger.info(f"Creating takahe domain {domain}")
@ -54,6 +60,11 @@ def init_domain(apps, schema_editor):
def init_identity(apps, schema_editor):
User = apps.get_model("users", "User")
if not User.objects.exists():
logger.warning(
"No users found, skip identity migration (if you are running initial migration for new site, pls ignore this)"
)
return
APIdentity = apps.get_model("users", "APIdentity")
tdomain = TakaheDomain.objects.filter(domain=domain).first()
if User.objects.filter(username__isnull=True).exists():