Skip to content

Commit be70835

Browse files
authored
feat: Create new repository settings table (#104645)
This PR aims to create our new repository settings table, with a foreign key back to the organization repository table. Table currently stores if code review is enabled, as well as the triggers associated with it being enabled. The triggers are associated with the enum CodeReviewTrigger, also instantiated on the model Closes https://linear.app/getsentry/issue/ENG-6089/create-repository-settings-table <!-- Sentry employees and contractors can delete or ignore the following. --> ### Legal Boilerplate Look, I get it. The entity doing business as "Sentry" was incorporated in the State of Delaware in 2015 as Functional Software, Inc. and is gonna need some rights from me in order to utilize my contributions in this here PR. So here's the deal: I retain all rights, title and interest in and to my contributions, and by keeping this boilerplate intact I confirm that Sentry can use, modify, copy, and redistribute my contributions, under Sentry's choice of terms.
1 parent 4fd4f6d commit be70835

File tree

5 files changed

+116
-1
lines changed

5 files changed

+116
-1
lines changed

migrations_lockfile.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ releases: 0004_cleanup_failed_safe_deletes
3131

3232
replays: 0006_add_bulk_delete_job
3333

34-
sentry: 1012_add_event_id_to_open_period
34+
sentry: 1013_add_repositorysettings_table
3535

3636
social_auth: 0003_social_auth_json_field
3737

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Generated by Django 5.2.8 on 2025-12-09 22:43
2+
3+
import django.contrib.postgres.fields
4+
import django.db.models.deletion
5+
from django.db import migrations, models
6+
7+
import sentry.db.models.fields.bounded
8+
import sentry.db.models.fields.foreignkey
9+
from sentry.new_migrations.migrations import CheckedMigration
10+
11+
12+
class Migration(CheckedMigration):
13+
# This flag is used to mark that a migration shouldn't be automatically run in production.
14+
# This should only be used for operations where it's safe to run the migration after your
15+
# code has deployed. So this should not be used for most operations that alter the schema
16+
# of a table.
17+
# Here are some things that make sense to mark as post deployment:
18+
# - Large data migrations. Typically we want these to be run manually so that they can be
19+
# monitored and not block the deploy for a long period of time while they run.
20+
# - Adding indexes to large tables. Since this can take a long time, we'd generally prefer to
21+
# run this outside deployments so that we don't block them. Note that while adding an index
22+
# is a schema change, it's completely safe to run the operation after the code has deployed.
23+
# Once deployed, run these manually via: https://develop.sentry.dev/database-migrations/#migration-deployment
24+
25+
is_post_deployment = False
26+
27+
dependencies = [
28+
("sentry", "1012_add_event_id_to_open_period"),
29+
]
30+
31+
operations = [
32+
migrations.CreateModel(
33+
name="RepositorySettings",
34+
fields=[
35+
(
36+
"id",
37+
sentry.db.models.fields.bounded.BoundedBigAutoField(
38+
primary_key=True, serialize=False
39+
),
40+
),
41+
("enabled_code_review", models.BooleanField(default=False)),
42+
(
43+
"code_review_triggers",
44+
django.contrib.postgres.fields.ArrayField(
45+
base_field=models.CharField(max_length=32), default=list, size=None
46+
),
47+
),
48+
(
49+
"repository",
50+
sentry.db.models.fields.foreignkey.FlexibleForeignKey(
51+
on_delete=django.db.models.deletion.CASCADE,
52+
to="sentry.repository",
53+
unique=True,
54+
),
55+
),
56+
],
57+
options={
58+
"db_table": "sentry_repositorysettings",
59+
},
60+
),
61+
]

src/sentry/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
from .releaseprojectenvironment import * # NOQA
105105
from .releases.release_project import * # NOQA
106106
from .repository import * # NOQA
107+
from .repositorysettings import * # NOQA
107108
from .rollbackorganization import * # NOQA
108109
from .rollbackuser import * # NOQA
109110
from .rule import * # NOQA
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from __future__ import annotations
2+
3+
from enum import StrEnum
4+
5+
from django.contrib.postgres.fields.array import ArrayField
6+
from django.db import models
7+
8+
from sentry.backup.scopes import RelocationScope
9+
from sentry.db.models import FlexibleForeignKey, Model, region_silo_model, sane_repr
10+
11+
12+
class CodeReviewTrigger(StrEnum):
13+
ON_COMMAND_PHRASE = "on_command_phrase"
14+
ON_NEW_COMMIT = "on_new_commit"
15+
ON_READY_FOR_REVIEW = "on_ready_for_review"
16+
17+
@classmethod
18+
def as_choices(cls) -> tuple[tuple[str, str], ...]:
19+
return tuple((trigger.value, trigger.value) for trigger in cls)
20+
21+
22+
@region_silo_model
23+
class RepositorySettings(Model):
24+
"""
25+
Stores (organization) repository specific settings.
26+
"""
27+
28+
__relocation_scope__ = RelocationScope.Global
29+
30+
repository = FlexibleForeignKey(
31+
"sentry.Repository", on_delete=models.CASCADE, unique=True, db_index=True
32+
)
33+
enabled_code_review = models.BooleanField(default=False)
34+
code_review_triggers = ArrayField(
35+
models.CharField(max_length=32, choices=CodeReviewTrigger.as_choices()),
36+
default=list,
37+
)
38+
39+
class Meta:
40+
app_label = "sentry"
41+
db_table = "sentry_repositorysettings"
42+
43+
__repr__ = sane_repr("repository_id", "enabled_code_review")

src/sentry/testutils/helpers/backups.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
from sentry.models.projecttemplate import ProjectTemplate
100100
from sentry.models.recentsearch import RecentSearch
101101
from sentry.models.relay import Relay, RelayUsage
102+
from sentry.models.repositorysettings import CodeReviewTrigger, RepositorySettings
102103
from sentry.models.rule import NeglectedRule, RuleActivity, RuleActivityType
103104
from sentry.models.savedsearch import SavedSearch, Visibility
104105
from sentry.models.search_common import SearchType
@@ -639,6 +640,15 @@ def create_exhaustive_organization(
639640
repo.external_id = "https://git.example.com:1234"
640641
repo.save()
641642

643+
RepositorySettings.objects.create(
644+
repository=repo,
645+
enabled_code_review=True,
646+
code_review_triggers=[
647+
CodeReviewTrigger.ON_NEW_COMMIT,
648+
CodeReviewTrigger.ON_READY_FOR_REVIEW,
649+
],
650+
)
651+
642652
# Group*
643653
group = self.create_group(project=project)
644654
group_search_view = GroupSearchView.objects.create(

0 commit comments

Comments
 (0)