Browse Source

feat(doc integrations): Add target_id and target_type columns (#30521)

* feat(doc integrations): Add target_id and target_type columns
Colleen O'Rourke 3 years ago
parent
commit
8a2ce81c3c

+ 1 - 1
migrations_lockfile.txt

@@ -6,5 +6,5 @@ To resolve this, rebase against latest master and regenerate your migration. Thi
 will then be regenerated, and you should be able to merge without conflicts.
 
 nodestore: 0002_nodestore_no_dictfield
-sentry: 0256_create_docintegration_table
+sentry: 0257_add_target_id_and_type_to_integrationfeature
 social_auth: 0001_initial

+ 53 - 0
src/sentry/migrations/0257_add_target_id_and_type_to_integrationfeature.py

@@ -0,0 +1,53 @@
+# Generated by Django 2.2.24 on 2021-12-09 17:58
+
+import django.db.models.deletion
+from django.db import migrations
+
+import sentry.db.models.fields.bounded
+import sentry.db.models.fields.foreignkey
+
+
+class Migration(migrations.Migration):
+    # This flag is used to mark that a migration shouldn't be automatically run in
+    # production. We set this to True for operations that we think are risky and want
+    # someone from ops to run manually and monitor.
+    # General advice is that if in doubt, mark your migration as `is_dangerous`.
+    # Some things you should always mark as dangerous:
+    # - Large data migrations. Typically we want these to be run manually by ops so that
+    #   they can be monitored. Since data migrations will now hold a transaction open
+    #   this is even more important.
+    # - Adding columns to highly active tables, even ones that are NULL.
+    is_dangerous = False
+
+    # This flag is used to decide whether to run this migration in a transaction or not.
+    # By default we prefer to run in a transaction, but for migrations where you want
+    # to `CREATE INDEX CONCURRENTLY` this needs to be set to False. Typically you'll
+    # want to create an index concurrently when adding one to an existing table.
+    # You'll also usually want to set this to `False` if you're writing a data
+    # migration, since we don't want the entire migration to run in one long-running
+    # transaction.
+    atomic = True
+
+    dependencies = [
+        ("sentry", "0256_create_docintegration_table"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="integrationfeature",
+            name="target_id",
+            field=sentry.db.models.fields.bounded.BoundedBigIntegerField(null=True),
+        ),
+        migrations.AddField(
+            model_name="integrationfeature",
+            name="target_type",
+            field=sentry.db.models.fields.bounded.BoundedPositiveIntegerField(default=0, null=True),
+        ),
+        migrations.AlterField(
+            model_name="integrationfeature",
+            name="sentry_app",
+            field=sentry.db.models.fields.foreignkey.FlexibleForeignKey(
+                null=True, on_delete=django.db.models.deletion.CASCADE, to="sentry.SentryApp"
+            ),
+        ),
+    ]

+ 25 - 2
src/sentry/models/integrationfeature.py

@@ -1,7 +1,14 @@
+from enum import Enum
+
 from django.db import models
 from django.utils import timezone
 
-from sentry.db.models import BoundedPositiveIntegerField, FlexibleForeignKey, Model
+from sentry.db.models import (
+    BoundedBigIntegerField,
+    BoundedPositiveIntegerField,
+    FlexibleForeignKey,
+    Model,
+)
 
 
 class Feature:
@@ -68,10 +75,26 @@ class Feature:
         )
 
 
+class IntegrationTypes(Enum):
+    SENTRY_APP = 0
+    DOC_INTEGRATION = 1
+
+
 class IntegrationFeature(Model):
     __include_in_export__ = False
 
-    sentry_app = FlexibleForeignKey("sentry.SentryApp")
+    sentry_app = FlexibleForeignKey("sentry.SentryApp", null=True)
+    # the id of the sentry_app or doc_integration
+    # TODO(CEO): change this to null=False
+    target_id = BoundedBigIntegerField(null=True)
+    target_type = BoundedPositiveIntegerField(
+        default=0,
+        null=True,
+        choices=(
+            (IntegrationTypes.SENTRY_APP, "sentry_app"),
+            (IntegrationTypes.DOC_INTEGRATION, "doc_integration"),
+        ),
+    )
     user_description = models.TextField(null=True)
     feature = BoundedPositiveIntegerField(default=0, choices=Feature.as_choices())
     date_added = models.DateTimeField(default=timezone.now)