lib.itmens/mastodon/migrations/0005_socialaccount.py
2024-07-06 13:20:33 -04:00

186 lines
6.8 KiB
Python

# Generated by Django 4.2.13 on 2024-06-29 03:41
import django.db.models.deletion
import django.db.models.functions.text
import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
from tqdm import tqdm
from catalog.common import jsondata
def move_masto_email(apps, schema_editor):
User = apps.get_model("users", "User")
MastodonAccount = apps.get_model("mastodon", "MastodonAccount")
EmailAccount = apps.get_model("mastodon", "EmailAccount")
m = 0
e = 0
qs = User.objects.filter(username__isnull=True)
print(f"Deleting {qs.count()} nameless users.")
qs.delete()
for user in tqdm(User.objects.filter(is_active=True)):
if user.mastodon_username:
MastodonAccount.objects.update_or_create(
handle=f"{user.mastodon_username}@{user.mastodon_site}",
defaults={
"user": user,
"uid": user.mastodon_id,
"domain": user.mastodon_site,
"created": user.date_joined,
"last_refresh": user.mastodon_last_refresh,
"last_reachable": user.mastodon_last_reachable,
"followers": user.mastodon_followers,
"following": user.mastodon_following,
"blocks": user.mastodon_blocks,
"mutes": user.mastodon_mutes,
"domain_blocks": user.mastodon_domain_blocks,
"account_data": user.mastodon_account,
"access_data": {
"access_token": jsondata.encrypt_str(user.mastodon_token)
},
},
)
m += 1
if user.email:
EmailAccount.objects.update_or_create(
handle=user.email,
defaults={
"user": user,
"uid": user.email.split("@")[0],
"domain": user.email.split("@")[1],
"created": user.date_joined,
},
)
e += 1
print(f"{m} Mastodon, {e} Email migrated.")
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("mastodon", "0004_alter_mastodonapplication_api_domain_and_more"),
]
operations = [
migrations.CreateModel(
name="SocialAccount",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"type",
models.CharField(
choices=[
("mastodon.blueskyaccount", "bluesky account"),
("mastodon.emailaccount", "email account"),
("mastodon.mastodonaccount", "mastodon account"),
("mastodon.threadsaccount", "threads account"),
],
db_index=True,
max_length=255,
),
),
("domain", models.CharField(max_length=255)),
("uid", models.CharField(max_length=255)),
("handle", models.CharField(max_length=1000)),
("access_data", models.JSONField(default=dict)),
("account_data", models.JSONField(default=dict)),
("preference_data", models.JSONField(default=dict)),
("followers", models.JSONField(default=list)),
("following", models.JSONField(default=list)),
("mutes", models.JSONField(default=list)),
("blocks", models.JSONField(default=list)),
("domain_blocks", models.JSONField(default=list)),
("created", models.DateTimeField(default=django.utils.timezone.now)),
("modified", models.DateTimeField(auto_now=True)),
("last_refresh", models.DateTimeField(default=None, null=True)),
("last_reachable", models.DateTimeField(default=None, null=True)),
(
"user",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="social_accounts",
to=settings.AUTH_USER_MODEL,
),
),
],
),
migrations.CreateModel(
name="BlueskyAccount",
fields=[],
options={
"proxy": True,
"indexes": [],
"constraints": [],
},
bases=("mastodon.socialaccount",),
),
migrations.CreateModel(
name="EmailAccount",
fields=[],
options={
"proxy": True,
"indexes": [],
"constraints": [],
},
bases=("mastodon.socialaccount",),
),
migrations.CreateModel(
name="MastodonAccount",
fields=[],
options={
"proxy": True,
"indexes": [],
"constraints": [],
},
bases=("mastodon.socialaccount",),
),
migrations.CreateModel(
name="ThreadsAccount",
fields=[],
options={
"proxy": True,
"indexes": [],
"constraints": [],
},
bases=("mastodon.socialaccount",),
),
migrations.AddIndex(
model_name="socialaccount",
index=models.Index(
fields=["type", "handle"], name="index_social_type_handle"
),
),
migrations.AddIndex(
model_name="socialaccount",
index=models.Index(
fields=["type", "domain", "uid"], name="index_social_type_domain_uid"
),
),
migrations.AddConstraint(
model_name="socialaccount",
constraint=models.UniqueConstraint(
django.db.models.functions.text.Lower("domain"),
django.db.models.functions.text.Lower("uid"),
name="unique_social_domain_uid",
),
),
migrations.AddConstraint(
model_name="socialaccount",
constraint=models.UniqueConstraint(
models.F("type"),
django.db.models.functions.text.Lower("handle"),
name="unique_social_type_handle",
),
),
migrations.RunPython(move_masto_email),
]