diff --git a/catalog/jobs/discover.py b/catalog/jobs/discover.py index 9c552ec8..6a5f4cf1 100644 --- a/catalog/jobs/discover.py +++ b/catalog/jobs/discover.py @@ -147,14 +147,12 @@ class DiscoverGenerator(BaseJob): "pk", flat=True )[:20] ) - print(post_ids) if len(post_ids) < 30: post_ids |= set( Comment.objects.filter(visibility=0) .order_by("-created_time") .values_list("posts", flat=True)[:2] ) - print(post_ids) cache.set("public_gallery", gallery_list, timeout=None) cache.set("trends_links", trends, timeout=None) cache.set("featured_collections", collection_ids, timeout=None) diff --git a/catalog/migrations/0001_initial_0_10.py b/catalog/migrations/0001_initial_0_10.py new file mode 100644 index 00000000..caf594ef --- /dev/null +++ b/catalog/migrations/0001_initial_0_10.py @@ -0,0 +1,670 @@ +# Generated by Django 4.2.13 on 2024-06-08 17:40 + +import uuid + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + +import catalog.common.utils + + +class Migration(migrations.Migration): + """ + This migration is a combination of all the migrations til 0.10.0 + """ + + replaces = [ + ("catalog", "0001_initial"), + ("catalog", "0002_initial"), + ("catalog", "0003_podcast"), + ("catalog", "0004_podcast_no_real_change"), + ("catalog", "0005_bookstw"), + ("catalog", "0006_auto_20230602_0258"), + ("catalog", "0007_performance"), + ("catalog", "0008_delete_historicalitem"), + ("catalog", "0009_remove_tvepisode_show"), + ("catalog", "0010_alter_item_polymorphic_ctype"), + ("catalog", "0011_remove_item_last_editor"), + ("catalog", "0011_alter_externalresource_id_type_and_more"), + ("catalog", "0012_alter_model_i18n"), + ] + initial = True + + dependencies = [ + ("contenttypes", "0002_remove_content_type_name"), + ] + + operations = [ + migrations.CreateModel( + name="Item", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "uid", + models.UUIDField(db_index=True, default=uuid.uuid4, editable=False), + ), + ( + "title", + models.CharField(default="", max_length=1000, verbose_name="title"), + ), + ( + "brief", + models.TextField( + blank=True, default="", verbose_name="description" + ), + ), + ( + "primary_lookup_id_type", + models.CharField( + max_length=50, null=True, verbose_name="Primary ID Type" + ), + ), + ( + "primary_lookup_id_value", + models.CharField( + help_text="automatically detected, usually no change necessary, left empty if unsure", + max_length=1000, + null=True, + verbose_name="Primary ID Value", + ), + ), + ( + "metadata", + models.JSONField( + blank=True, default=dict, null=True, verbose_name="metadata" + ), + ), + ( + "cover", + models.ImageField( + blank=True, + default="item/default.svg", + upload_to=catalog.common.utils.item_cover_path, + verbose_name="cover", + ), + ), + ("created_time", models.DateTimeField(auto_now_add=True)), + ("edited_time", models.DateTimeField(auto_now=True)), + ("is_deleted", models.BooleanField(db_index=True, default=False)), + ( + "merged_to_item", + models.ForeignKey( + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="merged_from_items", + to="catalog.item", + ), + ), + ( + "polymorphic_ctype", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="polymorphic_%(app_label)s.%(class)s_set+", + to="contenttypes.contenttype", + ), + ), + ], + options={ + "index_together": { + ("primary_lookup_id_type", "primary_lookup_id_value") + }, + }, + ), + migrations.CreateModel( + name="Album", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="Collection", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="Edition", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="Game", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="Movie", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="Podcast", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="TVShow", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ( + "season_count", + models.IntegerField( + blank=True, null=True, verbose_name="number of seasons" + ), + ), + ( + "episode_count", + models.PositiveIntegerField( + blank=True, null=True, verbose_name="number of episodes" + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="Series", + fields=[], + options={ + "proxy": True, + "indexes": [], + "constraints": [], + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="Work", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ( + "editions", + models.ManyToManyField(related_name="works", to="catalog.edition"), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="TVSeason", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ( + "season_number", + models.PositiveIntegerField( + null=True, verbose_name="season number" + ), + ), + ( + "episode_count", + models.PositiveIntegerField( + null=True, verbose_name="number of episodes" + ), + ), + ( + "show", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="seasons", + to="catalog.tvshow", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="TVEpisode", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ("episode_number", models.PositiveIntegerField(null=True)), + ( + "season", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="episodes", + to="catalog.tvseason", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="PodcastEpisode", + fields=[ + ("description_html", models.TextField(null=True)), + ("cover_url", models.CharField(max_length=1000, null=True)), + ("media_url", models.CharField(max_length=1000, null=True)), + ("guid", models.CharField(max_length=1000, null=True)), + ( + "pub_date", + models.DateTimeField( + help_text="yyyy/mm/dd hh:mm", verbose_name="date of publication" + ), + ), + ("duration", models.PositiveIntegerField(null=True)), + ( + "program", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="episodes", + to="catalog.podcast", + ), + ), + ("link", models.CharField(max_length=1000, null=True)), + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ], + options={ + "unique_together": {("program", "guid")}, + "index_together": {("program", "pub_date")}, + }, + ), + migrations.CreateModel( + name="ExternalResource", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "id_type", + models.CharField( + choices=[ + ("wikidata", "WikiData"), + ("isbn10", "ISBN10"), + ("isbn", "ISBN"), + ("asin", "ASIN"), + ("issn", "ISSN"), + ("cubn", "CUBN"), + ("isrc", "ISRC"), + ("gtin", "GTIN UPC EAN"), + ("rss", "RSS Feed URL"), + ("imdb", "IMDb"), + ("tmdb_tv", "TMDB TV Serie"), + ("tmdb_tvseason", "TMDB TV Season"), + ("tmdb_tvepisode", "TMDB TV Episode"), + ("tmdb_movie", "TMDB Movie"), + ("goodreads", "Goodreads"), + ("goodreads_work", "Goodreads Work"), + ("googlebooks", "Google Books"), + ("doubanbook", "Douban Book"), + ("doubanbook_work", "Douban Book Work"), + ("doubanmovie", "Douban Movie"), + ("doubanmusic", "Douban Music"), + ("doubangame", "Douban Game"), + ("doubandrama", "Douban Drama"), + ("doubandrama_version", "Douban Drama Version"), + ("bookstw", "BooksTW Book"), + ("bandcamp", "Bandcamp"), + ("spotify_album", "Spotify Album"), + ("spotify_show", "Spotify Podcast"), + ("discogs_release", "Discogs Release"), + ("discogs_master", "Discogs Master"), + ("musicbrainz", "MusicBrainz ID"), + ("igdb", "IGDB Game"), + ("bgg", "BGG Boardgame"), + ("steam", "Steam Game"), + ("bangumi", "Bangumi"), + ("apple_podcast", "Apple Podcast"), + ("apple_music", "Apple Music"), + ("fedi", "Fediverse"), + ], + max_length=50, + verbose_name="IdType of the source site", + ), + ), + ( + "id_value", + models.CharField( + max_length=1000, verbose_name="Primary Id on the source site" + ), + ), + ( + "url", + models.CharField( + max_length=1000, unique=True, verbose_name="url to the resource" + ), + ), + ( + "cover", + models.ImageField( + blank=True, + default="item/default.svg", + upload_to=catalog.common.utils.resource_cover_path, + ), + ), + ("other_lookup_ids", models.JSONField(default=dict)), + ("metadata", models.JSONField(default=dict)), + ("scraped_time", models.DateTimeField(null=True)), + ("created_time", models.DateTimeField(auto_now_add=True)), + ("edited_time", models.DateTimeField(auto_now=True)), + ( + "item", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="external_resources", + to="catalog.item", + ), + ), + ], + options={ + "unique_together": {("id_type", "id_value")}, + }, + ), + migrations.CreateModel( + name="ItemLookupId", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "id_type", + models.CharField( + blank=True, + choices=[ + ("wikidata", "WikiData"), + ("isbn10", "ISBN10"), + ("isbn", "ISBN"), + ("asin", "ASIN"), + ("issn", "ISSN"), + ("cubn", "CUBN"), + ("isrc", "ISRC"), + ("gtin", "GTIN UPC EAN"), + ("rss", "RSS Feed URL"), + ("imdb", "IMDb"), + ("tmdb_tv", "TMDB TV Serie"), + ("tmdb_tvseason", "TMDB TV Season"), + ("tmdb_tvepisode", "TMDB TV Episode"), + ("tmdb_movie", "TMDB Movie"), + ("goodreads", "Goodreads"), + ("goodreads_work", "Goodreads Work"), + ("googlebooks", "Google Books"), + ("doubanbook", "Douban Book"), + ("doubanbook_work", "Douban Book Work"), + ("doubanmovie", "Douban Movie"), + ("doubanmusic", "Douban Music"), + ("doubangame", "Douban Game"), + ("doubandrama", "Douban Drama"), + ("doubandrama_version", "Douban Drama Version"), + ("bookstw", "BooksTW Book"), + ("bandcamp", "Bandcamp"), + ("spotify_album", "Spotify Album"), + ("spotify_show", "Spotify Podcast"), + ("discogs_release", "Discogs Release"), + ("discogs_master", "Discogs Master"), + ("musicbrainz", "MusicBrainz ID"), + ("igdb", "IGDB Game"), + ("bgg", "BGG Boardgame"), + ("steam", "Steam Game"), + ("bangumi", "Bangumi"), + ("apple_podcast", "Apple Podcast"), + ("apple_music", "Apple Music"), + ("fedi", "Fediverse"), + ], + max_length=50, + verbose_name="source site", + ), + ), + ( + "id_value", + models.CharField( + blank=True, max_length=1000, verbose_name="ID on source site" + ), + ), + ( + "raw_url", + models.CharField( + blank=True, + max_length=1000, + unique=True, + verbose_name="source url", + ), + ), + ( + "item", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="lookup_ids", + to="catalog.item", + ), + ), + ], + options={ + "unique_together": {("id_type", "id_value")}, + }, + ), + migrations.CreateModel( + name="Performance", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + migrations.CreateModel( + name="PerformanceProduction", + fields=[ + ( + "item_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="catalog.item", + ), + ), + ( + "show", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="productions", + to="catalog.performance", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("catalog.item",), + ), + ] diff --git a/journal/migrations/0001_initial_0_10.py b/journal/migrations/0001_initial_0_10.py new file mode 100644 index 00000000..aa7e623d --- /dev/null +++ b/journal/migrations/0001_initial_0_10.py @@ -0,0 +1,925 @@ +# Generated by Django 4.2.13 on 2024-06-08 19:21 + +import uuid + +import django.core.validators +import django.db.models.deletion +import django.utils.timezone +import markdownx.models +from django.db import migrations, models + +import catalog.common.utils +import journal.models.mixins + + +class Migration(migrations.Migration): + """ + This migration is a combination of all the migrations til 0.10.0 + """ + + replaces = [ + ("journal", "0001_initial"), + ("journal", "0002_initial"), + ("journal", "0003_auto_20230113_0506"), + ("journal", "0004_alter_shelflogentry_timestamp"), + ("journal", "0005_auto_20230114_1134"), + ("journal", "0006_auto_20230114_2139"), + ("journal", "0007_alter_collection_catalog_item"), + ("journal", "0008_alter_shelfmember_unique_together"), + ("journal", "0009_comment_focus_item"), + ("journal", "0010_shelfmember_journal_she_parent__9da946_idx"), + ("journal", "0011_performance"), + ("journal", "0012_alter_piece_polymorphic_ctype_alter_shelf_items"), + ("journal", "0013_remove_comment_focus_item"), + ( + "journal", + "0014_remove_reply_piece_ptr_remove_reply_reply_to_content_and_more", + ), + ("journal", "0015_use_identity_support_remote_piece"), + ("journal", "0016_piecepost_piece_posts_piecepost_unique_piece_post"), + ("journal", "0017_alter_piece_options_and_more"), + ("journal", "0018_shelflogentrypost_shelflogentry_posts_and_more"), + ("journal", "0019_alter_collection_edited_time_and_more"), + ("journal", "0020_shelflogentry_unique_shelf_log_entry"), + ("journal", "0021_pieceinteraction_pieceinteraction_unique_interaction"), + ("journal", "0022_letterboxdimporter"), + ("journal", "0023_debris"), + ("journal", "0024_i18n"), + ("journal", "0025_pin_tags"), + ("journal", "0026_pinned_tag_index"), + ] + initial = True + + dependencies = [ + ("contenttypes", "0002_remove_content_type_name"), + ("users", "0001_initial_0_10"), + ("catalog", "0001_initial_0_10"), + ("takahe", "0001_initial"), + ] + + operations = [ + migrations.CreateModel( + name="Piece", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "uid", + models.UUIDField(db_index=True, default=uuid.uuid4, editable=False), + ), + ("local", models.BooleanField(default=True)), + ( + "polymorphic_ctype", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="polymorphic_%(app_label)s.%(class)s_set+", + to="contenttypes.contenttype", + ), + ), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=(models.Model, journal.models.mixins.UserOwnedObjectMixin), + ), + migrations.CreateModel( + name="ShelfLogEntry", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "shelf_type", + models.CharField( + choices=[ + ("wishlist", "WISHLIST"), + ("progress", "PROGRESS"), + ("complete", "COMPLETE"), + ("dropped", "DROPPED"), + ], + max_length=100, + null=True, + ), + ), + ("timestamp", models.DateTimeField()), + ("created_time", models.DateTimeField(auto_now_add=True)), + ("edited_time", models.DateTimeField(auto_now=True)), + ( + "item", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="catalog.item" + ), + ), + ( + "owner", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="users.apidentity", + ), + ), + ], + ), + migrations.CreateModel( + name="LetterboxdImporter", + fields=[], + options={ + "proxy": True, + "indexes": [], + "constraints": [], + }, + bases=("users.task",), + ), + migrations.CreateModel( + name="Collection", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ("metadata", models.JSONField(default=dict)), + ( + "title", + models.CharField(default="", max_length=1000, verbose_name="title"), + ), + ( + "brief", + models.TextField( + blank=True, default="", verbose_name="description" + ), + ), + ( + "cover", + models.ImageField( + blank=True, + default="item/default.svg", + upload_to=catalog.common.utils.piece_cover_path, + ), + ), + ("collaborative", models.PositiveSmallIntegerField(default=0)), + ], + options={ + "abstract": False, + }, + bases=("journal.piece",), + ), + migrations.CreateModel( + name="CollectionMember", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ("metadata", models.JSONField(default=dict)), + ("position", models.PositiveIntegerField()), + ], + options={ + "abstract": False, + }, + bases=("journal.piece",), + ), + migrations.CreateModel( + name="Comment", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ("metadata", models.JSONField(default=dict)), + ( + "remote_id", + models.CharField(default=None, max_length=200, null=True), + ), + ("text", models.TextField()), + ], + options={ + "abstract": False, + }, + bases=("journal.piece",), + ), + migrations.CreateModel( + name="Debris", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ("metadata", models.JSONField(default=dict)), + ( + "remote_id", + models.CharField(default=None, max_length=200, null=True), + ), + ("class_name", models.CharField(max_length=50)), + ], + options={ + "abstract": False, + }, + bases=("journal.piece",), + ), + migrations.CreateModel( + name="FeaturedCollection", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("created_time", models.DateTimeField(auto_now_add=True)), + ("edited_time", models.DateTimeField(auto_now=True)), + ], + bases=("journal.piece",), + ), + migrations.CreateModel( + name="Like", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ], + options={ + "abstract": False, + "base_manager_name": "objects", + }, + bases=("journal.piece",), + ), + migrations.CreateModel( + name="Rating", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ("metadata", models.JSONField(default=dict)), + ( + "remote_id", + models.CharField(default=None, max_length=200, null=True), + ), + ( + "grade", + models.PositiveSmallIntegerField( + default=0, + null=True, + validators=[ + django.core.validators.MaxValueValidator(10), + django.core.validators.MinValueValidator(1), + ], + ), + ), + ], + bases=("journal.piece",), + ), + migrations.CreateModel( + name="Review", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ("metadata", models.JSONField(default=dict)), + ( + "remote_id", + models.CharField(default=None, max_length=200, null=True), + ), + ("title", models.CharField(max_length=500)), + ("body", markdownx.models.MarkdownxField()), + ], + options={ + "abstract": False, + }, + bases=("journal.piece",), + ), + migrations.CreateModel( + name="Shelf", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ("metadata", models.JSONField(default=dict)), + ( + "shelf_type", + models.CharField( + choices=[ + ("wishlist", "WISHLIST"), + ("progress", "PROGRESS"), + ("complete", "COMPLETE"), + ("dropped", "DROPPED"), + ], + max_length=100, + ), + ), + ], + bases=("journal.piece",), + ), + migrations.CreateModel( + name="Tag", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ("metadata", models.JSONField(default=dict)), + ( + "title", + models.CharField( + max_length=100, + validators=[ + django.core.validators.RegexValidator( + inverse_match=True, regex="\\s+" + ) + ], + ), + ), + ("pinned", models.BooleanField(default=False, null=True)), + ], + bases=("journal.piece",), + ), + migrations.CreateModel( + name="ShelfLogEntryPost", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "log_entry", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="journal.shelflogentry", + ), + ), + ( + "post", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.CASCADE, + to="takahe.post", + ), + ), + ], + ), + migrations.AddField( + model_name="shelflogentry", + name="posts", + field=models.ManyToManyField( + related_name="log_entries", + through="journal.ShelfLogEntryPost", + to="takahe.post", + ), + ), + migrations.CreateModel( + name="PiecePost", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "piece", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="journal.piece" + ), + ), + ( + "post", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.CASCADE, + to="takahe.post", + ), + ), + ], + ), + migrations.CreateModel( + name="PieceInteraction", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("target_type", models.CharField(max_length=50)), + ("interaction_type", models.CharField(max_length=50)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ( + "identity", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="interactions", + to="users.apidentity", + ), + ), + ( + "target", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="interactions", + to="journal.piece", + ), + ), + ], + ), + migrations.AddField( + model_name="piece", + name="posts", + field=models.ManyToManyField( + related_name="pieces", through="journal.PiecePost", to="takahe.post" + ), + ), + migrations.CreateModel( + name="TagMember", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ("metadata", models.JSONField(default=dict)), + ("position", models.PositiveIntegerField()), + ( + "item", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="catalog.item" + ), + ), + ( + "owner", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="users.apidentity", + ), + ), + ( + "parent", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="members", + to="journal.tag", + ), + ), + ], + bases=("journal.piece",), + ), + migrations.AddField( + model_name="tag", + name="items", + field=models.ManyToManyField( + through="journal.TagMember", to="catalog.item" + ), + ), + migrations.AddField( + model_name="tag", + name="owner", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" + ), + ), + migrations.CreateModel( + name="ShelfMember", + fields=[ + ( + "piece_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="journal.piece", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "created_time", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("edited_time", models.DateTimeField(auto_now=True)), + ("metadata", models.JSONField(default=dict)), + ("position", models.PositiveIntegerField()), + ( + "item", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="catalog.item" + ), + ), + ( + "owner", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="users.apidentity", + ), + ), + ( + "parent", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="members", + to="journal.shelf", + ), + ), + ], + bases=("journal.piece",), + ), + migrations.AddConstraint( + model_name="shelflogentrypost", + constraint=models.UniqueConstraint( + fields=("log_entry", "post"), name="unique_log_entry_post" + ), + ), + migrations.AddConstraint( + model_name="shelflogentry", + constraint=models.UniqueConstraint( + fields=("owner", "item", "timestamp", "shelf_type"), + name="unique_shelf_log_entry", + ), + ), + migrations.AddField( + model_name="shelf", + name="items", + field=models.ManyToManyField( + related_name="+", through="journal.ShelfMember", to="catalog.item" + ), + ), + migrations.AddField( + model_name="shelf", + name="owner", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" + ), + ), + migrations.AddField( + model_name="review", + name="item", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="catalog.item" + ), + ), + migrations.AddField( + model_name="review", + name="owner", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" + ), + ), + migrations.AddField( + model_name="rating", + name="item", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="catalog.item" + ), + ), + migrations.AddField( + model_name="rating", + name="owner", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" + ), + ), + migrations.AddConstraint( + model_name="piecepost", + constraint=models.UniqueConstraint( + fields=("piece", "post"), name="unique_piece_post" + ), + ), + migrations.AddIndex( + model_name="pieceinteraction", + index=models.Index( + fields=["identity", "interaction_type", "created_time"], + name="journal_pie_identit_bd12d3_idx", + ), + ), + migrations.AddIndex( + model_name="pieceinteraction", + index=models.Index( + fields=["target", "interaction_type", "created_time"], + name="journal_pie_target__f943ca_idx", + ), + ), + migrations.AddConstraint( + model_name="pieceinteraction", + constraint=models.UniqueConstraint( + fields=("identity", "interaction_type", "target"), + name="unique_interaction", + ), + ), + migrations.AddField( + model_name="like", + name="owner", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" + ), + ), + migrations.AddField( + model_name="like", + name="target", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="likes", + to="journal.piece", + ), + ), + migrations.AddField( + model_name="featuredcollection", + name="owner", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="users.apidentity" + ), + ), + migrations.AddField( + model_name="featuredcollection", + name="target", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="journal.collection" + ), + ), + migrations.AddField( + model_name="debris", + name="item", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="catalog.item" + ), + ), + migrations.AddField( + model_name="debris", + name="owner", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" + ), + ), + migrations.AddField( + model_name="comment", + name="item", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="catalog.item" + ), + ), + migrations.AddField( + model_name="comment", + name="owner", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" + ), + ), + migrations.AddField( + model_name="collectionmember", + name="item", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="catalog.item" + ), + ), + migrations.AddField( + model_name="collectionmember", + name="owner", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" + ), + ), + migrations.AddField( + model_name="collectionmember", + name="parent", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="members", + to="journal.collection", + ), + ), + migrations.AddField( + model_name="collection", + name="catalog_item", + field=models.OneToOneField( + on_delete=django.db.models.deletion.PROTECT, + related_name="journal_item", + to="catalog.collection", + ), + ), + migrations.AddField( + model_name="collection", + name="featured_by", + field=models.ManyToManyField( + related_name="featured_collections", + through="journal.FeaturedCollection", + to="users.apidentity", + ), + ), + migrations.AddField( + model_name="collection", + name="items", + field=models.ManyToManyField( + related_name="collections", + through="journal.CollectionMember", + to="catalog.item", + ), + ), + migrations.AddField( + model_name="collection", + name="owner", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" + ), + ), + migrations.AlterUniqueTogether( + name="tagmember", + unique_together={("parent", "item")}, + ), + migrations.AddIndex( + model_name="tag", + index=models.Index( + fields=["owner", "pinned"], name="journal_tag_owner_i_068598_idx" + ), + ), + migrations.AlterUniqueTogether( + name="tag", + unique_together={("owner", "title")}, + ), + migrations.AddIndex( + model_name="shelfmember", + index=models.Index( + fields=["parent_id", "visibility", "created_time"], + name="journal_she_parent__9da946_idx", + ), + ), + migrations.AlterUniqueTogether( + name="shelfmember", + unique_together={("owner", "item")}, + ), + migrations.AlterUniqueTogether( + name="shelf", + unique_together={("owner", "shelf_type")}, + ), + migrations.AlterUniqueTogether( + name="rating", + unique_together={("owner", "item")}, + ), + migrations.AlterUniqueTogether( + name="featuredcollection", + unique_together={("owner", "target")}, + ), + ] diff --git a/journal/migrations/0014_alter_piece_options_piece_local_piece_post_id_and_more.py b/journal/migrations/0014_alter_piece_options_piece_local_piece_post_id_and_more.py deleted file mode 100644 index c6f07aba..00000000 --- a/journal/migrations/0014_alter_piece_options_piece_local_piece_post_id_and_more.py +++ /dev/null @@ -1,50 +0,0 @@ -# Generated by Django 4.2.3 on 2023-08-06 02:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ( - "journal", - "0014_remove_reply_piece_ptr_remove_reply_reply_to_content_and_more", - ), - ] - - operations = [ - migrations.AlterModelOptions( - name="piece", - options={}, - ), - migrations.AddField( - model_name="piece", - name="local", - field=models.BooleanField(default=True), - ), - migrations.AddField( - model_name="piece", - name="post_id", - field=models.BigIntegerField(default=None, null=True), - ), - migrations.AddField( - model_name="comment", - name="remote_id", - field=models.CharField(default=None, max_length=200, null=True), - ), - migrations.AddField( - model_name="rating", - name="remote_id", - field=models.CharField(default=None, max_length=200, null=True), - ), - migrations.AddField( - model_name="review", - name="remote_id", - field=models.CharField(default=None, max_length=200, null=True), - ), - migrations.AddIndex( - model_name="piece", - index=models.Index( - fields=["post_id"], name="journal_pie_post_id_6a74ff_idx" - ), - ), - ] diff --git a/journal/migrations/0015_alter_collection_featured_by_users_and_more.py b/journal/migrations/0015_alter_collection_featured_by_users_and_more.py deleted file mode 100644 index 52726daf..00000000 --- a/journal/migrations/0015_alter_collection_featured_by_users_and_more.py +++ /dev/null @@ -1,111 +0,0 @@ -# Generated by Django 4.2.4 on 2023-08-09 13:26 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("users", "0013_init_identity"), - ("journal", "0014_alter_piece_options_piece_local_piece_post_id_and_more"), - ] - - operations = [ - migrations.RemoveField( - model_name="collection", - name="featured_by_users", - ), - migrations.AddField( - model_name="collection", - name="featured_by", - field=models.ManyToManyField( - related_name="featured_collections", - through="journal.FeaturedCollection", - to="users.apidentity", - ), - ), - migrations.AlterField( - model_name="collection", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="collectionmember", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="comment", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="featuredcollection", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="like", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="rating", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="review", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="shelf", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="shelflogentry", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="shelfmember", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="tag", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - migrations.AlterField( - model_name="tagmember", - name="owner", - field=models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, to="users.apidentity" - ), - ), - ] diff --git a/journal/migrations/0015_use_identity_support_remote_piece.py b/journal/migrations/0015_use_identity_support_remote_piece.py index 0ed2b9c6..3bab4e60 100644 --- a/journal/migrations/0015_use_identity_support_remote_piece.py +++ b/journal/migrations/0015_use_identity_support_remote_piece.py @@ -5,12 +5,6 @@ from django.db import migrations, models class Migration(migrations.Migration): - - replaces = [ - ("journal", "0014_alter_piece_options_piece_local_piece_post_id_and_more"), - ("journal", "0015_alter_collection_featured_by_users_and_more"), - ] - dependencies = [ ( "journal", diff --git a/social/migrations/0001_initial_0_10.py b/social/migrations/0001_initial_0_10.py new file mode 100644 index 00000000..250633f4 --- /dev/null +++ b/social/migrations/0001_initial_0_10.py @@ -0,0 +1,86 @@ +# Generated by Django 4.2.13 on 2024-06-08 18:14 + +import django.db.models.deletion +import django.utils.timezone +from django.conf import settings +from django.db import migrations, models + +import journal.models.mixins + + +class Migration(migrations.Migration): + """ + This migration is a combination of all the migrations til 0.10.0 + """ + + replaces = [ + ("social", "0001_initial"), + ("social", "0002_initial"), + ("social", "0003_alter_localactivity_template"), + ("social", "0004_alter_localactivity_template"), + ("social", "0005_alter_localactivity_template"), + ("social", "0006_alter_localactivity_template"), + ("social", "0007_alter_localactivity_owner"), + ] + + initial = True + + dependencies = [ + ("users", "0001_initial_0_10"), + ("journal", "0001_initial_0_10"), + ] + + operations = [ + migrations.CreateModel( + name="LocalActivity", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("visibility", models.PositiveSmallIntegerField(default=0)), + ( + "template", + models.CharField( + choices=[ + ("mark_item", "Markitem"), + ("review_item", "Reviewitem"), + ("create_collection", "Createcollection"), + ("like_collection", "Likecollection"), + ("feature_collection", "Featurecollection"), + ("comment_child_item", "Commentchilditem"), + ], + max_length=50, + ), + ), + ( + "created_time", + models.DateTimeField( + db_index=True, default=django.utils.timezone.now + ), + ), + ( + "action_object", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="journal.piece" + ), + ), + ( + "owner", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="users.apidentity", + ), + ), + ], + options={ + "index_together": {("owner", "created_time")}, + }, + bases=(models.Model, journal.models.mixins.UserOwnedObjectMixin), + ), + ] diff --git a/users/migrations/0001_initial_0_10.py b/users/migrations/0001_initial_0_10.py new file mode 100644 index 00000000..9d0c0731 --- /dev/null +++ b/users/migrations/0001_initial_0_10.py @@ -0,0 +1,573 @@ +# Generated by Django 4.2.13 on 2024-06-08 17:50 + +import django.core.serializers.json +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 + +import users.models.user + + +class Migration(migrations.Migration): + """ + This migration is a combination of all the migrations til 0.10.0 + """ + + replaces = [ + ("users", "0001_initial"), + ("users", "0002_preference_default_no_share"), + ("users", "0003_preference_discover_layout"), + ("users", "0004_alter_preference_classic_homepage"), + ("users", "0005_add_dedicated_username"), + ("users", "0006_unique_email"), + ("users", "0007_user_pending_email"), + ("users", "0008_user_at_least_one_login_method"), + ("users", "0007_username_case_insensitive"), + ("users", "0009_add_local_follow"), + ("users", "0010_add_local_mute_block"), + ("users", "0011_preference_hidden_categories"), + ("users", "0015_user_mastodon_last_reachable"), + ("users", "0012_apidentity"), + ("users", "0013_init_identity"), + ("users", "0014_preference_mastodon_skip_relationship_and_more"), + ("users", "0015_remove_preference_mastodon_publish_public_and_more"), + ("users", "0016_rename_preference_default_no_share"), + ("users", "0017_mastodon_site_username_bd2db5_idx"), + ("users", "0018_apidentity_anonymous_viewable"), + ("users", "0019_task"), + ("users", "0020_user_language"), + ("users", "0021_alter_user_language"), + ] + initial = True + + dependencies = [ + ("takahe", "0001_initial"), + ("auth", "0012_alter_user_first_name_max_length"), + ] + + operations = [ + migrations.CreateModel( + name="User", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("password", models.CharField(max_length=128, verbose_name="password")), + ( + "last_login", + models.DateTimeField( + blank=True, null=True, verbose_name="last login" + ), + ), + ( + "is_superuser", + models.BooleanField( + default=False, + help_text="Designates that this user has all permissions without explicitly assigning them.", + verbose_name="superuser status", + ), + ), + ( + "first_name", + models.CharField( + blank=True, max_length=150, verbose_name="first name" + ), + ), + ( + "last_name", + models.CharField( + blank=True, max_length=150, verbose_name="last name" + ), + ), + ( + "email", + models.EmailField( + default=None, + max_length=254, + null=True, + unique=True, + verbose_name="email address", + ), + ), + ( + "is_staff", + models.BooleanField( + default=False, + help_text="Designates whether the user can log into this admin site.", + verbose_name="staff status", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", + verbose_name="active", + ), + ), + ( + "date_joined", + models.DateTimeField( + default=django.utils.timezone.now, verbose_name="date joined" + ), + ), + ( + "username", + models.CharField( + error_messages={ + "unique": "A user with that username already exists." + }, + help_text="Required. 50 characters or fewer. Letters, digits and _ only.", + max_length=100, + null=True, + unique=True, + validators=[users.models.user.UsernameValidator()], + verbose_name="username", + ), + ), + ("following", models.JSONField(default=list)), + ( + "mastodon_id", + models.CharField(default=None, max_length=100, null=True), + ), + ( + "mastodon_site", + models.CharField(default=None, max_length=100, null=True), + ), + ("mastodon_token", models.CharField(default="", max_length=2048)), + ( + "mastodon_refresh_token", + models.CharField(default="", max_length=2048), + ), + ("mastodon_locked", models.BooleanField(default=False)), + ("mastodon_followers", models.JSONField(default=list)), + ("mastodon_following", models.JSONField(default=list)), + ("mastodon_mutes", models.JSONField(default=list)), + ("mastodon_blocks", models.JSONField(default=list)), + ("mastodon_domain_blocks", models.JSONField(default=list)), + ("mastodon_account", models.JSONField(default=dict)), + ( + "mastodon_last_refresh", + models.DateTimeField(default=django.utils.timezone.now), + ), + ("read_announcement_index", models.PositiveIntegerField(default=0)), + ( + "groups", + models.ManyToManyField( + blank=True, + help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", + related_name="user_set", + related_query_name="user", + to="auth.group", + verbose_name="groups", + ), + ), + ( + "user_permissions", + models.ManyToManyField( + blank=True, + help_text="Specific permissions for this user.", + related_name="user_set", + related_query_name="user", + to="auth.permission", + verbose_name="user permissions", + ), + ), + ( + "mastodon_username", + models.CharField(default=None, max_length=100, null=True), + ), + ( + "pending_email", + models.EmailField( + default=None, + max_length=254, + null=True, + verbose_name="email address pending verification", + ), + ), + ], + ), + migrations.CreateModel( + name="Preference", + fields=[ + ( + "user", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + primary_key=True, + serialize=False, + to=settings.AUTH_USER_MODEL, + ), + ), + ("profile_layout", models.JSONField(blank=True, default=list)), + ( + "export_status", + models.JSONField( + blank=True, + default=dict, + encoder=django.core.serializers.json.DjangoJSONEncoder, + null=True, + ), + ), + ( + "import_status", + models.JSONField( + blank=True, + default=dict, + encoder=django.core.serializers.json.DjangoJSONEncoder, + null=True, + ), + ), + ("default_visibility", models.PositiveSmallIntegerField(default=0)), + ("classic_homepage", models.PositiveSmallIntegerField(default=0)), + ("mastodon_publish_public", models.BooleanField(default=False)), + ("mastodon_append_tag", models.CharField(default="", max_length=2048)), + ("show_last_edit", models.PositiveSmallIntegerField(default=0)), + ("no_anonymous_view", models.PositiveSmallIntegerField(default=0)), + ("default_no_share", models.BooleanField(default=False)), + ("discover_layout", models.JSONField(blank=True, default=list)), + ], + ), + migrations.AddConstraint( + model_name="user", + constraint=models.CheckConstraint( + check=models.Q( + ("is_active", False), + ("mastodon_username__isnull", False), + ("email__isnull", False), + _connector="OR", + ), + name="at_least_one_login_method", + ), + ), + migrations.AddConstraint( + model_name="user", + constraint=models.UniqueConstraint( + django.db.models.functions.text.Lower("email"), name="unique_email" + ), + ), + migrations.AddConstraint( + model_name="user", + constraint=models.UniqueConstraint( + django.db.models.functions.text.Lower("username"), + name="unique_username", + ), + ), + migrations.AddConstraint( + model_name="user", + constraint=models.UniqueConstraint( + django.db.models.functions.text.Lower("mastodon_username"), + django.db.models.functions.text.Lower("mastodon_site"), + name="unique_mastodon_username", + ), + ), + migrations.AddConstraint( + model_name="user", + constraint=models.UniqueConstraint( + django.db.models.functions.text.Lower("mastodon_id"), + django.db.models.functions.text.Lower("mastodon_site"), + name="unique_mastodon_id", + ), + ), + migrations.CreateModel( + name="Follow", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("created_time", models.DateTimeField(auto_now_add=True)), + ("edited_time", models.DateTimeField(auto_now=True)), + ( + "owner", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "target", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + migrations.AddField( + model_name="user", + name="local_following", + field=models.ManyToManyField( + related_name="local_followers", + through="users.Follow", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="user", + name="muting", + field=models.JSONField(default=list), + ), + migrations.AddField( + model_name="user", + name="rejecting", + field=models.JSONField(default=list), + ), + migrations.CreateModel( + name="Mute", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("created_time", models.DateTimeField(auto_now_add=True)), + ("edited_time", models.DateTimeField(auto_now=True)), + ( + "owner", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "target", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + migrations.CreateModel( + name="Block", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("created_time", models.DateTimeField(auto_now_add=True)), + ("edited_time", models.DateTimeField(auto_now=True)), + ( + "owner", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "target", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + migrations.AddField( + model_name="user", + name="local_blocking", + field=models.ManyToManyField( + related_name="local_blocked_by", + through="users.Block", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="user", + name="local_muting", + field=models.ManyToManyField( + related_name="+", through="users.Mute", to=settings.AUTH_USER_MODEL + ), + ), + migrations.AddField( + model_name="preference", + name="hidden_categories", + field=models.JSONField(default=list), + ), + migrations.AddField( + model_name="user", + name="mastodon_last_reachable", + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.CreateModel( + name="APIdentity", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("local", models.BooleanField()), + ("username", models.CharField(blank=True, max_length=500, null=True)), + ( + "domain_name", + models.CharField(blank=True, max_length=500, null=True), + ), + ("deleted", models.DateTimeField(blank=True, null=True)), + ( + "user", + models.OneToOneField( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="identity", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "indexes": [ + models.Index( + fields=["local", "username"], + name="users_apide_local_2d8170_idx", + ), + models.Index( + fields=["domain_name", "username"], + name="users_apide_domain__53ffa5_idx", + ), + ], + }, + ), + migrations.AddField( + model_name="preference", + name="mastodon_skip_relationship", + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name="preference", + name="mastodon_skip_userinfo", + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name="preference", + name="mastodon_repost_mode", + field=models.PositiveSmallIntegerField(default=0), + ), + migrations.AddField( + model_name="preference", + name="post_public_mode", + field=models.PositiveSmallIntegerField(default=0), + ), + migrations.AlterField( + model_name="preference", + name="show_last_edit", + field=models.PositiveSmallIntegerField(default=1), + ), + migrations.RemoveField( + model_name="preference", + name="mastodon_publish_public", + ), + migrations.AddField( + model_name="preference", + name="mastodon_default_repost", + field=models.BooleanField(default=True), + ), + migrations.RemoveField( + model_name="preference", + name="default_no_share", + ), + migrations.AddIndex( + model_name="user", + index=models.Index( + fields=["mastodon_site", "mastodon_username"], + name="users_user_mastodo_bd2db5_idx", + ), + ), + migrations.AddField( + model_name="apidentity", + name="anonymous_viewable", + field=models.BooleanField(default=True), + ), + migrations.CreateModel( + name="Task", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("type", models.CharField(max_length=20)), + ( + "state", + models.IntegerField( + choices=[ + (0, "Pending"), + (1, "Started"), + (2, "Complete"), + (3, "Failed"), + ], + default=0, + ), + ), + ("metadata", models.JSONField(default=dict)), + ("message", models.TextField(default="")), + ("created_time", models.DateTimeField(auto_now_add=True)), + ("edited_time", models.DateTimeField(auto_now=True)), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "indexes": [ + models.Index( + fields=["user", "type"], name="users_task_user_id_e29f34_idx" + ) + ], + }, + ), + migrations.AddField( + model_name="user", + name="language", + field=models.CharField( + choices=[ + ("en", "English"), + ("zh-hans", "Simplified Chinese"), + ("zh-hant", "Traditional Chinese"), + ], + default="en", + max_length=10, + verbose_name="language", + ), + ), + ]