Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 1 addition & 12 deletions migrator/management/commands/migrate_old_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@
from migrator.utils import reset_sequence
from posts.jobs import job_compute_movement
from posts.services.common import compute_hotness
from projects.models import Project
from projects.permissions import ObjectPermission
from scoring.models import populate_medal_exclusion_records


Expand Down Expand Up @@ -59,15 +57,6 @@ def handle(self, *args, site_ids=None, **options):
call_command("makemigrations")
call_command("migrate")

Project.objects.get_or_create(
type=Project.ProjectTypes.SITE_MAIN,
defaults={
"name": "Metaculus Community",
"type": Project.ProjectTypes.SITE_MAIN,
"default_permission": ObjectPermission.FORECASTER,
},
)

# main model migration
migrate_users()
print("Migrated users")
Expand All @@ -85,7 +74,7 @@ def handle(self, *args, site_ids=None, **options):
print("Migrated comments")
migrate_comment_votes()
print("Migrated comment votes")
migrate_permissions()
migrate_permissions(site_ids=site_ids)
print("Migrated permissions")
migrate_mailgun_notification_preferences()
print("Migrated user notification preferences")
Expand Down
10 changes: 5 additions & 5 deletions migrator/services/migrate_permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ def convert_project_permissions(code):
}.get(code)


def migrate_common_permissions():
def migrate_common_permissions(site_ids: list):
"""
Migrates permissions from regular projects
"""
Expand Down Expand Up @@ -101,8 +101,8 @@ def migrate_common_permissions():
FROM metac_project_userprojectpermissions upp
JOIN metac_project_project p
ON upp.project_id = p.id
WHERE p.type != 'PP'
"""
WHERE p.type != 'PP' AND site_id in %s
""", [tuple(site_ids)]
):
# New app merges Project & Categories & Tags etc.
# Tournaments & QS & PP were migrated to Project model with the same Ids as the old ones.
Expand Down Expand Up @@ -329,8 +329,8 @@ def deduplicate_default_project_and_m2m():
PostProject.objects.filter(Exists(subquery)).delete()


def migrate_permissions():
def migrate_permissions(site_ids: list):
migrate_personal_projects()
migrate_common_permissions()
migrate_common_permissions(site_ids)
migrate_post_default_project()
deduplicate_default_project_and_m2m()
67 changes: 34 additions & 33 deletions migrator/services/migrate_projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ def create_project(project_obj: dict) -> Project:
"MP": Project.ProjectTypes.SITE_MAIN,
}.get(project_obj["type"])

# https://www.notion.so/metaculus/Private-Projects-that-aren-t-tournaments-or-question-series-should-become-private-question-series-02cb0bedd6a54650869879b6323d96ff
# Converting other types to QUESTION_SERIES
project_type = project_type or Project.ProjectTypes.QUESTION_SERIES

leaderboard_score_type = None
if project_type in [
Project.ProjectTypes.TOURNAMENT,
Expand All @@ -43,39 +47,36 @@ def create_project(project_obj: dict) -> Project:
elif project_obj["score_type"] == "SPOT_PEER_SCORE":
leaderboard_score_type = Leaderboard.ScoreTypes.SPOT_PEER_TOURNAMENT

if project_type == Project.ProjectTypes.SITE_MAIN:
project = Project.objects.get(type=project_type)
else:
project = Project(
# We keep original IDS for old projects
id=project_obj["id"],
type=project_type,
name=project_obj["name"],
slug=project_obj["slug"],
subtitle=project_obj["subtitle"],
description=project_obj["description"],
header_image=project_obj["header_image"],
header_logo=project_obj["header_logo"],
prize_pool=project_obj["prize_pool"],
close_date=project_obj["tournament_close_date"],
start_date=project_obj["tournament_start_date"],
sign_up_fields=sign_up_fields,
meta_description=project_obj["meta_description"],
created_at=project_obj["created_at"],
edited_at=project_obj["edited_at"],
# Old project.default_question_permissions was not working
# And project visibility was determined by `is_public` attr
default_permission=(
ObjectPermission.FORECASTER
if (project_obj["public"] and project_obj["id"] != 3349)
else None
),
)
project = Project(
# We keep original IDS for old projects
id=project_obj["id"],
type=project_type,
name=project_obj["name"],
slug=project_obj["slug"],
subtitle=project_obj["subtitle"],
description=project_obj["description"],
header_image=project_obj["header_image"],
header_logo=project_obj["header_logo"],
prize_pool=project_obj["prize_pool"],
close_date=project_obj["tournament_close_date"],
start_date=project_obj["tournament_start_date"],
sign_up_fields=sign_up_fields,
meta_description=project_obj["meta_description"],
created_at=project_obj["created_at"],
edited_at=project_obj["edited_at"],
# Old project.default_question_permissions was not working
# And project visibility was determined by `is_public` attr
default_permission=(
ObjectPermission.FORECASTER
if (project_obj["public"] and project_obj["id"] != 3349)
else None
),
)

if project_obj["id"] == 3349:
# the FAB project (id == 3349), was probably the only project using the default_question_permissions
# to make the project visible to everyone, but predictable only by the users added to the project
project.default_permission = ObjectPermission.VIEWER
if project_obj["id"] == 3349:
# the FAB project (id == 3349), was probably the only project using the default_question_permissions
# to make the project visible to everyone, but predictable only by the users added to the project
project.default_permission = ObjectPermission.VIEWER

project.save()
if leaderboard_score_type:
Expand Down Expand Up @@ -246,7 +247,7 @@ def migrate_projects(site_ids: list[int] = None):

for project_obj in paginated_query(
"SELECT * FROM metac_project_project "
"WHERE site_id in %s AND (type in ('TO', 'QS') OR (type = 'MP' and site_id = 1))",
"WHERE site_id in %s",
[tuple(site_ids)],
):
project = create_project(project_obj)
Expand Down
13 changes: 8 additions & 5 deletions migrator/services/migrate_questions.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
from posts.models import Notebook, Post, PostUserSnapshot
from projects.models import Project
from projects.permissions import ObjectPermission
from projects.services import get_site_main_project
from questions.constants import ResolutionType
from questions.models import Question, Conditional, GroupOfQuestions, Forecast
from utils.the_math.formulas import unscaled_location_to_string_location
Expand Down Expand Up @@ -147,7 +146,6 @@ def create_post(question: dict, **kwargs) -> Post:
published_at=question["publish_time"],
created_at=question["created_time"],
edited_at=question["edited_time"],
default_project=get_site_main_project(),
**kwargs,
)

Expand Down Expand Up @@ -434,7 +432,7 @@ def migrate_questions__notebook(root_questions: list[dict]):

notebook.save()
post.save()
post.projects.set([get_site_main_project(), *projects])
post.projects.set(projects)
post.save()


Expand Down Expand Up @@ -477,7 +475,7 @@ def get_children_relation_id_by_attr(id_attr: str):
)
except Exception:
old_question_yes = None

try:
old_question_no = next(
q for q in root_question["children"] if q["qc_resolution"] == 0
Expand All @@ -488,7 +486,12 @@ def get_children_relation_id_by_attr(id_attr: str):
condition_id = get_children_relation_id_by_attr("condition_id")
condition_child_id = get_children_relation_id_by_attr("condition_child_id")

if not condition_id or not condition_child_id or not old_question_yes or not old_question_no:
if (
not condition_id
or not condition_child_id
or not old_question_yes
or not old_question_no
):
print(
f"\n\nError migrating conditionl: {root_question['id']}Could not find all related questions for the conditional pair. old_question_yes: {old_question_yes}, old_question_no: {old_question_no}, condition_id: {condition_id}, condition_child_id: {condition_child_id}"
)
Expand Down