## 5.2.4 Repeat Rules

Repeat rules specify an entry's repeat status, that is, the recurrence of the entry. There are six repeat types:

• `daily`: repeated daily
• `weekly`: repeat on the specified days of the week, such as Monday and Wednesday, etc.
• `monthly_by_dates`: repeat monthly on the specified dates, such as the 15th and 17th day of the month
• `monthly_by_days`: repeat monthly on the specified days, such as the fourth Wednesday of the month, or the last Monday of the month
• `yearly_by_date`: repeat yearly on the specified date, such as December 24
• `yearly_by_day`: repeat yearly on the specified day, such as every third Tuesday of May

There are exceptions to repeat rules. For example, you can specify the datetime value (float) in such a way that the entry is not repeated on a specific day even if the repeat rule would specify otherwise.

You must set the start and end dates (floats) of the repeat. The end date can also be set to `None` to indicate that the repeating continues forever. You can set `interval` defining how often the repeat occurs, for example in a daily repeat: `1` means every day, `2` means every second day, etc. You can also set the `days` specifier which lets you explicitly specify the repeat days; for example in a weekly repeat you can set `"days":[0,2]` which sets the repeat to occur on Mondays and Wednesdays. If you do not set the `days` specifier, the repeat days are calculated automatically based on the start date.

You can modify repeat data by calling ```rep_data = entry.get_repeat()```, then making changes to `rep_data` dictionary, and then calling `entry.set_repeat(rep_data)`.

Repeating can be cancelled by calling `entry.set_repeat` with a parameter that is interpreted to be false, such as `entry.set_repeat(None)`.

Repeat definition examples:

```
repeat = {"type":"daily", #repeat type
"exceptions":[exception_day, exception_day+2*24*60*60],
#no appointment on those days
"start":appt_start_date, #start of the repeat
"end":appt_start_date+30*24*60*60, #end of the repeat
"interval":1} #interval (1=every day, 2=every second day etc.)

repeat = {"type":"weekly", #repeat type
"days":[0,1], #which days in a week (Monday, Tuesday)
"exceptions":[exception_day], #no appointment on that day
"start":appt_start_date, #start of the repeat
"end":appt_start_date+30*24*60*60, #end of the repeat
"interval":1}
#interval (1=every week, 2=every second week etc.)

repeat = {"type":"monthly_by_days", #repeat type
# appointments on second Tuesday and last Monday of the month
"days":[{"week":1, "day":1},{"week":4, "day":0}],
"exceptions":[exception_day], #no appointment on that day
"start":appt_start_date, #start of the repeat
"end":appt_start_date+30*24*60*60, #end of the repeat
"interval":1}
#interval (1=every month, 2=every second month etc.)

repeat = {"type":"monthly_by_dates", #repeat type
"days":[0,15],
# appointments on the 1st and 16th day of the month.
"exceptions":[exception_day], #no appointment on that day
"start":appt_start_date, #start of the repeat
"end":appt_start_date+30*24*60*60, #end of the repeat
"interval":1}
#interval (1=every month, 2=every second month etc.)

repeat = {"type":"yearly_by_date", #repeat type
"exceptions":[exception_day], #no appointment on that day
"start":appt_start_date, #start of the repeat
"end":appt_start_date+3*365*24*60*60, #end of the repeat
"interval":1}
#interval (1=every year, 2=every second year etc.)

repeat = {"type":"yearly_by_day", #repeat type
# appointments on the second Tuesday of February
"days":{"day":1, "week":1, "month":1},
"exceptions":[exception_day], #no appointment on that day
"start":appt_start_date, #start of the repeat
"end":appt_start_date+3*365*24*60*60, #end of the repeat
"interval":1}
#interval (1=every year, 2=every second year etc.)
```