Page MenuHomePhabricator

Figure out what to do with events in namespaces where registration is no longer allowed
Closed, ResolvedPublic

Description

Context: by adding a config setting that determines the namespaces where event registration is allowed, we introduce the following scenario: if someone creates an event with registration in namespace X, and then administrators remove namespace X from the list of allowed namespaces, we're left with an event in an inconsistent state. For simplicity, these events will be referred to as "zombie events". This should be a relatively rare occurrence, but still something we need to handle somehow. This task is about figuring out the how; the implementation will be done in T387974.

The following user experiences are affected:

  • Event pages (the event info header)
  • Special:AllEvents & Special:MyEvents, local and foreign events
  • Special:RegisterForEvent & Special:CancelEventRegistration
  • Special:DeleteEventRegistration
  • Special:EditEventRegistration (NB: not Special:Enable-)
  • Special:EventDetails
  • Special:GenerateInvitationList
  • Most, if not all, API endpoints

Also, we are currently preventing users from moving event pages (with registration enabled) outside the event namespace. This was done last year in T358704. As part of this task, we can lift that restriction, and treat the event as a zombie after the page move instead.

Zombie events are somewhere between normal events and deleted events. It is effectively a new state. The main question is what exactly this new state will look like: should it be closer to the normal state (so, for example, you could still see the event details and participants, but people would not be able to register) or the deleted state (and so you would only see an error message, and nothing else)?

From a technical point of view, there should be minimal differences between these options. This is really more of a product question along the lines of "what is most useful and least confusing?". For example, if we do not show event details/participant, could organizers lose information in the process? What about retaining data for historical purposes? After all, it's MediaWiki we're talking about, with logs, page histories, etc. That is why I have a preference for displaying information unless there's a reason not to. Nonetheless, my only technical recommendations would be:

  • For global event lists (AllEvents, MyEvents), we have no way to tell if a foreign event is in a valid namespace. [That is to say, unless we waste a lot of time implementing this at the DB level, which is simply not worthwhile]
  • The registration header should not be shown in event pages. Partly for the obvious usability reasons. But also because that would force us to intercept each and every page view to see if we have an event linked to that page, which we should avoid if possible.
  • Not really a technical recommendation, but Special:DeleteEventRegistration should probably be usable regardless of everything else. Ditto for Special:CancelEventRegistration, especially if we decide to still show the list of participants.

And finally, as noted above: zombie events should be a rare occurrence. I would aim for maximum simplicity; and possibly maximum consistency, especially when it helps with simplicity.

Event Timeline

Daimona renamed this task from Implement handling of events in namespaces where registration is no longer allowed to Figure out what to do with events in namespaces where registration is no longer allowed.Mar 12 2025, 6:03 PM
Daimona updated the task description. (Show Details)

My proposal:

  • Event pages: do not show the header, or really any trace that the page has/had registration associated.
  • Special:AllEvents & Special:MyEvents: foreign zombie events must be shown, and there's no way to distinguish them from alive events. For local events we can do either way. Should we still show zombies, for consistency and simplicity?
  • Special:RegisterForEvent: display error message, and nothing else. Users cannot register or edit their registration information (such as participant questions).
  • Special:CancelEventRegistration: would work normally, as if the event were alive. No indication, in the interface, that the event is half-gone. Or we could show something if we want to, it'd be a small change.
  • Special:DeleteEventRegistration: would work normally, as if the event were alive. No indication, in the interface, that the event is half-gone. Or we could show something if we want to, it'd be a small change.
  • Special:EditEventRegistration: unsure about this one. I guess the two options are 1) display an error message and no form (like for deleted events), or 2) display a notice at the top, but allow changes.
  • Special:EventDetails: show everything as normal, with a notice at the top saying that the event is a zombie (similar design to the notice for non-local events). Additionally, in the organizer view: disable the email tab; and do we let the organizer remove participants or not? (Again, this is similar to what we do for non-local events)
  • Special:GenerateInvitationList: really the question is whether we accept zombie events in the "event page" field. I think we should not, and we should instead display an error, similar to T387967. But I don't feel strongly about this and it's a small change either way.
  • API endpoints: mimic behaviour of the corresponding special pages.

After discussing this topic further, the team has agreed on two things:

  • We should show some data about events in no-longer-permitted namespaces. The data should not be completely deleted. This is because the events are valid and we want to preserve the data for historical purposes.
  • We should not automatically move event pages to other namespaces, since this would be confusing/jarring to organizers.

Additionally, I have some responses to the proposal below, as shared by @Daimona (and thank you for the thorough breakdown!):

My proposal:

  • Event pages: do not show the header, or really any trace that the page has/had registration associated.

My concern is that event registration headers are the common way to publicly access data on the event (such as participant list, target wikis, event topics, etc). If we remove this data, it could be very hard for people to ever find it again. Sure, they could go to EventDetails, but how would they find the EventDetails page in the first place? Organizers can access it via Special:MyEvents, but that's just for the organizers of the event.

  • Special:AllEvents & Special:MyEvents: foreign zombie events must be shown, and there's no way to distinguish them from alive events. For local events we can do either way. Should we still show zombies, for consistency and simplicity?

Yes, let's show zombie events in all cases for the sake of consistency. I also think it is generally okay to show zombie events in the Collaboration List because the events were indeed organized and created, and most of them will likely be past events rather than events that were intended to be for the present or future anyway.

  • Special:RegisterForEvent: display error message, and nothing else. Users cannot register or edit their registration information (such as participant questions).

Yup, makes sense. If event registration is no longer permitted in a given namespace, then registration through all channels should be closed.

  • Special:CancelEventRegistration: would work normally, as if the event were alive. No indication, in the interface, that the event is half-gone. Or we could show something if we want to, it'd be a small change.

Yes, I think the functionality for this should remain in place. We have T+S reasons for people always being able to unregister. But, yes, one quirk is that they will not be able to register again because the event is no longer in a permitted namespace. Perhaps it could be helpful to have a message in this case, but I don't know if that is required for the MVP. The message could be something like: "If you cancel your registration, you cannot register for this event again. Event registration is now closed."

  • Special:DeleteEventRegistration: would work normally, as if the event were alive. No indication, in the interface, that the event is half-gone. Or we could show something if we want to, it'd be a small change.

Yes, we should keep the current functionality. I don't think any additional messaging is necessary. If we allowed event restoration, I think some messaging could be appropriate, but we don't have that yet.

  • Special:EditEventRegistration: unsure about this one. I guess the two options are 1) display an error message and no form (like for deleted events), or 2) display a notice at the top, but allow changes.

I feel like some event data (such as the event topic or target wikis) could be useful to allow changes to any at time. The issue is whether to allow registration -- not about providing event information. So, let's display a notice at the top but allow changes. The notice could also be useful as a way to signal to the organizer that they may want to move the event page to a permitted namespace. It could be something like: "This event is in a namespace that is no longer permitted for event registration. It is recommended to move the page to a permitted namespace."

  • Special:EventDetails: show everything as normal, with a notice at the top saying that the event is a zombie (similar design to the notice for non-local events). Additionally, in the organizer view: disable the email tab; and do we let the organizer remove participants or not? (Again, this is similar to what we do for non-local events)
  • For EventDetails, sounds good. We can have a notice that says: "This event is in a namespace that is no longer permitted for event registration. It is recommended to move the page to a permitted namespace."
  • Why do we remove the ability to email participants? I think organizers may still have valid reasons to want to reach out to their participant list (such as letting them know about a new event that is coming up). Is there a technical limitation as to why?
  • Yes, organizers should be able to remove participants.
  • Special:GenerateInvitationList: really the question is whether we accept zombie events in the "event page" field. I think we should not, and we should instead display an error, similar to T387967. But I don't feel strongly about this and it's a small change either way.

Oh, interesting! I hadn't thought about this one :)

I see why you would say we would display an error message: It is optional to add event pages anyway, and I guess inclusion of zombie pages would seem like soft endorsements when we're really trying to encourage organizers to move their event pages to permitted namespaces.

However, what is the harm in including zombie pages? We are mostly asking for our internal tracking purposes, so it would potentially be better to get a zombie event page than no event page at all (since I could also see many people not moving the event page and then either not completing the process to generate an invitation list out of confusion or opting to simply add no event page link).

So, I think I have a slight preference to actually allow zombie pages in this case.

  • API endpoints: mimic behaviour of the corresponding special pages.

This is more of a technical decision, but makes sense to me.

  • Event pages: do not show the header, or really any trace that the page has/had registration associated.

My concern is that event registration headers are the common way to publicly access data on the event (such as participant list, target wikis, event topics, etc). If we remove this data, it could be very hard for people to ever find it again. Sure, they could go to EventDetails, but how would they find the EventDetails page in the first place? Organizers can access it via Special:MyEvents, but that's just for the organizers of the event.

This is indeed a great point. And yet, I'm not sure. For sure, EventDetails has discoverability issues, even for normal events: T358872. OTOH, zombie events are a hypothetical possibility, not too common in practice, whereas adding weight to each page view is very concrete. But then, we wouldn't be adding much weight, so this should be tolerable. So yeah, I'm a bit uncertain about this one.

"This event is in a namespace that is no longer permitted for event registration. It is recommended to move the page to a permitted namespace."

I would be a bit careful with the language there. If it's a historical event, there's no need to move the page, so we should not "recommend" it.

  • Special:EventDetails: show everything as normal, with a notice at the top saying that the event is a zombie (similar design to the notice for non-local events). Additionally, in the organizer view: disable the email tab; and do we let the organizer remove participants or not? (Again, this is similar to what we do for non-local events)
  • Why do we remove the ability to email participants? I think organizers may still have valid reasons to want to reach out to their participant list (such as letting them know about a new event that is coming up). Is there a technical limitation as to why?

No technical reason. As I said, the only technical restrictions are that we can't distinguish foreign zombie events, and that it would be preferable not to display the registration header. Everything else are just personal opinions. For this one in particular, I didn't see a use case. But now that you mention it, I definitely do. It's actually fun, because "let the organizer see participants so they can reach out if they organize a new event" was actually one of the biggest reasons why I said we should display the participants list.

  • Special:GenerateInvitationList: really the question is whether we accept zombie events in the "event page" field. I think we should not, and we should instead display an error, similar to T387967. But I don't feel strongly about this and it's a small change either way.

However, what is the harm in including zombie pages?

No harm. I thought mostly we could reject them for consistency, but in this case it isn't really an argument. As I said, I don't feel strongly about this one.


So, we now have an updated proposal. However, I also want to write here about an alternative proposal that we discussed today.

We could explicitly label the configuration option as "namespaces where event registration can be enabled". And then, once registration is enabled, its status is entirely unaffected by the namespace config. There would be no zombies in this case: if a namespace is later disallowed, the event remains 100% alive. This would be the simplest solution to implement, as it basically requires no changes. However, I'm not sure how useful it might seem, compared to the other proposal, and what users might think of this behaviour (does it match expectations, etc.). Also worth noting what changes would be required if we do this:

  • The registration header needs to be displayed on every page with event registration, regardless of the namespace. It seems like we would want to do this regardless.
  • We should probably keep preventing page moves to unsupported namespaces. Otherwise, someone could create a page in an allowed namespace, then move it to a disallowed namespace, effectively bypassing the config setting.

After discussing this further, it seems like we're heading towards the new approach where the config setting only affects new events:

We could explicitly label the configuration option as "namespaces where event registration can be enabled". And then, once registration is enabled, its status is entirely unaffected by the namespace config. There would be no zombies in this case: if a namespace is later disallowed, the event remains 100% alive. This would be the simplest solution to implement, as it basically requires no changes.

To avoid further confusion/ambiguity, here's a breakdown of how each interface/flow is affected:

  • Special:CommunityConfiguration: the messaging is updated to reflect the new scope.
  • Special:EnableEventRegistration: event pages outside allowed namespaces will be rejected as described in T387967. (This has never been in doubt, I'm only writing it here for completeness)
  • Special:EditEventRegistration: I'm assuming for existing events, we should allow editing them even if the event page is now in a disallowed namespace. (This would be similar to how we allow setting the event start date in the past when editing an existing event)

All the following are not affected, meaning the event is treated the same as any other alive event. There is no notice or anything.

  • Event pages (registration header)
  • Special:AllEvents & Special:MyEvents, local and foreign events
  • Special:RegisterForEvent & Special:CancelEventRegistration
  • Special:DeleteEventRegistration
  • Special:EventDetails
  • Special:GenerateInvitationList

Moving pages from an allowed namespace to a disallowed one is also unaffected, in that we will keep disallowing it.

API endpoints will be updated accordingly.

After discussing this further, it seems like we're heading towards the new approach where the config setting only affects new events:

We could explicitly label the configuration option as "namespaces where event registration can be enabled". And then, once registration is enabled, its status is entirely unaffected by the namespace config. There would be no zombies in this case: if a namespace is later disallowed, the event remains 100% alive. This would be the simplest solution to implement, as it basically requires no changes.

To avoid further confusion/ambiguity, here's a breakdown of how each interface/flow is affected:

  • Special:CommunityConfiguration: the messaging is updated to reflect the new scope.

I assume this means we explain in the messaging what happens. Works for me.

  • Special:EnableEventRegistration: event pages outside allowed namespaces will be rejected as described in T387967. (This has never been in doubt, I'm only writing it here for completeness)

Yup, sounds good.

  • Special:EditEventRegistration: I'm assuming for existing events, we should allow editing them even if the event page is now in a disallowed namespace. (This would be similar to how we allow setting the event start date in the past when editing an existing event)

Yup, editing should remain.

All the following are not affected, meaning the event is treated the same as any other alive event. There is no notice or anything.

  • Event pages (registration header)

Yup.

  • Special:AllEvents & Special:MyEvents, local and foreign events

Yup.

  • Special:RegisterForEvent & Special:CancelEventRegistration

Yup.

  • Special:DeleteEventRegistration

Yup.

  • Special:EventDetails

Yup.

  • Special:GenerateInvitationList

Yup.

Moving pages from an allowed namespace to a disallowed one is also unaffected, in that we will keep disallowing it.

Yup.

API endpoints will be updated accordingly.

Sounds good.

ifried claimed this task.

Decisions have been reached, so I'm marking this work as resolved and the epic should now be unofficially unblocked. Thank you, everyone!