diff --git a/iridisite/__pycache__/settings.cpython-312.pyc b/iridisite/__pycache__/settings.cpython-312.pyc index be4c2c4..e59721b 100644 Binary files a/iridisite/__pycache__/settings.cpython-312.pyc and b/iridisite/__pycache__/settings.cpython-312.pyc differ diff --git a/tutoring_student/__pycache__/admin.cpython-312.pyc b/tutoring_student/__pycache__/admin.cpython-312.pyc index d30f0f7..cb9ff56 100644 Binary files a/tutoring_student/__pycache__/admin.cpython-312.pyc and b/tutoring_student/__pycache__/admin.cpython-312.pyc differ diff --git a/tutoring_student/__pycache__/backends.cpython-312.pyc b/tutoring_student/__pycache__/backends.cpython-312.pyc index 304e16d..b59c363 100644 Binary files a/tutoring_student/__pycache__/backends.cpython-312.pyc and b/tutoring_student/__pycache__/backends.cpython-312.pyc differ diff --git a/tutoring_student/__pycache__/models.cpython-312.pyc b/tutoring_student/__pycache__/models.cpython-312.pyc index b58acba..9e51a68 100644 Binary files a/tutoring_student/__pycache__/models.cpython-312.pyc and b/tutoring_student/__pycache__/models.cpython-312.pyc differ diff --git a/tutoring_student/__pycache__/tests.cpython-312.pyc b/tutoring_student/__pycache__/tests.cpython-312.pyc index d037f56..ea32d95 100644 Binary files a/tutoring_student/__pycache__/tests.cpython-312.pyc and b/tutoring_student/__pycache__/tests.cpython-312.pyc differ diff --git a/tutoring_student/__pycache__/urls.cpython-312.pyc b/tutoring_student/__pycache__/urls.cpython-312.pyc index ed1a918..99ba0c9 100644 Binary files a/tutoring_student/__pycache__/urls.cpython-312.pyc and b/tutoring_student/__pycache__/urls.cpython-312.pyc differ diff --git a/tutoring_student/__pycache__/views.cpython-312.pyc b/tutoring_student/__pycache__/views.cpython-312.pyc index 8449468..58072b0 100644 Binary files a/tutoring_student/__pycache__/views.cpython-312.pyc and b/tutoring_student/__pycache__/views.cpython-312.pyc differ diff --git a/tutoring_student/admin.py b/tutoring_student/admin.py index bc32fb0..fe72f26 100644 --- a/tutoring_student/admin.py +++ b/tutoring_student/admin.py @@ -1,7 +1,18 @@ from django.contrib import admin -from .models import Tutor, Student, TutoringSession +from .models import * +class RecurringInline(admin.TabularInline): + model = RecurringSession.sessions.through + +class RecurringAdmin(admin.ModelAdmin): + """Recurring admin.""" + model = RecurringSession + inlines = [ + RecurringInline, + ] + exclude = ('sessions',) # Register your models here. admin.site.register(Tutor) admin.site.register(Student) admin.site.register(TutoringSession) +admin.site.register(RecurringSession, RecurringAdmin) \ No newline at end of file diff --git a/tutoring_student/migrations/0003_tutoringsession_isrecurring_recurringsession.py b/tutoring_student/migrations/0003_tutoringsession_isrecurring_recurringsession.py new file mode 100644 index 0000000..e14ada5 --- /dev/null +++ b/tutoring_student/migrations/0003_tutoringsession_isrecurring_recurringsession.py @@ -0,0 +1,70 @@ +# Generated by Django 5.0.3 on 2024-03-16 17:52 + +import django.core.validators +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("tutoring_student", "0002_alter_student_additionalcomments_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="tutoringsession", + name="isRecurring", + field=models.BooleanField(default=False), + ), + migrations.CreateModel( + name="RecurringSession", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("dayOfWeek", models.CharField(max_length=10)), + ("time", models.TimeField(verbose_name="Time of Session")), + ("startDate", models.DateField(verbose_name="Starting Date")), + ("endDate", models.DateField(verbose_name="Ending Date")), + ( + "duration", + models.DecimalField( + decimal_places=1, + max_digits=2, + validators=[django.core.validators.MaxValueValidator(1.5)], + verbose_name="Duration of Session (Hours)", + ), + ), + ("subject", models.CharField(max_length=100)), + ( + "description", + models.TextField( + verbose_name="Further Description of Student Needs" + ), + ), + ("gradeLevel", models.CharField(max_length=100)), + ("preferredPlatform", models.CharField(default="Zoom", max_length=100)), + ( + "student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="tutoring_student.student", + ), + ), + ( + "tutor", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="tutoring_student.tutor", + ), + ), + ], + ), + ] diff --git a/tutoring_student/migrations/0004_recurringsession_sessions.py b/tutoring_student/migrations/0004_recurringsession_sessions.py new file mode 100644 index 0000000..f9618d0 --- /dev/null +++ b/tutoring_student/migrations/0004_recurringsession_sessions.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.3 on 2024-03-17 02:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("tutoring_student", "0003_tutoringsession_isrecurring_recurringsession"), + ] + + operations = [ + migrations.AddField( + model_name="recurringsession", + name="sessions", + field=models.ManyToManyField(to="tutoring_student.tutoringsession"), + ), + ] diff --git a/tutoring_student/migrations/0005_alter_recurringsession_sessions.py b/tutoring_student/migrations/0005_alter_recurringsession_sessions.py new file mode 100644 index 0000000..f5d81a1 --- /dev/null +++ b/tutoring_student/migrations/0005_alter_recurringsession_sessions.py @@ -0,0 +1,20 @@ +# Generated by Django 5.0.3 on 2024-03-17 03:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("tutoring_student", "0004_recurringsession_sessions"), + ] + + operations = [ + migrations.AlterField( + model_name="recurringsession", + name="sessions", + field=models.ManyToManyField( + blank=True, default=[], to="tutoring_student.tutoringsession" + ), + ), + ] diff --git a/tutoring_student/models.py b/tutoring_student/models.py index b564929..aaaba4f 100644 --- a/tutoring_student/models.py +++ b/tutoring_student/models.py @@ -50,15 +50,7 @@ class TutoringSession(models.Model): """ def __str__(self): - return ( - self.student.studentName - + " - " - + str(self.date) - + " - " - + str(self.time) - + " - " - + self.subject - ) + return self.student.studentName + " - " + str(self.date) # Session Information date = models.DateField("Date of Session") @@ -73,6 +65,7 @@ def __str__(self): description = models.TextField("Further Description of Student Needs") gradeLevel = models.CharField(max_length=100) preferredPlatform = models.CharField(default="Zoom", max_length=100) + isRecurring = models.BooleanField(default=False) # Personal Information student = models.ForeignKey(Student, on_delete=models.CASCADE) @@ -87,3 +80,97 @@ def is_today(self): def has_tutor(self): return self.tutor is not None + + +class RecurringSession(models.Model): + """ + Model for recurring session + """ + + def __str__(self): + return ( + self.student.studentName + + " - " + + self.tutor.tutorName + + " - " + + self.dayOfWeek + ) + + # Recurring session information + student = models.ForeignKey(Student, on_delete=models.CASCADE) + tutor = models.ForeignKey(Tutor, on_delete=models.CASCADE) + sessions = models.ManyToManyField(TutoringSession, default=[], blank=True) # all sessions related to this recurring + dayOfWeek = models.CharField(max_length=10) + time = models.TimeField("Time of Session") + startDate = models.DateField("Starting Date") + endDate = models.DateField("Ending Date") + duration = models.DecimalField( + "Duration of Session (Hours)", + max_digits=2, + decimal_places=1, + validators=[MaxValueValidator(1.5)], + ) + subject = models.CharField(max_length=100) + description = models.TextField("Further Description of Student Needs") + gradeLevel = models.CharField(max_length=100) + preferredPlatform = models.CharField(default="Zoom", max_length=100) + + def was_in_the_past(self): + """Tests if the recurring sessions has ended + + Returns: + bool: True if the recurring session has ended, False otherwise + """ + return self.endDate < timezone.now().date() + + def generate_sessions(self): + """Generate all sessions for the recurring session given startDate and endDate and daysOfWeek + + Returns: + bool: True if sessions have been generated successfully + """ + days = [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday", + ] + assert self.dayOfWeek in days + try: + self.generate_sessions_helper(day=days.index(self.dayOfWeek)) + return True + except: + return False + + def generate_sessions_helper(self, day): + """Helper function to generate all sessions for the recurring session given a day of the week + + Args: + day (int): day of the week, 0 for Monday, 1 for Tuesday, ..., 6 for Sunday + + Returns: + bool: True if sessions have been generated successfully + """ + start = datetime.datetime.strptime(self.startDate, "%Y-%m-%d").date() + end = datetime.datetime.strptime(self.endDate, "%Y-%m-%d").date() + while start <= end: + if start.weekday() == day: + session = TutoringSession( + date=start, + time=self.time, + duration=self.duration, + subject=self.subject, + description=self.description, + gradeLevel=self.gradeLevel, + preferredPlatform=self.preferredPlatform, + student=self.student, + tutor=self.tutor, + isRecurring=True, + ) + session.save() + self.sessions.add(session) + start += datetime.timedelta(days=1) + return True diff --git a/tutoring_student/templates/tutoring_student/index.html b/tutoring_student/templates/tutoring_student/index.html index ca17ad4..67643b3 100644 --- a/tutoring_student/templates/tutoring_student/index.html +++ b/tutoring_student/templates/tutoring_student/index.html @@ -292,7 +292,7 @@
- {{tutoringSession.tutor.tutorName}} has signed up for your session and + {{tutoringSession.tutor.tutorName}} {% if tutoringSession.isRecurring %} is your designated recurring tutor. Please contact them + with any questions. + {% else %} has signed up for your session and will reach out soon about the details of your session. If you have any questions, feel free to contact us at iridiumtutoring@gmail.com. + >. {% endif %}
{% endif %} diff --git a/tutoring_student/templates/tutoring_student/session-tutor.html b/tutoring_student/templates/tutoring_student/session-tutor.html index 4af2ef6..8f99124 100644 --- a/tutoring_student/templates/tutoring_student/session-tutor.html +++ b/tutoring_student/templates/tutoring_student/session-tutor.html @@ -69,6 +69,7 @@You may contact the student via their email of phone number to ask any additional questions about their request. If the student asks to change the time/topic, please contact an administrator to update the session accordingly. To claim this session, press the claim session button below and follow up with an email to the student.