This a App based in [dateutil.rrule](https://github.com/dateutil/dateutil/) module to work with recurrence dates This App aims to be more flexible than[ django-reccurence](https://github.com/django-recurrence/django-recurrence)
pip install git+https://github.com/agenteAND/django-rrules.git#egg=djangorrules
Detailed documentation is in the "docs" directory.
Add "djangorrules" and requirements to your INSTALLED_APPS setting like this:
INSTALLED_APPS = [ # requirements 'multiselectfield', # ------------------ 'djangorrules', ]
Run
python manage.py migrate
to create the djangorrules models.Start the development server and visit http://127.0.0.1:8000/admin/ to create a Recurrence (you'll need the Admin app enabled).
- Python 3.6+
- django 2.2+
- django-multiselectfield / pip install django-multiselectfield
- python-dateutil / pip install python-dateutil
- django-select2 (optional if you want to use form) / pip install django-select2
from django.db import models
from djangorrules.models import Recurrence
class Event(models.Model):
e_name = models.CharField(max_length=100)
e_something = models.CharField(max_length=30)
recurrence = models.ForeignKey(Recurrence, related_name='recurrences', related_query_name='recurrence')
>>> from djangorrules.models import Rule, Recurrence, RDate >>> from datetime import datetime >>> dt = datetime(1993, 7, 25) >>> daily = Rule(recurrence=re, dtstart=dt, freq=Rule.DAILY, freq_type=Rule.COUNT, interval=1, count=20) >>> daily >>> <Rule: daily, for 20 occurrences> >>> str(daily) >>> daily, for 20 occurrences' >>> daily.to_dateutil_rule >>> <dateutil.rrule.rrule at 0x7f0710aca898>77 >>> >>> for date in daily.to_dateutil_rule: ...:print(date) ...: 1993-07-25 05:03:07-04:00 1993-07-26 05:03:07-04:00 1993-07-27 05:03:07-04:00 1993-07-28 05:03:07-04:00 1993-07-29 05:03:07-04:00 1993-07-30 05:03:07-04:00 1993-07-31 05:03:07-04:00 1993-08-01 05:03:07-04:00 1993-08-02 05:03:07-04:00 1993-08-03 05:03:07-04:00 1993-08-04 05:03:07-04:00 1993-08-05 05:03:07-04:00 1993-08-06 05:03:07-04:00 1993-08-07 05:03:07-04:00 1993-08-08 05:03:07-04:00 1993-08-09 05:03:07-04:00 1993-08-10 05:03:07-04:00 1993-08-11 05:03:07-04:00 1993-08-12 05:03:07-04:00 1993-08-13 05:03:07-04:00 >>> my_birthday = Rule(recurrence=re, dtstart=dt, freq=Rule.YEARLY, bymonth=['7'], bymonthday=['25'], freq_type=Rule.COUNT, interval=1, count=27) In [25]: str(my_birthday) Out[25]: 'annually, in Jul, on the 25th, for 27 occurrences' >>> for date in my_birthday.to_dateutil_rule: ...:print(date) ...: 1993-07-25 05:03:07-04:00 1994-07-25 05:03:07-04:00 1995-07-25 05:03:07-04:00 1996-07-25 05:03:07-04:00 1997-07-25 05:03:07-04:00 1998-07-25 05:03:07-04:00 1999-07-25 05:03:07-04:00 2000-07-25 05:03:07-04:00 2001-07-25 05:03:07-04:00 2002-07-25 05:03:07-04:00 2003-07-25 05:03:07-04:00 2004-07-25 05:03:07-04:00 2005-07-25 05:03:07-04:00 2006-07-25 05:03:07-04:00 2007-07-25 05:03:07-04:00 2008-07-25 05:03:07-04:00 2009-07-25 05:03:07-04:00 2010-07-25 05:03:07-04:00 2011-07-25 05:03:07-04:00 2012-07-25 05:03:07-04:00 2013-07-25 05:03:07-04:00 2014-07-25 05:03:07-04:00 2015-07-25 05:03:07-04:00 2016-07-25 05:03:07-04:00 2017-07-25 05:03:07-04:00 2018-07-25 05:03:07-04:00 2019-07-25 05:03:07-04:00 >>> rules = Rule(recurrence=re, dtstart=dt, freq=Rule.YEARLY, bymonth=['7'], byweekday=['MO', 'WE'], freq_type=Rule.COUNT, interval=1, count=30, bysetpos=['-1', '2']) >>> rules.rule_to_text() >>> 'annually, in July, on the Monday or Wednesday, only the last or second instance, for 30 occurrences' .. and more ....
coming soon I will add unittest and implement the pip install and more documentation.
PS: this app works, but use it at your own risk i'm not an expert contributions are welcome at this stage of development.