|
@@ -3,25 +3,29 @@ import logging
|
|
from django.db import models, router, transaction
|
|
from django.db import models, router, transaction
|
|
from django.db.models import Q
|
|
from django.db.models import Q
|
|
from django.db.models.signals import post_delete, post_save
|
|
from django.db.models.signals import post_delete, post_save
|
|
|
|
+from django.utils import timezone
|
|
|
|
|
|
from sentry.backup.scopes import RelocationScope
|
|
from sentry.backup.scopes import RelocationScope
|
|
-from sentry.db.models import (
|
|
|
|
- BoundedPositiveIntegerField,
|
|
|
|
- DefaultFieldsModel,
|
|
|
|
- FlexibleForeignKey,
|
|
|
|
- region_silo_only_model,
|
|
|
|
-)
|
|
|
|
|
|
+from sentry.db.models import BoundedPositiveIntegerField, FlexibleForeignKey, region_silo_only_model
|
|
from sentry.db.models.fields.hybrid_cloud_foreign_key import HybridCloudForeignKey
|
|
from sentry.db.models.fields.hybrid_cloud_foreign_key import HybridCloudForeignKey
|
|
|
|
+from sentry.db.models.outboxes import ReplicatedRegionModel
|
|
|
|
+from sentry.models.outbox import OutboxCategory
|
|
from sentry.services.hybrid_cloud.notifications import notifications_service
|
|
from sentry.services.hybrid_cloud.notifications import notifications_service
|
|
|
|
+from sentry.services.hybrid_cloud.replica import control_replica_service
|
|
from sentry.types.integrations import ExternalProviders
|
|
from sentry.types.integrations import ExternalProviders
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
@region_silo_only_model
|
|
@region_silo_only_model
|
|
-class ExternalActor(DefaultFieldsModel):
|
|
|
|
|
|
+class ExternalActor(ReplicatedRegionModel):
|
|
__relocation_scope__ = RelocationScope.Excluded
|
|
__relocation_scope__ = RelocationScope.Excluded
|
|
|
|
|
|
|
|
+ category = OutboxCategory.EXTERNAL_ACTOR_UPDATE
|
|
|
|
+
|
|
|
|
+ date_updated = models.DateTimeField(default=timezone.now)
|
|
|
|
+ date_added = models.DateTimeField(default=timezone.now, null=True)
|
|
|
|
+
|
|
team = FlexibleForeignKey("sentry.Team", null=True, db_index=True, on_delete=models.CASCADE)
|
|
team = FlexibleForeignKey("sentry.Team", null=True, db_index=True, on_delete=models.CASCADE)
|
|
user_id = HybridCloudForeignKey("sentry.User", null=True, db_index=True, on_delete="CASCADE")
|
|
user_id = HybridCloudForeignKey("sentry.User", null=True, db_index=True, on_delete="CASCADE")
|
|
organization = FlexibleForeignKey("sentry.Organization")
|
|
organization = FlexibleForeignKey("sentry.Organization")
|
|
@@ -76,6 +80,13 @@ class ExternalActor(DefaultFieldsModel):
|
|
|
|
|
|
return super().delete(**kwargs)
|
|
return super().delete(**kwargs)
|
|
|
|
|
|
|
|
+ def handle_async_replication(self, shard_identifier: int) -> None:
|
|
|
|
+ from sentry.services.hybrid_cloud.notifications.serial import serialize_external_actor
|
|
|
|
+
|
|
|
|
+ control_replica_service.upsert_external_actor_replica(
|
|
|
|
+ external_actor=serialize_external_actor(self)
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
|
|
def process_resource_change(instance, **kwargs):
|
|
def process_resource_change(instance, **kwargs):
|
|
from sentry.models.organization import Organization
|
|
from sentry.models.organization import Organization
|