j.jaffeux
(Joffrey Jaffeux)
6μ 2, 2025, 11:42μ€μ
1
You can now set an end date for recurring events in Discourse Calendar!
This much-requested feature allows you to specify when a recurring event series should stop, giving you more control over your event scheduling.
Create events that repeat daily, weekly, or monthly - and now determine exactly when they should end.
For more details on the Calendar plugin and its features, visit the official Calendar topic .
In the future, we might add the possibility to exclude specific weekdays.
22κ°μ μ’μμ
sam
(Sam Saffron)
6μ 3, 2025, 2:27μ€μ
2
A tricky thing with the work βUntilβ is that it is not totally obvious if it is included or excluded? Is there anything we can do here to give better clarity?
2κ°μ μ’μμ
nathank
(Nathan Kershaw)
6μ 3, 2025, 2:31μ€μ
3
Yeah, Google Calendar has the same issue! They use On, but it suffers from the same ambiguity:
However, I think that most users would safely assume that Until includes that date.
3κ°μ μ’μμ
j.jaffeux
(Joffrey Jaffeux)
6μ 3, 2025, 7:25μ€μ
4
Until (included):
?
edit: I did this for now UX: better copy by jjaffeux Β· Pull Request #737 Β· discourse/discourse-calendar Β· GitHub seems like a good simple change.
An alternative solution would be to display the actual date/time next to the date input, but probably overkill?
3κ°μ μ’μμ
meglio
(Anton)
6μ 4, 2025, 3:03μ€μ
5
You might want to borrow some ideas from my impementation of the Voucher Start/End dates in the New Voucher dialog in an e-commerce Iβm working on:
Another example to demonstrate the flexibility and how we avoid ambiguity in date ranges in the UI:
Technical detail: In our application, we always save dates as βtimestamp with timezoneβ (postgres), so no database setting, nor connection setting, can affect the actual timestamp stored. Even though Postgres does not recommend it, we do it because it gives 100% guarantees of the date correctness in any situation and in any SQL query. You can operate with date timezones right in postgres using their date/time/timezone functions and be certain that it will work 100% correct always. We rely on it.
And then we have a timezone setting for all types of entities that need it: user profiles, markets, vouchers, reporting for accountants, and so on - so that we can translate any dates to any timezones on the fly without hesitation.
The main takeaways here are:
Always store date and time with timezone.
Always store timezone preference.
Be very explicit about dates in the UI, donβt do any magic.
Let the user see the actual dates in the choosen timezone before they click βSaveβ.
1κ°μ μ’μμ
μλ
νμΈμ,
μ μ체 νΈμ€ν
μΈμ€ν΄μ€(ν λ¬ μ μ λ°©κΈ μμ±ν κ²)μλ μ’
λ£ λ μ§ μ΅μ
μ΄ λ³΄μ΄μ§ μμ΅λλ€.
μ κ° λκ° μλͺ»νκ³ μλ 건κ°μ?
Ethsim2
(Ethan )
9μ 4, 2026, 8:23μ€ν
7
μ€ν¬λ¦°μ·μλ λ μ§/μκ° μ½μ
λνμμκ° μλλΌ μ΄λ²€νΈ μμ± λνμμκ° νμλ κ² κ°μ΅λλ€.
μ΄λ Discourse Calendarμμ λ κ°μ§ λ€λ₯Έ μν¬νλ‘μ°μ
λλ€:
λ μ§/μκ° μ½μ
μ OPμ [calendar] λΈλ‘μ΄ ν¬ν¨λ ν ν½μ λ΅λ³μ μ¬μ©λ©λλ€.
μ΄λ²€νΈ μμ±μ μ€μ μ΄λ²€νΈ([event ...][/event])λ₯Ό μμ±νλ κ²μΌλ‘, λ°λ³΅ μ΄λ²€νΈ μ€μ (λ°λ³΅ μ’
λ£ λ μ§ ν¬ν¨)μ μ¬μ©ν μ μλ κ³³μ
λλ€.
λ°λΌμ μ΄ ν ν½μμ 곡μ§λ κΈ°λ₯μ μ¬μ©νλ €λ©΄, μμ±κΈ° + λ©λ΄λ₯Ό μ΄μ΄ λ μ§/μκ° μ½μ
λμ μ΄λ²€νΈ μμ± μ μ νν΄ λ³΄μΈμ.
μ΅κ·Όμ ν΄λΉ λ°λ³΅ μ΄λ²€νΈ νλ‘μ°λ₯Ό ν
μ€νΈνλ μ€, μ νλ λ°λ³΅μ΄ μμ ν λ§λ£λ ν λ°μνλ μ£μ§ μΌμ΄μ€λ₯Ό λ°κ²¬νμ¬, μ΄λ₯Ό μμ νκΈ° μν΄ λ€μ PRμ μ΄μμ΅λλ€:
main β Ethsim12:fix-expired-recurring-event-label
opened 10:15AM - 04 Sep 26 UTC
## Summary
Fixes recurring Event labels rendering `Every Invalid date` after a β¦ bounded recurrence has expired.
When the final occurrence of a recurring Event has passed, `starts_at` can be `nil` while the Event still retains its recurrence and serialized RRULE. The recurrence label was deriving its weekday from the missing `starts_at`, resulting in an invalid Moment date.
This change falls back to the original `DTSTART` contained in the serialized RRULE when there is no current `startsAt`.
Existing behavior is unchanged while a current occurrence is available.
## Tests
Added coverage for:
- an expired all-day weekly Event with no current occurrence
- an expired timed monthly Event using the fourth weekday of the month
Manual smoke testing also covered:
- the original all-day weekly reproduction
- a timed weekly Event in `Europe/London`
- a timed fourth-Thursday monthly Event
The broader discourse-events JavaScript run completed with:
> 274 tests, 273 passed, 1 skipped, 0 failed
The focused expired-event tests pass with no deprecation warnings.
Also verified with Prettier, ESLint, and `git diff --check`.
1κ°μ μ’μμ
μ€μ λ‘λ νΉμ μ£Όμ μμμ μΊλ¦°λ(μ΄λ²€νΈ μμ§)λ₯Ό μ μ§νλ κ²μ΄μμ΅λλ€.
μ€ν΄κ° μμλ μ μ£μ‘ν©λλ€. μ΄κ³³μ μ²μ μ¨ μ¬λμ΄λΌμμ.
μ¬μ€ μ΄λ²€νΈλ₯Ό μμ±ν λλ μ μλνλ κ² κ°μ΅λλ€.
λ μ§/μκ° μ½μ
κΈ°λ₯μμλ μλνμ§ μλ κ²μ΄ μμ¬μΈ λΏμ
λλ€.
λμμ£Όμ
μ κ°μ¬ν©λλ€!
1κ°μ μ’μμ
Ethsim2
(Ethan )
9μ 4, 2026, 8:48μ€ν
9
λ¬Έμ μμ΄μ
μ 리νμλ©΄, λ μ§/μκ° μ½μ
κΈ°λ₯μ΄ μ€μ λ‘ μλνμ§ μλ κ²½μ°λ μλλΌκ³ μκ°ν΄μ. μν¬νλ‘κ° λ€λ₯Έ κ²μ΄μμ.
λ μ§/μκ° μ½μ
μ ν ν½μ 첫 λ²μ§Έ κ²μκΈμ [calendar] λΈλ‘μ΄ μμ λ, λ μ§κ° μλ λ΅λ³μ΄ ν΄λΉ ν ν½μ μΊλ¦°λμ νμλλλ‘ ν λ μ¬μ©ν΄μ.
λ°λ©΄ μ΄λ²€νΈ μμ± μ μ€μ Discourse μ΄λ²€νΈ([event ...][/event])λ₯Ό μμ±ν΄μ. μ΄ ν ν½μμ λ
Όμλ λ°λ³΅ μ΄λ²€νΈ μ’
λ£ λ μ§λ κ·Έ μ΄λ²€νΈ λ°λ³΅ μμ€ν
μ μ μ©λΌμ.
λ°λΌμ νΉμ ν ν½μ κ΅νλ μΊλ¦°λλ₯Ό μ μ§νλ €λ κ²μ΄ λͺ©νλΌλ©΄, μλ μ€ν¬λ¦°μ·μ νμλ μν¬νλ‘κ° μ μ ν΄μ. λ€λ§ μ΄λ²€νΈμ λμΌν μ νμ λ°λ³΅ κΈ°λ₯μ μ¬μ©νμ§λ μμμ.
λ€, μ΄ν΄νμ΅λλ€.
μ¬μ© μ¬λ‘λ μ νκ΅μ λ¬λ ₯μ κ΄λ¦¬νλ κ²μ
λλ€. νμ μ
λ ₯ν΄μΌ ν μΌμ μ΄ μμΌλ―λ‘, νλΆλͺ¨ λꡬλ μ£Όμ μ λ΅κΈμ λ¬μ μλ‘μ΄ μΌμ μ μΆκ°ν μ μμ΅λλ€.
νμ§λ§ μ΄μ λ°λ³΅λλ μΌμ μ μ
λ ₯ν΄μΌ νλλ°, λΆννλ μ΄ μν¬νλ‘μ°μλ κ·Έλ° μ΅μ
μ΄ μμ΅λλ€. κ·Έλμ μ λ μ§λ‘ μ£Όμ λ₯Ό μ¬λ¬ λ² λ΅κΈμ λ¬μ μλμΌλ‘ μ²λ¦¬ν΄μΌ ν©λλ€(λ νλͺ
ν λ°©λ²μ΄ μλμ§ λͺ¨λ₯΄κ² λ€μβ¦).
Ethsim2
(Ethan )
9μ 4, 2026, 9:19μ€ν
11
κΈ°μ‘΄μ ν ν½ λ¨μ [calendar] μν¬νλ‘λ₯Ό μ μ§νλ©΄μ μλ λ΅λ³μ μλννλ λ°©λ²μ΄ μμ μ μμ΅λλ€.
ν κ°μ§ κ°λ₯μ±μ μ΄λ©μΌλ‘ λ΅λ³ν μ μλ κΈ°λ₯μ΄ νμ±νλ μ μ© Discourse μ¬μ©μλ₯Ό λ§λ€κ³ , Power Automate λ Azure Logic App κ³Ό κ°μ λꡬλ₯Ό μ¬μ©νμ¬ λ μ§κ° ν¬ν¨λ κ°λ³ λ΅λ³μ μμ±ν λ€ μ΄λ©μΌμ ν΅ν΄ μΊλ¦°λ ν ν½μΌλ‘ μ μ‘νλ κ²μ
λλ€.
μλ₯Ό λ€μ΄, μ’
λ£μΌμ΄ μλ μ£Όκ° μμ½μ μλν λꡬλ₯Ό ν΅ν΄ νμν κ°λ³ λ΅λ³μΌλ‘ νμ₯λ μ μμ΅λλ€. μ΄λ κ² νλ©΄ νλΆλͺ¨λ€μ λΆλ¦¬λ μ΄λ²€νΈ ν ν½μ΄ μλ, νμμ κ°μ λ¨μΌ ν ν½ μΊλ¦°λλ₯Ό λ³Ό μ μμ΅λλ€.
Discourseμ μ¬μ©μλ³ μ΄λ©μΌ λ΅λ³ ν€ μ€μ κ³Ό κ΄λ ¨νμ¬ μ£Όμ κΉκ² ꡬμ±ν΄μΌ ν μΈλΆ μ¬νμ΄ λͺ κ°μ§ μμΌλ―λ‘, μ΄ ν ν½μμ κ΅¬μ± κ³Όμ μ μμΈν λ€λ£¨κΈ°λ μ μ νμ§ μμ μ μμ΅λλ€.
μ΄ λ°©μμ΄ μ μ©ν κ² κ°λ€λ©΄, λ³λμ λ©ν ν ν½μμ ν¨κ» ν΄κ²°νλ κ²μ κΈ°κΊΌμ΄ λμλλ¦¬κ² μ΅λλ€.
μμ§ ν λ²λ§ κ·Έλ° μΌμ΄ μμμΌλ, λ€μμ λ€μ λ°μνλ©΄ κ·ΈλκΉμ§ κΈ°λ€λ¦¬κ² μ΅λλ€(λ€μ μΌμ΄λμ§ μκΈ°λ₯Ό λ°λΌλ©°).
μ΄λ©μΌλ‘ λ΅μ₯νλ λ°©λ²μ μ μ§νκ² μ΅λλ€. κ°μ¬ν©λλ€. κ·Έλ°λ° μΌ λ
λ΄λ΄ λ§€μ£Ό μ΄λ¦¬λ μ΄λ²€νΈμ κ²½μ°, 52κ°μ λ΅μ₯μ λͺ¨λ μμ±ν΄μΌ νλ€λ λ»μΈκ°μ? κ·Έλ¬λ©΄ μ£Όμ κ° μ½κΈ° νλ€μ΄μ§ κ² κ°μλ°β¦
κ·Έ μΈμλ κ΄λ¦¬μ κΆνμ΄ μμΌλ―λ‘ APIλ₯Ό ν΅ν΄ μμ½μ μλμΌλ‘ μΆκ°νλ λ°©λ²λ μ¬μ©ν μ μμ κ² κ°μ΅λλ€.
μλ €μ£Όμ
μ κ°μ¬ν©λλ€!
Ethsim2
(Ethan )
9μ 4, 2026, 9:40μ€ν
13
λ€ β λΆννλ APIλ₯Ό μ¬μ©νλ©΄ λ΅κΈ μμ±μ μλνλμ§λ§, νΌλ λ¬Έμ λ μ€μ λ‘ ν΄κ²°λμ§ μμ΅λλ€. ν ν½ μΊλ¦°λμ κ²½μ° κ°λ³ μΊλ¦°λ νλͺ©μ΄ μ¬μ ν κ°λ³ λ΅κΈλ‘ νμλλ―λ‘μ.
λ€ννλ κ±°μ λμΌν μ¬μ© μ¬λ‘λ₯Ό λ€λ£¨λ κΈ°μ‘΄ κΈ°λ₯ μμ²μ μ°Ύμμ΅λλ€:
Using the discourse-calendar-and-event , my fellow students and I were missing a feature that we think would improve the benefit of this plugin greatly.
Imagine this case:
We are using a calendar topic in order to organize the usage and occupancy of a specific room.
For twelve consecutive Wednesdays, the room will be occupied by a course from 10 AM till 3 PM, except for one Wednesday.
As of now we see two options to add recurring items that have a start -and end-date:
We either post each datβ¦
μ΄ μμμμλ 12μ£Ό μ°μ μμμΌμ μ§νλλ κ³Όμ μ λ€λ£¨κ³ μμΌλ©°, λμΌν μ μ μ§μ νκ³ μμ΅λλ€. μ¦, λͺ¨λ λ°μ 건μ κ°λ³μ μΌλ‘ μμ±νλ κ²μ λ²κ±°λ‘κ³ ν ν½μ νΌλμ€λ½κ² λ§λλλ€.
κ·Έλ€μ λ μ§/μκ° μ½μ
μμ λ°λ³΅ μ€μ μ νμ©νκ³ , λ§μ§λ§ λ°μ 건μ μν μ’
λ£ λ μ§λ₯Ό ν¨κ» μ§μ ν μ μλλ‘ μ μνκ³ μλλ°, μ΄λ κ·νκ° νμλ‘ νλ κ²κ³Ό λ§€μ° μ μ¬ν΄ 보μ
λλ€.
λ°λΌμ 52κ°μ κ²μλ¬Όμ μμ±νλ API/Power Automate μ°ν μ루μ
μ ꡬμΆνλ κ²λ³΄λ€λ, ν΄λΉ κΈ°λ₯ μμ²μ νκ΅ μΊλ¦°λ μ¬μ© μ¬λ‘λ₯Ό μΆκ°νλ κ²μ΄ λ λμ μ νμΌ κ²μ
λλ€.
1κ°μ μ’μμ
κ³ λ§μμ, κ·Έλ κ² ν κ²μ!
Ethsim2
(Ethan )
9μ 5, 2026, 6:39μ€μ
15
μ λ¦¬κ° μ λ κΉ κ±±μ λλ€λ©΄, μ£Όμ λ³ μΊλ¦°λ λμ Events_calendar_categories μ€μ μ μ¬μ©νκΈΈ κΆμ₯ν©λλ€. κ·Έλ¦¬κ³ λΆλͺ¨λ€μ μλ μλνλ₯Ό ν΅ν΄ Discourseμ μ κ·Όν μ μμ΅λλ€:
This documentation explains how to create a link that starts a new topic in Discourse with pre-filled information.
Required user level: All users
Sometimes you may want to provide users with a link that opens a new topic composer with certain information pre-filled. This can be useful for various use cases including bug report templates, feature requests, or standardized posts.
Constructing the URL
Base URL
To compose a new pre-filled topic with no extra iβ¦