பல சைக்கிள் குழுக்களுக்கு வழக்கமான சவாரிகள் உள்ளன - திங்கள் காலை பயணக் குழு, மாதத்தின் முதல் சனிக்கிழமை சாகசப் பயணம், அல்லது புதன் மாலை சமூக சுற்று. இப்போது வரை, அமைப்பாளர்கள் ஒவ்வொரு நிகழ்வையும் கைமுறையாக உருவாக்க வேண்டியிருந்தது. எங்கள் புதிய மீண்டும் நிகழும் விருந்துகள் அம்சத்துடன், நீங்கள் ஒரு முறை அட்டவணையை அமைத்து Party Onbici தானாகவே நிகழ்வுகளை உருவாக்க அனுமதிக்கலாம்.

ஒரு முறை நிகழ்வுகளின் சிக்கல்

சமூக சைக்கிள் குழுக்களுக்கு பொதுவாக கணிக்கக்கூடிய அட்டவணைகள் உள்ளன:

  • “ஒவ்வொரு செவ்வாய் மற்றும் வியாழன் காலை 6:30 மணிக்கு”
  • “ஒவ்வொரு மாதமும் முதல் ஞாயிறு”
  • “ஒவ்வொரு இரண்டாவது சனிக்கிழமை காலையில்”

இந்த நிகழ்வுகளை கைமுறையாக உருவாக்குவது சலிப்பானது, பிழை ஏற்படக்கூடியது, மற்றும் நிகழ்வுகள் முழுவதும் நிலையான வழித்தடங்கள் மற்றும் அமைப்புகளை பராமரிப்பதை கடினமாக்குகிறது.

iCalendar RRULE அறிமுகம்

iCalendar RRULE தரநிலையின் (RFC 5545) அடிப்படையில் எங்கள் மீண்டும் நிகழும் நிகழ்வுகள் அமைப்பை உருவாக்கினோம். இது Google Calendar, Apple Calendar மற்றும் Outlook ஆகியவை பயன்படுத்தும் அதே வடிவமாகும் - பரந்த நாட்காட்டி சுற்றுச்சூழலுடன் இணக்கத்தை உறுதி செய்கிறது.

எடுத்துக்காட்டு மறுநிகழ்வு வடிவங்கள்

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR
  → ஒவ்வொரு திங்கள், புதன் மற்றும் வெள்ளி

RRULE:FREQ=MONTHLY;BYDAY=1SA
  → ஒவ்வொரு மாதமும் முதல் சனிக்கிழமை

RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=SU
  → ஒவ்வொரு இரண்டாவது ஞாயிறு

RRULE:FREQ=DAILY;COUNT=10
  → 10 நிகழ்வுகளுக்கு தினமும்

தரவு மாதிரி

ஒரு RecurringParty ஒரு வார்ப்புருவாக செயல்பட்டு Party நிகழ்வுகளை உருவாக்குகிறது:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class RecurringParty(models.Model):
    name = models.CharField(max_length=255)

    # அட்டவணை கட்டமைப்பு
    start_date = models.DateField()
    end_date = models.DateField(null=True, blank=True)
    max_occurrences = models.PositiveIntegerField(null=True, blank=True)
    recurrence = RecurrenceField()  # RRULE வடிவம்

    # வார்ப்புரு புலங்கள் (ஒவ்வொரு நிகழ்வுக்கும் நகலெடுக்கப்படும்)
    departure_time = models.TimeField()
    arrival_time = models.TimeField()
    origin = PointField()
    destination = PointField()
    route = models.JSONField()
    difficulty = models.CharField(choices=DIFFICULTY_CHOICES)
    # ... பிற விருந்து பண்புகள்

    is_active = models.BooleanField(default=True)

ஒவ்வொரு உருவாக்கப்பட்ட Party நிகழ்வும் அதன் பெற்றோருடன் இணைக்கப்படுகிறது:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Party(models.Model):
    # ஏற்கனவே உள்ள புலங்கள்...

    # மீண்டும் நிகழும் விருந்து ஆதரவு
    scheduled_date = models.DateField(null=True, blank=True)
    recurring_parent = models.ForeignKey(
        RecurringParty,
        on_delete=models.SET_NULL,
        null=True,
        related_name="instances"
    )
    is_cancelled = models.BooleanField(default=False)

நிகழ்வு உருவாக்கம்

ஒரு மீண்டும் நிகழும் விருந்து உருவாக்கப்படும்போது அல்லது அட்டவணை மாறும்போது, வரவிருக்கும் காலத்திற்கு நிகழ்வுகளை உருவாக்குகிறோம்:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def generate_instances(self, lookahead_days: int = 30) -> list[Party]:
    """வரவிருக்கும் நிகழ்வுகளுக்கு விருந்து நிகழ்வுகளை உருவாக்கவும்."""
    occurrences = self.recurrence.between(
        datetime.now().date(),
        datetime.now().date() + timedelta(days=lookahead_days),
    )

    created = []
    for date in occurrences:
        # நிகழ்வு ஏற்கனவே இருந்தால் தவிர்க்கவும்
        if self.instances.filter(scheduled_date=date).exists():
            continue

        # வார்ப்புருவிலிருந்து புதிய விருந்து நிகழ்வை உருவாக்கவும்
        party = Party.objects.create(
            name=f"{self.name} - {date.strftime('%B %d')}",
            scheduled_date=date,
            recurring_parent=self,
            departure_time=self.departure_time,
            arrival_time=self.arrival_time,
            origin=self.origin,
            destination=self.destination,
            route=self.route,
            # ... பிற வார்ப்புரு புலங்களை நகலெடுக்கவும்
        )
        created.append(party)

    return created

Celery Beat மூலம் தானியங்கி உருவாக்கம்

தினசரி Celery பணி நிகழ்வுகளை புதுப்பித்த நிலையில் வைத்திருக்கிறது:

1
2
3
4
5
6
7
8
9
@shared_task
def generate_recurring_party_instances():
    """அனைத்து செயலில் உள்ள மீண்டும் நிகழும் விருந்துகளுக்கு விருந்து நிகழ்வுகளை உருவாக்கவும்."""
    for recurring_party in RecurringParty.objects.filter(is_active=True):
        created = recurring_party.generate_instances(lookahead_days=30)
        if created:
            logger.info(
                f"{recurring_party.name} க்கு {len(created)} நிகழ்வுகள் உருவாக்கப்பட்டன"
            )

Celery Beat அட்டவணை இதை நள்ளிரவில் இயக்குகிறது:

1
2
3
4
5
6
CELERY_BEAT_SCHEDULE = {
    "generate-recurring-party-instances": {
        "task": "party_onbici.apps.party.tasks.generate_recurring_party_instances",
        "schedule": crontab(hour=0, minute=0),  # தினமும் நள்ளிரவில்
    },
}

பயனர் இடைமுகம்

மீண்டும் நிகழும் விருந்தை உருவாக்குதல்

படிவம் RRULE வடிவங்களை உருவாக்க django-recurrence widget ஐப் பயன்படுத்துகிறது:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class RecurringPartyForm(forms.ModelForm):
    recurrence = RecurrenceField(
        label="மறுநிகழ்வு வடிவம்",
        help_text="இந்த விருந்து எப்போது மீண்டும் நடக்க வேண்டும் என்பதை அமைக்கவும்.",
        required=True,
    )

    class Meta:
        model = RecurringParty
        fields = [
            "name", "start_date", "end_date", "recurrence",
            "departure_time", "arrival_time",
            "origin", "destination", "description",
            "difficulty", "gender", "privacy",
        ]

பொதுவான வடிவங்களுக்கு widget உள்ளுணர்வு இடைமுகத்தை வழங்குகிறது:

  • தினசரி / வாராந்திர / மாதாந்திர / வருடாந்திர
  • வாரத்தின் குறிப்பிட்ட நாட்கள்
  • வரிசை வடிவங்கள் (முதல், இரண்டாவது, கடைசி)
  • தனிப்பயன் இடைவெளிகள் (ஒவ்வொரு 2 வாரங்களும்)
  • முடிவு நிபந்தனைகள் (தேதி வரை, N நிகழ்வுகளுக்குப் பிறகு, அல்லது ஒருபோதும் இல்லை)

நிகழ்வுகளை நிர்வகித்தல்

அமைப்பாளர்கள் உருவாக்கப்பட்ட அனைத்து நிகழ்வுகளையும் பார்க்கலாம் மற்றும்:

  • தனிப்பட்ட நிகழ்வுகளை திருத்தவும் - ஒரு நிகழ்வுக்கான வழித்தடம் அல்லது நேரத்தை மாற்றவும்
  • நிகழ்வுகளை ரத்து செய்யவும் - குறிப்பிட்ட தேதிகளை ரத்து செய்யப்பட்டதாக குறிக்கவும்
  • நிகழ்வுகளை மீண்டும் உருவாக்கவும் - அடுத்த 30 நாட்களுக்கு கைமுறையாக உருவாக்கத்தை தூண்டவும்

விளிம்பு நிகழ்வுகளை கையாளுதல்

நேர மண்டல விழிப்புணர்வு

அனைத்து தேதிகளும் அமைப்பாளரின் கட்டமைக்கப்பட்ட நேர மண்டலத்தில் சேமிக்கப்பட்டு பார்வையாளரின் உள்ளூர் நேரத்தில் காட்டப்படும்:

1
2
3
# நேர மண்டல விழிப்புணர்வு தேதிகளைப் பயன்படுத்தி நிகழ்வுகளை உருவாக்கவும்
local_tz = get_current_timezone()
today = timezone.now().astimezone(local_tz).date()

விடுமுறை மற்றும் விதிவிலக்கு கையாளுதல்

மீண்டும் நிகழும் வடிவத்தை பாதிக்காமல் பயனர்கள் தனிப்பட்ட நிகழ்வுகளை ரத்து செய்யலாம்:

1
2
3
party = recurring_party.instances.get(scheduled_date=holiday_date)
party.is_cancelled = True
party.save()

ரத்து செய்யப்பட்ட நிகழ்வுகள் இன்னும் காட்சி குறிகாட்டியுடன் பட்டியலில் தோன்றும், குழப்பத்தைத் தடுக்கும்.

அனாதை நிகழ்வுகள்

ஒரு மீண்டும் நிகழும் விருந்து நீக்கப்பட்டால், உருவாக்கப்பட்ட நிகழ்வுகள் விருப்பமாக பாதுகாக்கப்படலாம்:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def form_valid(self, form):
    delete_instances = request.POST.get("delete_instances") == "true"

    if delete_instances:
        # எதிர்கால நிகழ்வுகளை மென்மையாக நீக்கவும்
        recurring_party.instances.filter(
            scheduled_date__gte=date.today(),
            deleted_at__isnull=True,
        ).update(deleted_at=timezone.now())

    recurring_party.delete()

பயனர் அனுபவம்

வாராந்திர சவாரியை உருவாக்குவதற்கு சில படிகள் மட்டுமே தேவை:

  1. டாஷ்போர்டு → மீண்டும் நிகழும் விருந்துகள் → உருவாக்கு க்கு செல்லவும்
  2. உங்கள் விருந்து விவரங்களை அமைக்கவும் (வழித்தடம், நேரங்கள், சிரமம்)
  3. மறுநிகழ்வு வடிவத்தை கட்டமைக்கவும் (எ.கா., “ஒவ்வொரு சனிக்கிழமையும் காலை 8 மணிக்கு”)
  4. தொடக்க தேதி மற்றும் விருப்பமான முடிவு தேதியை அமைக்கவும்
  5. சேமிக்கவும் - நிகழ்வுகள் தானாகவே உருவாக்கப்படும்!

அமைப்பு 30 நாட்களுக்கு முன்பே விருந்து நிகழ்வுகளை உருவாக்குகிறது, மற்றும் நேரம் செல்லும்போது Celery புதியவற்றை உருவாக்கிக்கொண்டே இருக்கிறது.

சைக்கிள் சமூகங்களுக்கான நன்மைகள்

  • அமைத்துவிட்டு மறந்துவிடுங்கள் - வாராந்திர நிகழ்வு உருவாக்கம் இனி இல்லை
  • நிலைத்தன்மை - அதே வழித்தடம், அதே நேரம், அதே அமைப்புகள்
  • நெகிழ்வுத்தன்மை - தனிப்பட்ட நிகழ்வுகளை திருத்தவும் அல்லது ரத்து செய்யவும்
  • கண்டுபிடிப்பு - சவாரிக்காரர்கள் வழக்கமான குழு சவாரிகளை எளிதாக கண்டறியலாம்
  • நாட்காட்டி ஒருங்கிணைப்பு - உங்கள் நாட்காட்டி பயன்பாட்டில் மீண்டும் நிகழும் நிகழ்வுகளுக்கு சந்தா செலுத்தவும்

உங்கள் வழக்கமான சவாரியை அமைக்க தயாரா? மீண்டும் நிகழும் விருந்தை உருவாக்கவும் மற்றும் திட்டமிடலை எங்களிடம் விடுங்கள்!