-
Notifications
You must be signed in to change notification settings - Fork 3k
[WEB-5537]refactor: rename IssueUserProperty to ProjectUserProperty and update related references #8206
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: preview
Are you sure you want to change the base?
[WEB-5537]refactor: rename IssueUserProperty to ProjectUserProperty and update related references #8206
Changes from 7 commits
6a09e51
e43d9b6
f75d40f
d874227
280c3ce
e7cf8fa
2f0ea09
ab9a6b4
d75efb3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -26,14 +26,15 @@ | |
| from plane.bgtasks.webhook_task import model_activity, webhook_activity | ||
| from plane.db.models import ( | ||
| DeployBoard, | ||
| ProjectUserProperty, | ||
| Intake, | ||
| IssueUserProperty, | ||
| Project, | ||
| ProjectIdentifier, | ||
| ProjectMember, | ||
| ProjectNetwork, | ||
| State, | ||
| DEFAULT_STATES, | ||
| UserFavorite, | ||
| Workspace, | ||
| WorkspaceMember, | ||
| ) | ||
|
|
@@ -255,7 +256,7 @@ def create(self, request, slug): | |
| role=ROLE.ADMIN.value, | ||
| ) | ||
| # Also create the issue property for the user | ||
| _ = IssueUserProperty.objects.create(project_id=serializer.data["id"], user=request.user) | ||
| _ = ProjectUserProperty.objects.create(project_id=serializer.data["id"], user=request.user) | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Bug: Duplicate ProjectUserProperty creation causes IntegrityErrorThe Additional Locations (1) |
||
|
|
||
| if serializer.data["project_lead"] is not None and str(serializer.data["project_lead"]) != str( | ||
| request.user.id | ||
|
|
@@ -266,7 +267,7 @@ def create(self, request, slug): | |
| role=ROLE.ADMIN.value, | ||
| ) | ||
| # Also create the issue property for the user | ||
| IssueUserProperty.objects.create( | ||
| ProjectUserProperty.objects.create( | ||
| project_id=serializer.data["id"], | ||
| user_id=serializer.data["project_lead"], | ||
| ) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| # Generated by Django 4.2.25 on 2025-11-28 14:36 | ||
|
|
||
| from django.db import migrations, models | ||
| import plane.db.models.project | ||
| import django.db.models.deletion | ||
| from django.conf import settings | ||
|
|
||
| class Migration(migrations.Migration): | ||
|
|
||
| dependencies = [ | ||
| ('db', '0112_auto_20251124_0603'), | ||
| ] | ||
|
|
||
| operations = [ | ||
| migrations.AlterModelTable( | ||
| name='issueuserproperty', | ||
| table='project_user_properties', | ||
| ), | ||
| migrations.RenameModel( | ||
| old_name='IssueUserProperty', | ||
| new_name='ProjectUserProperty', | ||
| ), | ||
| migrations.AddField( | ||
| model_name='apitoken', | ||
| name='allowed_rate_limit', | ||
| field=models.CharField(default='60/min', max_length=255), | ||
| ), | ||
| migrations.AddField( | ||
| model_name='projectuserproperty', | ||
| name='preferences', | ||
| field=models.JSONField(default=plane.db.models.project.get_default_preferences), | ||
| ), | ||
| migrations.AddField( | ||
| model_name='projectuserproperty', | ||
| name='sort_order', | ||
| field=models.FloatField(default=65535), | ||
| ), | ||
| migrations.AlterModelOptions( | ||
| name='projectuserproperty', | ||
| options={'ordering': ('-created_at',), 'verbose_name': 'Project User Property', 'verbose_name_plural': 'Project User Properties'}, | ||
| ), | ||
| migrations.RemoveConstraint( | ||
| model_name='projectuserproperty', | ||
| name='issue_user_property_unique_user_project_when_deleted_at_null', | ||
| ), | ||
| migrations.AlterField( | ||
| model_name='projectuserproperty', | ||
| name='user', | ||
| field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='project_property_user', to=settings.AUTH_USER_MODEL), | ||
| ), | ||
| migrations.AddConstraint( | ||
| model_name='projectuserproperty', | ||
| constraint=models.UniqueConstraint(condition=models.Q(('deleted_at__isnull', True)), fields=('user', 'project'), name='project_user_property_unique_user_project_when_deleted_at_null'), | ||
| ), | ||
| ] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| # Generated by Django 4.2.25 on 2025-12-01 13:33 | ||
|
|
||
| from django.db import migrations | ||
|
|
||
| def move_issue_user_properties_to_project_user_properties(apps, schema_editor): | ||
| ProjectMember = apps.get_model('db', 'ProjectMember') | ||
| ProjectUserProperty = apps.get_model('db', 'ProjectUserProperty') | ||
|
|
||
| # Get all project members | ||
| project_members = ProjectMember.objects.filter(deleted_at__isnull=True).values('member_id', 'project_id', 'preferences', 'sort_order') | ||
|
|
||
| # create a mapping with consistent ordering | ||
| pm_dict = { | ||
| (pm['member_id'], pm['project_id']): pm | ||
| for pm in project_members | ||
| } | ||
|
|
||
| # Get all project user properties | ||
| properties_to_update = [] | ||
| for projectuserproperty in ProjectUserProperty.objects.filter(deleted_at__isnull=True): | ||
| pm = pm_dict.get((projectuserproperty.user_id, projectuserproperty.project_id)) | ||
| if pm: | ||
| projectuserproperty.preferences = pm['preferences'] | ||
| projectuserproperty.sort_order = pm['sort_order'] | ||
| properties_to_update.append(projectuserproperty) | ||
pablohashescobar marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| ProjectUserProperty.objects.bulk_update(properties_to_update, ['preferences', 'sort_order'], batch_size=2000) | ||
|
|
||
|
|
||
|
|
||
| def migrate_existing_api_tokens(apps, schema_editor): | ||
| APIToken = apps.get_model('db', 'APIToken') | ||
|
|
||
| # Update all the existing non-service api tokens to not have a workspace | ||
| APIToken.objects.filter(is_service=False).update( | ||
| workspace_id=None, | ||
| user__is_bot=False | ||
| ) | ||
pablohashescobar marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| return | ||
|
|
||
|
|
||
| class Migration(migrations.Migration): | ||
|
|
||
| dependencies = [ | ||
| ('db', '0113_alter_issueuserproperty_table'), | ||
| ] | ||
|
|
||
| operations = [ | ||
| migrations.RunPython(move_issue_user_properties_to_project_user_properties, reverse_code=migrations.RunPython.noop), | ||
| migrations.RunPython(migrate_existing_api_tokens, reverse_code=migrations.RunPython.noop), | ||
| ] | ||
Uh oh!
There was an error while loading. Please reload this page.