Skip to content

Commit

Permalink
RecurringSession Model, Tutor Utilities, ManyToMany Rel
Browse files Browse the repository at this point in the history
  • Loading branch information
charlestang06 committed Mar 17, 2024
1 parent 22bd3a3 commit a2ed6bb
Show file tree
Hide file tree
Showing 24 changed files with 1,146 additions and 24 deletions.
Binary file modified iridisite/__pycache__/settings.cpython-312.pyc
Binary file not shown.
Binary file modified tutoring_student/__pycache__/admin.cpython-312.pyc
Binary file not shown.
Binary file modified tutoring_student/__pycache__/backends.cpython-312.pyc
Binary file not shown.
Binary file modified tutoring_student/__pycache__/models.cpython-312.pyc
Binary file not shown.
Binary file modified tutoring_student/__pycache__/tests.cpython-312.pyc
Binary file not shown.
Binary file modified tutoring_student/__pycache__/urls.cpython-312.pyc
Binary file not shown.
Binary file modified tutoring_student/__pycache__/views.cpython-312.pyc
Binary file not shown.
13 changes: 12 additions & 1 deletion tutoring_student/admin.py
Original file line number Diff line number Diff line change
@@ -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)
Original file line number Diff line number Diff line change
@@ -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",
),
),
],
),
]
18 changes: 18 additions & 0 deletions tutoring_student/migrations/0004_recurringsession_sessions.py
Original file line number Diff line number Diff line change
@@ -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"),
),
]
Original file line number Diff line number Diff line change
@@ -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"
),
),
]
105 changes: 96 additions & 9 deletions tutoring_student/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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)
Expand All @@ -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
2 changes: 1 addition & 1 deletion tutoring_student/templates/tutoring_student/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ <h1 class="text-center pt-5 fw-bold" id="register_header">
<option value="English">English</option>
<option value="History">History</option>
<option value="Computer Science">Computer Science</option>
<option value="Computer Science">
<option value="Standardized Tests">
Standardized Tests (SAT/AP)
</option>
<option value="Other">Other</option>
Expand Down
128 changes: 128 additions & 0 deletions tutoring_student/templates/tutoring_student/recurring_details.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
crossorigin="anonymous"
/>
<link
href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css"
rel="stylesheet"
/>
{% load static %}
<link href="{% static 'tutoring_student/style.css' %}" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title id="title">Iridium Tutoring | Tutor</title>
<style>
.glow {
transition: box-shadow 0.3s ease-in-out;
}

.glow:hover {
box-shadow: 0 0 20px 2px rgba(0, 0, 0, 0.15); /* Adjust the glow effect */
}
</style>
</head>
<body>
{% load static %}
<!-- Nav Bar-->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark navbar-inverse">
<div class="container-fluid">
<a class="navbar-brand" href="https://www.iridiumtutoring.org"
><img
src="{% static 'tutoring_student/images/iridiumbannerheader.png' %}"
class="img-fluid"
style="height: 3rem"
alt="Iridium Tutoring Logo"
/></a>
<button
class="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#navbarNavAltMarkup"
aria-controls="navbarNavAltMarkup"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
<div class="navbar-nav">
<a
class="nav-link fw-bold"
href="{% url 'tutoring_student:index' %}"
>Home</a
>
<a
class="nav-link fw-bold"
href="{% url 'tutoring_student:tutorView' %}"
>Tutors</a
>
<a
class="nav-link fw-bold"
href="{% url 'tutoring_student:tutorProfile' %}"
>Profile</a
>
<a
class="nav-link active fw-bold"
aria-current="page"
href="{% url 'tutoring_student:tutorUtilities' %}"
>Utilities</a
>
</div>
</div>
<!-- Align with right side of navbar -->
<div class="nav navbar-nav ml-auto mr-0">
{% if not user %}
<a class="nav-link fw-bold" href="https://www.iridiumtutoring.org"
>Back To Main Site</a
>
{% endif %}
{% if user %}
<a href="{% url 'tutoring_student:tutor_logout' %}">
<button class="btn btn-outline-light">
<i class="bi bi-box-arrow-right fw-bold"></i>
</button>
</a>
{% endif %}
</div>
</div>
</nav>
{% if user %}
<div class="container mt-3">
<h1 class="text-center mt-5">{{recurring.student.studentName}}'s Recurring Session</h1>
<hr />
<div class="row justify-content-md-center mt-5 mb-3">
<div class="col d-none d-md-block"> </div>
<div class="list-group col-12 col-md-7">
{% for session in recurring.sessions.all %}
<a class="list-group-item list-group-item-action"
><div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">{{session.student.studentName}} - {{session.subject}} (Grade {{session.gradeLevel}})</h5>
{% if session.isRecurring %}
<span class="badge bg-secondary align-self-start">Recurring</span>
{% endif %}
</div>
<small>{{session.date}} - {{session.time}} ({{session.duration}} hours)</small>
</a>
{% endfor %}

</div>
<div class="col d-none d-md-block"> </div>
</div>
<a class="btn btn-secondary btn-lg rounded-pill mt-3" href="{% url 'tutoring_student:tutorRecurrings' %}" role="button">Go Back</a>
</div>

{% endif %}
<!-- Footer-->
{% include 'tutoring_student/footer.html' %}
</body>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
crossorigin="anonymous"
></script>
</html>
Loading

0 comments on commit a2ed6bb

Please sign in to comment.