Browse Source

feat(doc integrations): Create DocIntegration table (#30506)

Colleen O'Rourke 3 years ago
parent
commit
654b57e4a2

+ 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: 0255_delete_code_mappings_with_no_integration
+sentry: 0256_create_docintegration_table
 social_auth: 0001_initial

+ 57 - 0
src/sentry/migrations/0256_create_docintegration_table.py

@@ -0,0 +1,57 @@
+# Generated by Django 2.2.24 on 2021-12-08 18:23
+
+from django.db import migrations, models
+
+import sentry.db.models.fields.bounded
+import sentry.db.models.fields.jsonfield
+
+
+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", "0255_delete_code_mappings_with_no_integration"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="DocIntegration",
+            fields=[
+                (
+                    "id",
+                    sentry.db.models.fields.bounded.BoundedBigAutoField(
+                        primary_key=True, serialize=False
+                    ),
+                ),
+                ("name", models.CharField(max_length=255)),
+                ("slug", models.CharField(max_length=64, unique=True)),
+                ("author", models.CharField(max_length=255)),
+                ("description", models.TextField()),
+                ("url", models.URLField()),
+                ("popularity", models.PositiveSmallIntegerField(default=1, null=True)),
+                ("is_draft", models.NullBooleanField(default=True)),
+                ("metadata", sentry.db.models.fields.jsonfield.JSONField(null=True)),
+            ],
+            options={
+                "db_table": "sentry_docintegration",
+            },
+        ),
+    ]

+ 26 - 0
src/sentry/models/integration.py

@@ -13,6 +13,7 @@ from sentry.db.models import (
     FlexibleForeignKey,
     Model,
 )
+from sentry.db.models.fields.jsonfield import JSONField
 from sentry.db.models.manager import BaseManager
 from sentry.signals import integration_added
 from sentry.tasks.code_owners import update_code_owners_schema
@@ -20,6 +21,31 @@ from sentry.tasks.code_owners import update_code_owners_schema
 logger = logging.getLogger(__name__)
 
 
+class DocIntegration(Model):
+    """
+    Document based integrations can be found in Sentry, but are installed via code change.
+    """
+
+    __include_in_export__ = False
+
+    name = models.CharField(max_length=255)
+    slug = models.CharField(max_length=64, unique=True)
+    author = models.CharField(max_length=255)
+    description = models.TextField()
+    url = models.URLField()
+    popularity = models.PositiveSmallIntegerField(null=True, default=1)
+    # Quickly hide/show integration, used for logo uploads
+    is_draft = models.NullBooleanField(default=True)
+
+    # Allow future extensions by adding more metadata.
+    # To start, only { resources: [{title, link}] }
+    metadata = JSONField(null=True)
+
+    class Meta:
+        app_label = "sentry"
+        db_table = "sentry_docintegration"
+
+
 class PagerDutyService(DefaultFieldsModel):
     __include_in_export__ = False