def ensure_next_after_previous(state, kind, organisation, title, periodicity, minimum_from_today, acceptable_weekdays=range(7), number=1, time=None, locations=[]): events = Event.objects.filter(organisation=organisation, date__gte=date.today()) # there are already events ready, don't do anything if events.exists(): print "events already exists, don't do anything" return minimum_from_today_absolute = date.today() + timedelta(**minimum_from_today) previous_event_date = Event.objects.order_by('-date') periodicity = timedelta(**periodicity) if previous_event_date.exists(): previous_event_date = previous_event_date.first().date candidate_date = previous_event_date + periodicity else: previous_event_date = None candidate_date = date.today() + timedelta(**minimum_from_today) while candidate_date < minimum_from_today_absolute: candidate_date += periodicity number_this_year = Event.objects.filter(organisation=organisation, kind=kind, date__year=date.today().year).count() + 1 for i in range(number): while candidate_date.weekday() not in acceptable_weekdays: candidate_date += timedelta(days=1) event = Event() event.state = state event.organisation = organisation event.kind = kind event.date = candidate_date event.title = Template(title).render(Context({ "event": event, "number_this_year": number_this_year, })) print "Creating a new event '%s' for %s on %s state %s" % (event.title, organisation, candidate_date.strftime("%F"), state) if time: event.time = datetime.time(**time) event.save() candidate_date += timedelta(days=1)