Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Generated by Django 5.0.6 on 2026-08-06 02:35

import django.db.models.deletion
from django.db import migrations, models


def backfill_organization_setting(apps, schema_editor):
OrganizationEmail = apps.get_model("custom_email", "OrganizationEmail")
OrganizationSetting = apps.get_model("organization_setting", "OrganizationSetting")

organization_setting_map = {
s.organization_id: s.id
for s in OrganizationSetting.objects.only("id", "organization_id")
}

updates = []

for email in OrganizationEmail.objects.exclude(organization_id=None).iterator():
if setting_id := organization_setting_map.get(email.organization_id):
email.organization_setting_id = setting_id
updates.append(email)

if updates:
OrganizationEmail.objects.bulk_update(
updates,
["organization_setting"],
batch_size=1000,
)


class Migration(migrations.Migration):
dependencies = [
("custom_email", "0002_backfill_organization_emails"),
("organization_setting", "0002_backfill_organization_settings"),
]

operations = [
migrations.RemoveConstraint(
model_name="organizationemail",
name="unique_organization_email_type",
),
migrations.AddField(
model_name="organizationemail",
name="organization_setting",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="organization_setting_custom_emails",
to="organization_setting.organizationsetting",
),
),
migrations.RunPython(
backfill_organization_setting,
migrations.RunPython.noop,
),
migrations.RemoveField(
model_name="organizationemail",
name="organization",
),
migrations.AddConstraint(
model_name="organizationemail",
constraint=models.UniqueConstraint(
fields=("organization_setting", "email_type"),
name="unique_organization_email_type",
),
),
]
12 changes: 7 additions & 5 deletions apps/custom_email/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@
from django.db import models

from apps.custom_email.constants import EmailTypes
from apps.organization.models import Organization
from apps.organization_setting.models import OrganizationSetting


class OrganizationEmail(BaseModel):
organization = models.ForeignKey(
Organization,
organization_setting = models.ForeignKey(
OrganizationSetting,
on_delete=models.CASCADE,
related_name="organization_custom_emails",
related_name="organization_setting_custom_emails",
null=True,
blank=True,
)
email_type = models.CharField(max_length=255, choices=EmailTypes.choices)
sender_name = models.CharField(max_length=255, blank=True)
Expand All @@ -25,7 +27,7 @@ class Meta:
db_table = "custom_emails"
constraints = [
models.UniqueConstraint(
fields=["organization", "email_type"],
fields=["organization_setting", "email_type"],
name="unique_organization_email_type",
)
]
7 changes: 3 additions & 4 deletions apps/custom_email/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,14 @@
class ListCustomEmailView(QuotaMixin, OrganizationListAPIView):
serializer_class = OrganizationEmailSerializer
queryset = OrganizationEmail.objects.select_related(
"organization",
"organization__organization_settings",
"organization_setting"
).prefetch_related(
Prefetch(
"organization__organization_settings__themes",
"organization_setting__themes",
queryset=OrganizationTheme.objects.all(),
)
)
organization_field = "organization"
organization_field = "organization_setting__organization"
pagination_class = BasePagination
filterset_fields = ["email_type"]
filter_backends = [DjangoFilterBackend, OrderingFilter]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Generated by Django 5.0.6 on 2026-08-06 02:35

import django.db.models.deletion
from django.db import migrations, models


def backfill_organization_setting(apps, schema_editor):
CustomPage = apps.get_model("custom_page", "CustomPage")
OrganizationSetting = apps.get_model(
"organization_setting",
"OrganizationSetting",
)

organization_setting_map = {
s.organization_id: s.id
for s in OrganizationSetting.objects.only("id", "organization_id")
}

updates = []

for page in CustomPage.objects.exclude(organization_id=None).iterator():
setting_id = organization_setting_map.get(page.organization_id)
if setting_id is not None:
page.organization_setting_id = setting_id
updates.append(page)

if updates:
CustomPage.objects.bulk_update(
updates,
["organization_setting"],
batch_size=1000,
)


class Migration(migrations.Migration):
dependencies = [
("custom_page", "0002_backfill_default_custom_pages"),
("organization_setting", "0002_backfill_organization_settings"),
]

operations = [
migrations.AddField(
model_name="custompage",
name="organization_setting",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="organization_setting_custom_page",
to="organization_setting.organizationsetting",
),
),
migrations.RunPython(
backfill_organization_setting,
migrations.RunPython.noop,
),
migrations.RemoveField(
model_name="custompage",
name="organization",
),
]
10 changes: 6 additions & 4 deletions apps/custom_page/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@
from django.db import models

from apps.custom_page.constants import PageTypes
from apps.organization.models import Organization
from apps.organization_setting.models import OrganizationSetting


class CustomPage(BaseModel):
organization = models.ForeignKey(
Organization,
organization_setting = models.ForeignKey(
OrganizationSetting,
on_delete=models.CASCADE,
related_name="organization_custom_page",
related_name="organization_setting_custom_page",
null=True,
blank=True,
)
page_type = models.CharField(max_length=255, choices=PageTypes.choices)
title = models.CharField(max_length=255)
Expand Down
4 changes: 2 additions & 2 deletions apps/custom_page/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@

class ListCustomPageView(QuotaMixin, OrganizationListAPIView):
serializer_class = CustomPageSerializer
queryset = CustomPage.objects.select_related("organization").all()
organization_field = "organization"
queryset = CustomPage.objects.select_related("organization_setting").all()
organization_field = "organization_setting__organization"
pagination_class = BasePagination
filter_backends = [DjangoFilterBackend, OrderingFilter]
ordering = ["-created_at"]
Expand Down
10 changes: 4 additions & 6 deletions apps/organization/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@
from apps.organization.serializers import OrganizationSerializer
from apps.organization.services import get_owner_name_query_set
from apps.organization_setting.models import OrganizationSetting
from apps.organization_setting.serializers import (
OrganizationSettingsWithCustomPagesSerializer,
)
from apps.organization_setting.serializers import OrganizationSettingWithPagesSerializer
from utils.views import OrganizationRetrieveAPIView


Expand Down Expand Up @@ -74,8 +72,8 @@ def get(self, request, slug_name):
.select_related("organization")
.prefetch_related(
"themes",
"organization__organization_custom_emails",
"organization__organization_custom_page",
"organization_setting_custom_emails",
"organization_setting_custom_page",
)
.first()
)
Expand All @@ -90,7 +88,7 @@ def get(self, request, slug_name):
{
"result": result,
"template": organization.template,
"setting": OrganizationSettingsWithCustomPagesSerializer(setting).data
"setting": OrganizationSettingWithPagesSerializer(setting).data
if setting
else None,
"plan": plan_code,
Expand Down
Loading
Loading