diff --git a/moderator/moderate/admin.py b/moderator/moderate/admin.py
index f500f86..f278773 100644
--- a/moderator/moderate/admin.py
+++ b/moderator/moderate/admin.py
@@ -77,7 +77,7 @@ class EventAdmin(admin.ModelAdmin):
"created_at",
"event_date",
"archived",
- "is_nda",
+ "allow_nda_community",
)
actions = [export_questions_csv]
date_hierarchy = "created_at"
@@ -89,7 +89,7 @@ class EventAdmin(admin.ModelAdmin):
"moderators__last_name",
]
ordering = ["-created_at"]
- list_filter = ["archived", "is_nda"]
+ list_filter = ["archived", "allow_nda_community"]
autocomplete_fields = ["moderators"]
diff --git a/moderator/moderate/forms.py b/moderator/moderate/forms.py
index aed950e..8340762 100644
--- a/moderator/moderate/forms.py
+++ b/moderator/moderate/forms.py
@@ -139,9 +139,9 @@ def __init__(self, *args, **kwargs):
if not self.user.userprofile.is_employee:
# An NDA community member would lose sight of their own event if it
# were not opted in to the NDA community.
- self.fields["is_nda"].disabled = True
- self.fields["is_nda"].initial = True
- self.fields["is_nda"].help_text = (
+ self.fields["allow_nda_community"].disabled = True
+ self.fields["allow_nda_community"].initial = True
+ self.fields["allow_nda_community"].help_text = (
"Only staff can change who an event is open to."
)
@@ -159,7 +159,7 @@ class Meta:
model = Event
fields = [
"name",
- "is_nda",
+ "allow_nda_community",
"body",
"is_moderated",
"moderators",
@@ -185,7 +185,9 @@ class Meta:
"placeholder": "Event date",
}
),
- "is_nda": forms.CheckboxInput(attrs={"class": "form-check-input"}),
+ "allow_nda_community": forms.CheckboxInput(
+ attrs={"class": "form-check-input"}
+ ),
"is_moderated": forms.CheckboxInput(attrs={"class": "form-check-input"}),
"users_can_vote": forms.CheckboxInput(attrs={"class": "form-check-input"}),
"archived": forms.CheckboxInput(attrs={"class": "form-check-input"}),
diff --git a/moderator/moderate/migrations/0023_mozillianprofile_is_employee.py b/moderator/moderate/migrations/0023_mozillianprofile_is_employee.py
index 7f52fa3..86b1e28 100644
--- a/moderator/moderate/migrations/0023_mozillianprofile_is_employee.py
+++ b/moderator/moderate/migrations/0023_mozillianprofile_is_employee.py
@@ -1,4 +1,4 @@
-# Generated by Django 5.2.13 on 2026-08-04 09:19
+# Generated by Django 5.2.13 on 2026-08-11 10:38
from django.db import migrations, models
diff --git a/moderator/moderate/migrations/0024_backfill_is_employee.py b/moderator/moderate/migrations/0024_backfill_is_employee.py
index d3649e9..9b5ca7c 100644
--- a/moderator/moderate/migrations/0024_backfill_is_employee.py
+++ b/moderator/moderate/migrations/0024_backfill_is_employee.py
@@ -1,8 +1,6 @@
-from django.db import migrations
+# Generated by Django 5.2.13 on 2026-08-11 10:38
-# Kept separate from the schema migration: MySQL cannot roll DDL back, so a
-# failure here would otherwise leave the column added and the migration
-# unrecorded.
+from django.db import migrations
# Staff domains that do not carry the "mozilla" substring.
EMPLOYEE_EMAIL_DOMAINS = frozenset({"thunderbird.net", "getpocket.com"})
diff --git a/moderator/moderate/migrations/0025_remove_mozillianprofile_is_nda_member.py b/moderator/moderate/migrations/0025_remove_mozillianprofile_is_nda_member.py
index e397ff7..8816e15 100644
--- a/moderator/moderate/migrations/0025_remove_mozillianprofile_is_nda_member.py
+++ b/moderator/moderate/migrations/0025_remove_mozillianprofile_is_nda_member.py
@@ -1,7 +1,6 @@
-from django.db import migrations
+# Generated by Django 5.2.13 on 2026-08-11 10:38
-# Dropping the old column is split out so it can be applied on a later deploy,
-# once no instance is running code that still reads is_nda_member.
+from django.db import migrations
class Migration(migrations.Migration):
diff --git a/moderator/moderate/migrations/0026_rename_is_nda_event_allow_nda_community.py b/moderator/moderate/migrations/0026_rename_is_nda_event_allow_nda_community.py
new file mode 100644
index 0000000..9750adc
--- /dev/null
+++ b/moderator/moderate/migrations/0026_rename_is_nda_event_allow_nda_community.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.2.13 on 2026-08-11 10:38
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("moderate", "0025_remove_mozillianprofile_is_nda_member"),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name="event",
+ old_name="is_nda",
+ new_name="allow_nda_community",
+ ),
+ ]
diff --git a/moderator/moderate/models.py b/moderator/moderate/models.py
index aaeb0c8..6c1a9ae 100644
--- a/moderator/moderate/models.py
+++ b/moderator/moderate/models.py
@@ -73,7 +73,8 @@ def visible_to(self, user):
# A subquery rather than a join on moderators: joining would duplicate
# rows and inflate the Count() annotations the listing views add.
return self.filter(
- models.Q(is_nda=True) | models.Q(pk__in=user.events_moderated.values("pk"))
+ models.Q(allow_nda_community=True)
+ | models.Q(pk__in=user.events_moderated.values("pk"))
)
@@ -91,7 +92,7 @@ class Event(models.Model):
slug = models.SlugField(max_length=400, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
event_date = models.DateField(null=True, blank=True, default=default_date)
- is_nda = models.BooleanField(default=False)
+ allow_nda_community = models.BooleanField(default=False)
created_by = models.ForeignKey(
User, null=True, blank=True, on_delete=models.SET_NULL
)
diff --git a/moderator/moderate/templates/create_event.jinja b/moderator/moderate/templates/create_event.jinja
index 291b0ad..ea03afb 100644
--- a/moderator/moderate/templates/create_event.jinja
+++ b/moderator/moderate/templates/create_event.jinja
@@ -46,9 +46,9 @@
{{ floating(event_form.event_date, "Event date") }}
{% if user_can_edit %}
{{ check(event_form.users_can_vote, "Allow users to vote on questions") }}
- {{ check(event_form.is_nda,
+ {{ check(event_form.allow_nda_community,
'Allow NDA Community members',
- help=event_form.is_nda.help_text) }}
+ help=event_form.allow_nda_community.help_text) }}
{{ check(event_form.is_moderated, "Moderated event (questions need approval)") }}
{% if event %}
{{ check(event_form.archived, "Archive this event") }}
diff --git a/moderator/moderate/templates/questions.jinja b/moderator/moderate/templates/questions.jinja
index b9708b4..c17be23 100644
--- a/moderator/moderate/templates/questions.jinja
+++ b/moderator/moderate/templates/questions.jinja
@@ -25,7 +25,7 @@
{{ event.event_date|date('F j, Y') }}
{% endif %}
- {% if event.is_nda %}NDA Community{% endif %}
+ {% if event.allow_nda_community %}Open to NDA Community{% endif %}
{% if event.is_moderated %}Moderated{% endif %}
{% if event.archived %}Archived{% endif %}
diff --git a/moderator/moderate/tests/test_forms.py b/moderator/moderate/tests/test_forms.py
index abc5914..0b252e6 100644
--- a/moderator/moderate/tests/test_forms.py
+++ b/moderator/moderate/tests/test_forms.py
@@ -34,9 +34,9 @@ def test_question_form_accepts_valid_text():
def test_event_form_forces_nda_for_community_member(make_user):
"""A community member would lose sight of an event that is not opted in."""
user = make_user("contributor")
- form = EventForm(_event_data(user, is_nda=False), user=user)
+ form = EventForm(_event_data(user, allow_nda_community=False), user=user)
assert form.is_valid(), form.errors
- assert form.save().is_nda is True
+ assert form.save().allow_nda_community is True
@pytest.mark.django_db
@@ -44,30 +44,32 @@ def test_event_form_forces_nda_when_community_member_omits_the_field(make_user):
user = make_user("contributor")
form = EventForm(_event_data(user), user=user)
assert form.is_valid(), form.errors
- assert form.save().is_nda is True
+ assert form.save().allow_nda_community is True
@pytest.mark.django_db
def test_event_form_lets_employee_opt_out(make_user):
user = make_user("staff", is_employee=True)
- form = EventForm(_event_data(user, is_nda=False), user=user)
+ form = EventForm(_event_data(user, allow_nda_community=False), user=user)
assert form.is_valid(), form.errors
- assert form.save().is_nda is False
+ assert form.save().allow_nda_community is False
@pytest.mark.django_db
def test_event_form_lets_employee_opt_in(make_user):
user = make_user("staff", is_employee=True)
- form = EventForm(_event_data(user, is_nda=True), user=user)
+ form = EventForm(_event_data(user, allow_nda_community=True), user=user)
assert form.is_valid(), form.errors
- assert form.save().is_nda is True
+ assert form.save().allow_nda_community is True
@pytest.mark.django_db
def test_event_form_community_moderator_cannot_change_existing_value(make_user):
staff = make_user("staff", is_employee=True)
contributor = make_user("contributor")
- event = Event.objects.create(name="Staff only", is_nda=False, created_by=staff)
+ event = Event.objects.create(
+ name="Staff only", allow_nda_community=False, created_by=staff
+ )
event.moderators.set([staff, contributor])
form = EventForm(
@@ -75,18 +77,18 @@ def test_event_form_community_moderator_cannot_change_existing_value(make_user):
contributor,
name="Staff only",
moderators=[staff.pk, contributor.pk],
- is_nda=True,
+ allow_nda_community=True,
),
instance=event,
user=contributor,
)
assert form.is_valid(), form.errors
- assert form.save().is_nda is False
+ assert form.save().allow_nda_community is False
@pytest.mark.django_db
def test_event_form_no_longer_blocks_community_member_from_nda_events(make_user):
"""The old "only NDA members can create NDA events" rule is gone."""
user = make_user("contributor")
- form = EventForm(_event_data(user, is_nda=True), user=user)
+ form = EventForm(_event_data(user, allow_nda_community=True), user=user)
assert form.is_valid(), form.errors
diff --git a/moderator/moderate/tests/test_models.py b/moderator/moderate/tests/test_models.py
index 70c0bc2..f79f5e2 100644
--- a/moderator/moderate/tests/test_models.py
+++ b/moderator/moderate/tests/test_models.py
@@ -77,10 +77,10 @@ def test_event_questions_count_property():
@pytest.mark.django_db
def test_visible_to_returns_opted_in_and_moderated_events(make_user):
contributor = make_user("contributor")
- community = Event.objects.create(name="Community", is_nda=True)
- moderated = Event.objects.create(name="Moderated", is_nda=False)
+ community = Event.objects.create(name="Community", allow_nda_community=True)
+ moderated = Event.objects.create(name="Moderated", allow_nda_community=False)
moderated.moderators.set([contributor])
- Event.objects.create(name="Staff Only", is_nda=False)
+ Event.objects.create(name="Staff Only", allow_nda_community=False)
visible = Event.objects.visible_to(contributor)
assert set(visible.values_list("name", flat=True)) == {"Community", "Moderated"}
@@ -89,8 +89,8 @@ def test_visible_to_returns_opted_in_and_moderated_events(make_user):
@pytest.mark.django_db
def test_visible_to_returns_everything_for_employees_and_superusers(make_user):
- Event.objects.create(name="Staff Only", is_nda=False)
- Event.objects.create(name="Community", is_nda=True)
+ Event.objects.create(name="Staff Only", allow_nda_community=False)
+ Event.objects.create(name="Community", allow_nda_community=True)
for user in [
make_user("staff", is_employee=True),
@@ -103,7 +103,7 @@ def test_visible_to_returns_everything_for_employees_and_superusers(make_user):
def test_visible_to_does_not_inflate_annotations(make_user):
"""The moderator clause must not join and double the Count() annotations."""
contributor = make_user("contributor")
- event = Event.objects.create(name="Staff Only", is_nda=False)
+ event = Event.objects.create(name="Staff Only", allow_nda_community=False)
event.moderators.set([contributor, make_user("staff", is_employee=True)])
for i in range(3):
Question.objects.create(
diff --git a/moderator/moderate/tests/test_urls.py b/moderator/moderate/tests/test_urls.py
index 26c753a..52d0797 100644
--- a/moderator/moderate/tests/test_urls.py
+++ b/moderator/moderate/tests/test_urls.py
@@ -158,10 +158,10 @@ def test_archive_event_rejects_future_event():
def _make_events(archived=False):
staff_only = Event.objects.create(
- name="Staff Only Event", is_nda=False, archived=archived
+ name="Staff Only Event", allow_nda_community=False, archived=archived
)
community = Event.objects.create(
- name="Community Welcome Event", is_nda=True, archived=archived
+ name="Community Welcome Event", allow_nda_community=True, archived=archived
)
return staff_only, community
@@ -341,7 +341,9 @@ def test_upvote_404s_for_non_numeric_question_id(make_user):
@pytest.mark.django_db
def test_upvote_respects_voting_switch_on_nda_event(make_user):
"""Opting an event in to the NDA community must not re-enable voting."""
- event = Event.objects.create(name="No Voting", is_nda=True, users_can_vote=False)
+ event = Event.objects.create(
+ name="No Voting", allow_nda_community=True, users_can_vote=False
+ )
question = Question.objects.create(
event=event, question="A question with enough text.", is_accepted=True
)