diff --git a/src/accounts/models.py b/src/accounts/models.py
index 8e807e8..1d8fa9f 100644
--- a/src/accounts/models.py
+++ b/src/accounts/models.py
@@ -25,3 +25,9 @@ class User(AbstractUser):
choices=TIMEZONE_CHOICES,
default=MOUNTAIN
)
+
+ def __str__(self):
+ if self.first_name and self.last_name:
+ return f'{self.first_name} {self.last_name}'
+ else:
+ return self.username
diff --git a/src/accounts/templates/accounts/account_detail.html b/src/accounts/templates/accounts/account_detail.html
index fdbd203..7f4572b 100755
--- a/src/accounts/templates/accounts/account_detail.html
+++ b/src/accounts/templates/accounts/account_detail.html
@@ -1,72 +1,23 @@
{% extends 'base.html' %}
-{% load static %}
+
+{% block head_title %}Profile |{% endblock %}
{% block content %}
-
-
- Welcome {{user.first_name}} {{user.last_name }}
-
- Here's what's going on today
-
+
+
-
-
- Today's Assignments
-
- {% for component in components %}
- -
- {{component.subject}}, {{component}}
-
- {% empty %}
- Nothing for today.
- {% endfor %}
-
-
-
- Today's Attendance
- {% for day in attendance %}
- {{day.date}}
-
-
-
- | Student |
- Status |
-
-
-
- {% for entry in day.entry_set.all %}
-
- | {{entry.student}} |
- {{entry.get_status_display}} |
- Update |
-
- {% endfor %}
-
-
- {% empty %}
- No attendance taken yet: Take attendance
- {% endfor %}
-
-
- Assignments to be graded
-
+
+
+ - Username
+ - {{ user.username }}
+ - Email address
+ - {{ user.email }}
+
{% endblock %}
diff --git a/src/accounts/templates/accounts/account_list.html b/src/accounts/templates/accounts/account_list.html
deleted file mode 100755
index e3d9893..0000000
--- a/src/accounts/templates/accounts/account_list.html
+++ /dev/null
@@ -1,23 +0,0 @@
-{% extends 'base.html' %}
-
-{% block content %}
-
-{% endblock %}
diff --git a/src/accounts/urls.py b/src/accounts/urls.py
index 4f89f4f..dbe0da6 100644
--- a/src/accounts/urls.py
+++ b/src/accounts/urls.py
@@ -2,10 +2,21 @@ from django.urls import path, include
from . import views
urlpatterns = [
- path('', views.AccountListView.as_view(), name='account-list'),
path('/', include([
- path('', views.AccountDetailView.as_view(), name='account-detail'),
- path('update/', views.AccountUpdateView.as_view(), name='account-update'),
- path('delete/', views.AccountDeleteView.as_view(), name='account-delete'),
+ path(
+ '',
+ views.AccountDetailView.as_view(),
+ name='account-detail'
+ ),
+ path(
+ 'update/',
+ views.AccountUpdateView.as_view(),
+ name='account-update'
+ ),
+ path(
+ 'delete/',
+ views.AccountDeleteView.as_view(),
+ name='account-delete'
+ ),
])),
]
diff --git a/src/accounts/views.py b/src/accounts/views.py
index d5e8bc7..070266b 100644
--- a/src/accounts/views.py
+++ b/src/accounts/views.py
@@ -12,48 +12,14 @@ from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.forms import PasswordChangeForm
-from students.models import Student
-from gradebook.models import Component
-from attendance.models import Day, Entry
-
from .models import User
from .forms import AccountUpdateForm
-class AccountListView(LoginRequiredMixin, ListView):
- model = User
- template_name = 'accounts/account_list.html'
-
-
class AccountDetailView(LoginRequiredMixin, DetailView):
model = User
template_name = 'accounts/account_detail.html'
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- today = timezone.localtime(timezone.now()).date()
- enddate = today + dt.timedelta(days=7)
-
- context['birthdays'] = Student.objects.filter(
- dob__month=today.month,
- dob__day__range=[today.day, enddate.day]
- ).order_by('dob')
-
- context['components'] = Component.objects.filter(
- due_date=today
- ).select_related('subject')
-
- context['attendance'] = Day.objects.filter(
- date=today
- ).prefetch_related('entry_set', 'entry_set__student')
-
- context['ungraded_components'] = Component.objects.filter(
- due_date__lte=today,
- finished_grading=False
- ).select_related('subject')
-
- return context
-
class AccountUpdateView(LoginRequiredMixin, UpdateView):
model = User
diff --git a/src/attendance/__init__.py b/src/attendance/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/attendance/admin.py b/src/attendance/admin.py
deleted file mode 100644
index 186b2af..0000000
--- a/src/attendance/admin.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from django.contrib import admin
-
-from .models import Day, Entry
-
-admin.site.register(Day)
-admin.site.register(Entry)
diff --git a/src/attendance/apps.py b/src/attendance/apps.py
deleted file mode 100644
index ba31b45..0000000
--- a/src/attendance/apps.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from django.apps import AppConfig
-
-
-class AttendanceConfig(AppConfig):
- default_auto_field = 'django.db.models.BigAutoField'
- name = 'attendance'
diff --git a/src/attendance/forms.py b/src/attendance/forms.py
deleted file mode 100644
index 5a040a5..0000000
--- a/src/attendance/forms.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from django import forms
-from django.utils import timezone
-from .models import Day, Entry
-
-from students.models import Student
-
-
-class DayForm(forms.ModelForm):
- class Meta:
- model = Day
- fields = ('date',)
- widgets = {
- 'date': forms.DateInput(attrs = {
- 'type': 'date',
- }),
- }
-
-class EntryForm(forms.ModelForm):
- class Meta:
- model = Entry
- fields = ('day', 'student', 'status')
- widgets = {
- 'student': forms.HiddenInput()
- }
diff --git a/src/attendance/migrations/0001_initial.py b/src/attendance/migrations/0001_initial.py
deleted file mode 100644
index 8ed891f..0000000
--- a/src/attendance/migrations/0001_initial.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Generated by Django 3.2.7 on 2021-09-01 15:26
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
- initial = True
-
- dependencies = [
- ('students', '0001_initial'),
- ]
-
- operations = [
- migrations.CreateModel(
- name='Day',
- fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('date', models.DateField()),
- ],
- options={
- 'ordering': ('-date',),
- },
- ),
- migrations.CreateModel(
- name='Entry',
- fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('status', models.CharField(choices=[('P', 'Present'), ('T', 'Tardy'), ('A', 'Absent')], default='P', max_length=1)),
- ('day', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='attendance.day')),
- ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='students.student')),
- ],
- options={
- 'verbose_name_plural': 'entries',
- 'ordering': ('student',),
- },
- ),
- ]
diff --git a/src/attendance/migrations/__init__.py b/src/attendance/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/attendance/models.py b/src/attendance/models.py
deleted file mode 100644
index aba8f43..0000000
--- a/src/attendance/models.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from django.db import models
-from students.models import Student
-
-class Day(models.Model):
- class Meta:
- ordering = ('-date',)
-
- date = models.DateField()
-
- def __str__(self):
- return f"{self.date}"
-
-class Entry(models.Model):
- class Meta:
- verbose_name_plural = 'entries'
- ordering = ('student',)
-
- STATUS_CHOICES = [
- ('P', 'Present'),
- ('T', 'Tardy'),
- ('A', 'Absent'),
- ]
-
- day = models.ForeignKey(Day, on_delete=models.CASCADE)
- student = models.ForeignKey(Student, on_delete=models.CASCADE)
- status = models.CharField(
- max_length=1,
- choices=STATUS_CHOICES,
- default='P'
- )
-
- def __str__(self):
- return f"{self.day} | {self.student} | {self.status}"
diff --git a/src/attendance/templates/attendance/day_confirm_delete.html b/src/attendance/templates/attendance/day_confirm_delete.html
deleted file mode 100644
index 29a8cf1..0000000
--- a/src/attendance/templates/attendance/day_confirm_delete.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
- Delete {{day}}
-
-
-{% endblock %}
\ No newline at end of file
diff --git a/src/attendance/templates/attendance/day_create_form.html b/src/attendance/templates/attendance/day_create_form.html
deleted file mode 100644
index fe38267..0000000
--- a/src/attendance/templates/attendance/day_create_form.html
+++ /dev/null
@@ -1,34 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
-
-
-{% endblock %}
diff --git a/src/attendance/templates/attendance/day_form.html b/src/attendance/templates/attendance/day_form.html
deleted file mode 100644
index 9ea345e..0000000
--- a/src/attendance/templates/attendance/day_form.html
+++ /dev/null
@@ -1,34 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
-
-
-{% endblock %}
diff --git a/src/attendance/templates/attendance/day_list.html b/src/attendance/templates/attendance/day_list.html
deleted file mode 100644
index 2ef3a71..0000000
--- a/src/attendance/templates/attendance/day_list.html
+++ /dev/null
@@ -1,51 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
- Attendance
-
- Take attendance
-
-
- {% for day in day_list %}
-
-
-
-
- | Student |
- Status |
-
-
-
- {% for entry in day.entry_set.all %}
-
- | {{entry.student}} |
- {{entry.get_status_display}} |
- Update |
-
- {% endfor %}
-
-
- {% empty %}
- No attendance taken yet.
- {% endfor %}
-
-
-
-{% endblock %}
\ No newline at end of file
diff --git a/src/attendance/templates/attendance/entry_confirm_delete.html b/src/attendance/templates/attendance/entry_confirm_delete.html
deleted file mode 100644
index a640505..0000000
--- a/src/attendance/templates/attendance/entry_confirm_delete.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
- Delete {{entry}}
-
-
-{% endblock %}
\ No newline at end of file
diff --git a/src/attendance/templates/attendance/entry_form.html b/src/attendance/templates/attendance/entry_form.html
deleted file mode 100644
index ba63152..0000000
--- a/src/attendance/templates/attendance/entry_form.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
-
- For {{student}}
-
-
-{% endblock %}
\ No newline at end of file
diff --git a/src/attendance/tests.py b/src/attendance/tests.py
deleted file mode 100644
index 7ce503c..0000000
--- a/src/attendance/tests.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.test import TestCase
-
-# Create your tests here.
diff --git a/src/attendance/urls.py b/src/attendance/urls.py
deleted file mode 100644
index b77b6ff..0000000
--- a/src/attendance/urls.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from django.urls import path, include
-from . import views
-
-urlpatterns = [
- path('days/', views.DayListView.as_view(), name='day-list'),
- path('days/new/', views.DayCreateView.as_view(), name='day-create'),
- path('days//', include([
- path('', views.DayDetailView.as_view(), name='day-detail'),
- path('update/', views.DayUpdateView.as_view(), name='day-update'),
- path('delete/', views.DayDeleteView.as_view(), name='day-delete'),
- ])),
-
- path('entries/', views.EntryListView.as_view(), name='entry-list'),
- path('entries/new/', views.EntryCreateView.as_view(), name='entry-create'),
- path('entries//', include([
- path('', views.EntryDetailView.as_view(), name='entry-detail'),
- path('update/', views.EntryUpdateView.as_view(), name='entry-update'),
- path('delete/', views.EntryDeleteView.as_view(), name='entry-delete'),
- ])),
-]
diff --git a/src/attendance/views.py b/src/attendance/views.py
deleted file mode 100644
index d45ff60..0000000
--- a/src/attendance/views.py
+++ /dev/null
@@ -1,98 +0,0 @@
-from django.shortcuts import render
-from django.http import HttpResponseRedirect
-from django.urls import reverse_lazy, reverse
-from django.views.generic.base import TemplateView
-from django.views.generic.edit import FormView, CreateView, UpdateView, DeleteView
-from django.views.generic.detail import DetailView
-from django.views.generic.list import ListView
-from django.contrib.auth.mixins import LoginRequiredMixin
-from django.utils import timezone
-
-from django.db.models import Prefetch, Subquery, Count, Sum, F, Q, Value
-from django.db.models.functions import Length, Upper
-
-from students.models import Student
-from .models import Day, Entry
-from .forms import DayForm, EntryForm
-
-
-# Days
-class DayListView(LoginRequiredMixin, ListView):
- model = Day
- paginate_by = 7
-
- def get_queryset(self):
- object_list = Day.objects.all().prefetch_related('entry_set', 'entry_set__student')
- return object_list
-
-class DayCreateView(LoginRequiredMixin, CreateView):
- model = Day
- template_name_suffix = '_create_form'
- form_class = DayForm
- success_url = reverse_lazy('profile-detail')
-
- def get_initial(self):
- today = timezone.localtime(timezone.now()).date()
- initial = {
- 'date': today,
- }
- return initial
-
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context['student_list'] = Student.objects.all()
- return context
-
- def form_valid(self, form):
- form.save()
- for key, value in self.request.POST.items():
- if 'student' in key:
- s = key.split('_')[1]
- Entry.objects.create(
- day=form.instance,
- student=Student.objects.get(pk=s),
- status=value,
- )
- return super().form_valid(form)
-
-class DayDetailView(LoginRequiredMixin, DetailView):
- model = Day
-
-class DayUpdateView(LoginRequiredMixin, UpdateView):
- model = Day
- form_class = DayForm
- success_url = reverse_lazy('day-list')
-
- def form_valid(self, form):
- form.save()
- for key, value in self.request.POST.items():
- if 'student' in key:
- s = key.split('_')[1]
- Entry.objects.filter(day=self.object, student=s).update(status=value)
- return super().form_valid(form)
-
-class DayDeleteView(LoginRequiredMixin, DeleteView):
- model = Day
- success_url = reverse_lazy('day-list')
-
-
-# Entries
-class EntryListView(LoginRequiredMixin, ListView):
- model = Entry
-
-class EntryCreateView(LoginRequiredMixin, CreateView):
- model = Entry
- template_name_suffix = '_create_form'
- fields = ('__all__')
-
-class EntryDetailView(LoginRequiredMixin, DetailView):
- model = Entry
-
-class EntryUpdateView(LoginRequiredMixin, UpdateView):
- model = Entry
- form_class = EntryForm
- success_url = reverse_lazy('day-list')
-
-class EntryDeleteView(LoginRequiredMixin, DeleteView):
- model = Entry
- success_url = reverse_lazy('day-list')
diff --git a/src/core/admin.py b/src/core/admin.py
index 8c38f3f..1ebb17e 100644
--- a/src/core/admin.py
+++ b/src/core/admin.py
@@ -1,3 +1,23 @@
from django.contrib import admin
-# Register your models here.
+from .models import (
+ SchoolYear,
+ StudentTag,
+ Student,
+ Subject,
+ Tag,
+ Component,
+ Score,
+ SchoolDay,
+ AttendanceEntry,
+)
+
+admin.site.register(SchoolYear)
+admin.site.register(StudentTag)
+admin.site.register(Student)
+admin.site.register(Subject)
+admin.site.register(Tag)
+admin.site.register(Component)
+admin.site.register(Score)
+admin.site.register(SchoolDay)
+admin.site.register(AttendanceEntry)
diff --git a/src/core/context_processors.py b/src/core/context_processors.py
new file mode 100644
index 0000000..fc630b0
--- /dev/null
+++ b/src/core/context_processors.py
@@ -0,0 +1,8 @@
+from .models import SchoolYear
+from django.shortcuts import get_object_or_404
+
+
+def current_year(request):
+ return {
+ 'current_year': SchoolYear.objects.latest('year')
+ }
diff --git a/src/core/forms.py b/src/core/forms.py
index 7a137b5..4e2a0eb 100644
--- a/src/core/forms.py
+++ b/src/core/forms.py
@@ -16,22 +16,56 @@ from .models import (
class SchoolYearCreateForm(forms.ModelForm):
class Meta:
model = SchoolYear
- fields = [
- 'year'
- ]
+ fields = ['year']
class StudentForm(forms.ModelForm):
class Meta:
model = Student
- fields = (
+ fields = [
'student_id',
'first_name',
'last_name',
'address',
'dob',
- )
+ 'allergies',
+ 'tags'
+ ]
labels = {
'student_id': 'Student ID',
- 'dob': 'DOB',
+ 'dob': 'DOB'
+ }
+
+
+class ComponentCreateForm(forms.ModelForm):
+ class Meta:
+ model = Component
+ fields = [
+ 'name',
+ 'category',
+ 'due_date',
+ 'grade_total'
+ ]
+ widgets = {
+ 'due_date': forms.DateInput(attrs={'type': 'date'})
+ }
+
+
+class SchoolDayForm(forms.ModelForm):
+ class Meta:
+ model = SchoolDay
+ fields = ['date']
+ widgets = {
+ 'date': forms.DateInput(attrs={
+ 'type': 'date',
+ })
+ }
+
+
+class AttendanceEntryForm(forms.ModelForm):
+ class Meta:
+ model = AttendanceEntry
+ fields = ['status']
+ widgets = {
+ 'status': forms.RadioSelect()
}
diff --git a/src/core/migrations/0001_initial.py b/src/core/migrations/0001_initial.py
index fd3ee3f..2d6afad 100644
--- a/src/core/migrations/0001_initial.py
+++ b/src/core/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 4.0.5 on 2022-06-29 18:50
+# Generated by Django 4.0.5 on 2022-07-28 20:46
from django.db import migrations, models
import django.db.models.deletion
@@ -9,16 +9,41 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
- ('contenttypes', '0002_remove_content_type_name'),
]
operations = [
+ migrations.CreateModel(
+ name='Component',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=50)),
+ ('category', models.CharField(choices=[('QUIZ', 'Quiz'), ('ASSIGNMENT', 'Assignment'), ('TEST', 'Test')], default='ASSIGNMENT', max_length=255)),
+ ('due_date', models.DateField()),
+ ('grade_total', models.PositiveIntegerField()),
+ ('finished_grading', models.BooleanField(default=False)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
+ ],
+ options={
+ 'ordering': ['due_date'],
+ },
+ ),
migrations.CreateModel(
name='SchoolYear',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('start_date', models.DateField()),
- ('end_date', models.DateField()),
+ ('year', models.PositiveIntegerField(unique=True)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='StudentTag',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=255)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
],
),
migrations.CreateModel(
@@ -26,6 +51,8 @@ class Migration(migrations.Migration):
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=50)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
],
options={
'ordering': ['name'],
@@ -37,21 +64,14 @@ class Migration(migrations.Migration):
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=250)),
('description', models.CharField(blank=True, max_length=250)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
('school_year', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.schoolyear')),
],
options={
'ordering': ['name'],
},
),
- migrations.CreateModel(
- name='StudentTag',
- fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('tag', models.SlugField()),
- ('object_id', models.PositiveIntegerField()),
- ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')),
- ],
- ),
migrations.CreateModel(
name='Student',
fields=[
@@ -61,44 +81,58 @@ class Migration(migrations.Migration):
('last_name', models.CharField(max_length=50)),
('address', models.TextField(blank=True)),
('dob', models.DateField()),
+ ('allergies', models.CharField(blank=True, max_length=255)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
('school_year', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.schoolyear')),
+ ('tags', models.ManyToManyField(blank=True, to='core.studenttag')),
],
options={
'ordering': ['student_id', 'first_name'],
},
),
+ migrations.CreateModel(
+ name='Score',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('value', models.PositiveIntegerField()),
+ ('component', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.component')),
+ ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.student')),
+ ],
+ options={
+ 'ordering': ['student'],
+ },
+ ),
migrations.CreateModel(
name='SchoolDay',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateField()),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
('school_year', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.schoolyear')),
],
options={
'ordering': ['-date'],
},
),
- migrations.CreateModel(
- name='Component',
- fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(max_length=50)),
- ('category', models.CharField(choices=[('QUIZ', 'Quiz'), ('ASSIGNMENT', 'Assignment'), ('TEST', 'Test')], default='ASSIGNMENT', max_length=255)),
- ('due_date', models.DateField()),
- ('grade_total', models.PositiveIntegerField()),
- ('finished_grading', models.BooleanField(default=False)),
- ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.subject')),
- ('tags', models.ManyToManyField(blank=True, to='core.tag')),
- ],
- options={
- 'ordering': ['due_date'],
- },
+ migrations.AddField(
+ model_name='component',
+ name='subject',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.subject'),
+ ),
+ migrations.AddField(
+ model_name='component',
+ name='tags',
+ field=models.ManyToManyField(blank=True, to='core.tag'),
),
migrations.CreateModel(
name='AttendanceEntry',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('status', models.CharField(choices=[('P', 'Present'), ('T', 'Tardy'), ('A', 'Absent')], default='P', max_length=1)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
('school_day', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.schoolday')),
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.student')),
],
@@ -107,8 +141,4 @@ class Migration(migrations.Migration):
'ordering': ['student'],
},
),
- migrations.AddIndex(
- model_name='studenttag',
- index=models.Index(fields=['content_type', 'object_id'], name='core_studen_content_a7305d_idx'),
- ),
]
diff --git a/src/core/migrations/0002_alter_schoolyear_start_date.py b/src/core/migrations/0002_alter_schoolyear_start_date.py
deleted file mode 100644
index 07bad54..0000000
--- a/src/core/migrations/0002_alter_schoolyear_start_date.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Generated by Django 4.0.5 on 2022-06-29 20:35
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('core', '0001_initial'),
- ]
-
- operations = [
- migrations.AlterField(
- model_name='schoolyear',
- name='start_date',
- field=models.DateField(unique_for_year=True),
- ),
- ]
diff --git a/src/core/migrations/0003_remove_schoolyear_end_date_and_more.py b/src/core/migrations/0003_remove_schoolyear_end_date_and_more.py
deleted file mode 100644
index d7b4c26..0000000
--- a/src/core/migrations/0003_remove_schoolyear_end_date_and_more.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Generated by Django 4.0.5 on 2022-06-29 20:47
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('core', '0002_alter_schoolyear_start_date'),
- ]
-
- operations = [
- migrations.RemoveField(
- model_name='schoolyear',
- name='end_date',
- ),
- migrations.RemoveField(
- model_name='schoolyear',
- name='start_date',
- ),
- migrations.AddField(
- model_name='schoolyear',
- name='year',
- field=models.PositiveIntegerField(default=2021),
- preserve_default=False,
- ),
- ]
diff --git a/src/core/migrations/0004_alter_schoolyear_year.py b/src/core/migrations/0004_alter_schoolyear_year.py
deleted file mode 100644
index fc6665d..0000000
--- a/src/core/migrations/0004_alter_schoolyear_year.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Generated by Django 4.0.5 on 2022-06-29 20:48
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('core', '0003_remove_schoolyear_end_date_and_more'),
- ]
-
- operations = [
- migrations.AlterField(
- model_name='schoolyear',
- name='year',
- field=models.PositiveIntegerField(unique=True),
- ),
- ]
diff --git a/src/core/migrations/0005_attendanceentry_created_at_and_more.py b/src/core/migrations/0005_attendanceentry_created_at_and_more.py
deleted file mode 100644
index 60cf571..0000000
--- a/src/core/migrations/0005_attendanceentry_created_at_and_more.py
+++ /dev/null
@@ -1,104 +0,0 @@
-# Generated by Django 4.0.5 on 2022-06-29 21:27
-
-import datetime
-from django.db import migrations, models
-from django.utils.timezone import utc
-import django.utils.timezone
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('core', '0004_alter_schoolyear_year'),
- ]
-
- operations = [
- migrations.AddField(
- model_name='attendanceentry',
- name='created_at',
- field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
- preserve_default=False,
- ),
- migrations.AddField(
- model_name='attendanceentry',
- name='updated_at',
- field=models.DateTimeField(auto_now=True),
- ),
- migrations.AddField(
- model_name='component',
- name='created_at',
- field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
- preserve_default=False,
- ),
- migrations.AddField(
- model_name='component',
- name='updated_at',
- field=models.DateTimeField(auto_now=True),
- ),
- migrations.AddField(
- model_name='schoolday',
- name='created_at',
- field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
- preserve_default=False,
- ),
- migrations.AddField(
- model_name='schoolday',
- name='updated_at',
- field=models.DateTimeField(auto_now=True),
- ),
- migrations.AddField(
- model_name='schoolyear',
- name='created_at',
- field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
- preserve_default=False,
- ),
- migrations.AddField(
- model_name='schoolyear',
- name='updated_at',
- field=models.DateTimeField(auto_now=True),
- ),
- migrations.AddField(
- model_name='student',
- name='created_at',
- field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2022, 6, 29, 21, 26, 47, 547231, tzinfo=utc)),
- preserve_default=False,
- ),
- migrations.AddField(
- model_name='student',
- name='updated_at',
- field=models.DateTimeField(auto_now=True),
- ),
- migrations.AddField(
- model_name='studenttag',
- name='created_at',
- field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
- preserve_default=False,
- ),
- migrations.AddField(
- model_name='studenttag',
- name='updated_at',
- field=models.DateTimeField(auto_now=True),
- ),
- migrations.AddField(
- model_name='subject',
- name='created_at',
- field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
- preserve_default=False,
- ),
- migrations.AddField(
- model_name='subject',
- name='updated_at',
- field=models.DateTimeField(auto_now=True),
- ),
- migrations.AddField(
- model_name='tag',
- name='created_at',
- field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
- preserve_default=False,
- ),
- migrations.AddField(
- model_name='tag',
- name='updated_at',
- field=models.DateTimeField(auto_now=True),
- ),
- ]
diff --git a/src/core/migrations/0006_score.py b/src/core/migrations/0006_score.py
deleted file mode 100644
index 35338e0..0000000
--- a/src/core/migrations/0006_score.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Generated by Django 4.0.5 on 2022-06-30 20:03
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('core', '0005_attendanceentry_created_at_and_more'),
- ]
-
- operations = [
- migrations.CreateModel(
- name='Score',
- fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('value', models.PositiveIntegerField()),
- ('component', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.component')),
- ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.student')),
- ],
- options={
- 'ordering': ['student'],
- },
- ),
- ]
diff --git a/src/core/models.py b/src/core/models.py
index 5a54a2c..365113e 100644
--- a/src/core/models.py
+++ b/src/core/models.py
@@ -5,6 +5,9 @@ from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import (
GenericForeignKey, GenericRelation
)
+from django.db.models import (
+ Exists, OuterRef, Prefetch, Subquery, Count, Sum, Avg, F, Q, Value
+)
class SchoolYear(models.Model):
@@ -27,21 +30,13 @@ class SchoolYear(models.Model):
class StudentTag(models.Model):
- tag = models.SlugField()
- content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
- object_id = models.PositiveIntegerField()
- content_object = GenericForeignKey('content_type', 'object_id')
+ name = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
- return self.tag
-
- class Meta:
- indexes = [
- models.Index(fields=['content_type', 'object_id']),
- ]
+ return self.name
# class StudentManager(models.Manager):
@@ -66,8 +61,9 @@ class Student(models.Model):
last_name = models.CharField(max_length=50)
address = models.TextField(blank=True)
dob = models.DateField()
+ allergies = models.CharField(max_length=255, blank=True)
- tags = GenericRelation(StudentTag)
+ tags = models.ManyToManyField(StudentTag, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
@@ -89,7 +85,7 @@ class Student(models.Model):
def get_absolute_url(self):
return reverse('core:student-detail', kwargs={
'year': self.school_year.year,
- 'student_pk': self.pk
+ 'pk': self.pk
})
class Meta:
@@ -114,7 +110,10 @@ class Subject(models.Model):
return self.name
def get_absolute_url(self):
- return reverse('subject-detail', kwargs={'pk': self.pk})
+ return reverse('core:subject-detail', kwargs={
+ 'year': self.school_year.year,
+ 'pk': self.pk
+ })
class Meta:
ordering = ['name']
@@ -180,7 +179,11 @@ class Component(models.Model):
return self.name
def get_absolute_url(self):
- return reverse('component-detail', kwargs={'pk': self.pk})
+ return reverse('core:component-detail', kwargs={
+ 'year': self.school_year.year,
+ 'pk': self.subject.pk,
+ 'component_pk': self.pk
+ })
class Meta:
ordering = ['due_date']
@@ -203,7 +206,11 @@ class Score(models.Model):
return f'{self.student} scored: {self.value} / {self.component.grade_total}'
def get_absolute_url(self):
- return reverse('score-detail', kwargs={'pk': self.pk})
+ return reverse('core:component-detail', kwargs={
+ 'year': self.component.subject.school_year.year,
+ 'pk': self.component.subject.pk,
+ 'component_pk': self.component.pk
+ })
class Meta:
ordering = ['student']
@@ -222,6 +229,12 @@ class SchoolDay(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
+ def get_absolute_url(self):
+ return reverse('core:schoolday-detail', kwargs={
+ 'year': self.school_year.year,
+ 'pk': self.pk
+ })
+
def __str__(self):
return f'{self.date}'
@@ -251,8 +264,15 @@ class AttendanceEntry(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
+ def get_absolute_url(self):
+ return reverse('core:schoolday-detail', kwargs={
+ 'year': self.school_day.school_year.year,
+ 'pk': self.school_day.pk,
+ 'entry_pk': self.pk
+ })
+
def __str__(self):
- return f"{self.day} | {self.student} | {self.status}"
+ return f"{self.school_day} | {self.student} | {self.status}"
class Meta:
verbose_name_plural = 'entries'
diff --git a/src/core/templates/core/attendanceentry_confirm_delete.html b/src/core/templates/core/attendanceentry_confirm_delete.html
new file mode 100644
index 0000000..18ce92a
--- /dev/null
+++ b/src/core/templates/core/attendanceentry_confirm_delete.html
@@ -0,0 +1,31 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Edit Attendance | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/attendanceentry_create_form.html b/src/core/templates/core/attendanceentry_create_form.html
new file mode 100644
index 0000000..d4a2762
--- /dev/null
+++ b/src/core/templates/core/attendanceentry_create_form.html
@@ -0,0 +1,12 @@
+{% extends 'base.html' %}
+
+{% block content %}
++ New Attendanceentry
+
+{% endblock %}
diff --git a/src/core/templates/core/attendanceentry_detail.html b/src/core/templates/core/attendanceentry_detail.html
new file mode 100644
index 0000000..0ae4565
--- /dev/null
+++ b/src/core/templates/core/attendanceentry_detail.html
@@ -0,0 +1,33 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Attendance | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/attendanceentry_form.html b/src/core/templates/core/attendanceentry_form.html
new file mode 100644
index 0000000..3693718
--- /dev/null
+++ b/src/core/templates/core/attendanceentry_form.html
@@ -0,0 +1,33 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Edit Attendance | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/attendanceentry_list.html b/src/core/templates/core/attendanceentry_list.html
new file mode 100644
index 0000000..bd7d376
--- /dev/null
+++ b/src/core/templates/core/attendanceentry_list.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+
+{% block content %}
+Attendanceentrys
+
+
+ {% for attendanceentry in attendanceentry_list %}
+
+ {{ attendanceentry }}
+
+ {% empty %}
+ No attendanceentrys yet.
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/src/core/templates/core/component_confirm_delete.html b/src/core/templates/core/component_confirm_delete.html
new file mode 100644
index 0000000..5c9bf61
--- /dev/null
+++ b/src/core/templates/core/component_confirm_delete.html
@@ -0,0 +1,36 @@
+{% extends "base.html" %}
+{% load helpers %}
+
+{% block head_title %}{{ component.name }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/component_create_form.html b/src/core/templates/core/component_create_form.html
new file mode 100644
index 0000000..2d64eef
--- /dev/null
+++ b/src/core/templates/core/component_create_form.html
@@ -0,0 +1,28 @@
+{% extends 'base.html' %}
+
+{% block head_title %}New component | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+ + New Component
+
+
+{% endblock %}
diff --git a/src/core/templates/core/component_detail.html b/src/core/templates/core/component_detail.html
new file mode 100644
index 0000000..6b0cf06
--- /dev/null
+++ b/src/core/templates/core/component_detail.html
@@ -0,0 +1,88 @@
+{% extends "base.html" %}
+{% load helpers %}
+
+{% block head_title %}{{ component.name }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+ {% if component.tags.count > 0 %}
+
+
+ {% for tag in component.tags.all %}
+ {{tag.name}}
+ {% endfor %}
+
+
+ {% endif %}
+
+
+ - Due Date
+ - {{component.due_date}}
+ - Category
+ - {{component.get_category_display}}
+ - Grade Total
+ - {{component.grade_total}}
+
+
+
+
+
+
+
+ | Student |
+ Score |
+
+
+
+ {% for score in component.score_set.all %}
+
+ | {{score.student.student_id}} — {{score.student}} |
+ {{score.value}} / {{component.grade_total}} |
+ Edit |
+
+ {% endfor %}
+
+ | Avg. Score |
+ {{component.grade_avg_pre|floatformat:2}} / {{component.grade_total}} |
+
+
+
+
+ {% if scoreless %}
+
+
+ Scoreless
+
+ {% for student in scoreless %}
+ - {{student}}
+ {% endfor %}
+
+
+ {% endif %}
+
+{% endblock %}
diff --git a/src/core/templates/core/component_form.html b/src/core/templates/core/component_form.html
new file mode 100644
index 0000000..ac07002
--- /dev/null
+++ b/src/core/templates/core/component_form.html
@@ -0,0 +1,36 @@
+{% extends "base.html" %}
+{% load helpers %}
+
+{% block head_title %}{{ component.name }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/component_list.html b/src/core/templates/core/component_list.html
new file mode 100644
index 0000000..003f836
--- /dev/null
+++ b/src/core/templates/core/component_list.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+
+{% block content %}
+Components
+
+
+ {% for component in component_list %}
+
+ {{ component }}
+
+ {% empty %}
+ No components yet.
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/src/core/templates/core/component_manager.html b/src/core/templates/core/component_manager.html
new file mode 100644
index 0000000..c950284
--- /dev/null
+++ b/src/core/templates/core/component_manager.html
@@ -0,0 +1,56 @@
+{% extends "base.html" %}
+{% load helpers %}
+
+{% block head_title %}Enter Scores {{ component.name }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+ {{component}}
+
+
+{% endblock %}
diff --git a/src/core/templates/core/home.html b/src/core/templates/core/home.html
new file mode 100644
index 0000000..b3b7a9c
--- /dev/null
+++ b/src/core/templates/core/home.html
@@ -0,0 +1,9 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Grades & Attendance Management Software |{% endblock %}
+
+{% block content %}
+
+ Grades and Attendance Management Software
+
+{% endblock %}
diff --git a/src/core/templates/core/schoolday_confirm_delete.html b/src/core/templates/core/schoolday_confirm_delete.html
new file mode 100644
index 0000000..d825f8c
--- /dev/null
+++ b/src/core/templates/core/schoolday_confirm_delete.html
@@ -0,0 +1,29 @@
+{% extends "base.html" %}
+
+{% block head_title %}Delete Attendance | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+ Delete Attendance
+
+
+{% endblock %}
diff --git a/src/core/templates/core/schoolday_create_form.html b/src/core/templates/core/schoolday_create_form.html
new file mode 100644
index 0000000..12716b7
--- /dev/null
+++ b/src/core/templates/core/schoolday_create_form.html
@@ -0,0 +1,46 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Attendance | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+ Take Attendance
+
+
+{% endblock %}
diff --git a/src/core/templates/core/schoolday_detail.html b/src/core/templates/core/schoolday_detail.html
new file mode 100644
index 0000000..3a14b66
--- /dev/null
+++ b/src/core/templates/core/schoolday_detail.html
@@ -0,0 +1,46 @@
+{% extends 'base.html' %}
+{% load helpers %}
+
+{% block head_title %}Attendance {{ schoolday.date }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+
+
+ | Student |
+ Status |
+
+
+
+ {% for entry in schoolday.attendanceentry_set.all %}
+
+ | {{entry.student}} |
+ {{entry.get_status_display}} |
+ Edit |
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/schoolday_form.html b/src/core/templates/core/schoolday_form.html
new file mode 100644
index 0000000..3d19e6b
--- /dev/null
+++ b/src/core/templates/core/schoolday_form.html
@@ -0,0 +1,53 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Edit Attendance | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/schoolday_list.html b/src/core/templates/core/schoolday_list.html
new file mode 100644
index 0000000..36606cc
--- /dev/null
+++ b/src/core/templates/core/schoolday_list.html
@@ -0,0 +1,54 @@
+{% extends 'base.html' %}
+{% load static %}
+
+{% block head_title %}Attendance | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+ {% for schoolday in schoolday_list %}
+
+
+
+
+
+ | Student |
+ Status |
+
+
+
+ {% for entry in schoolday.attendanceentry_set.all %}
+
+ | {{entry.student}} |
+ {{entry.get_status_display}} |
+ Edit |
+
+ {% empty %}
+
+ | No attendance yet. |
+
+ {% endfor %}
+
+
+
+ {% empty %}
+
+ {% endfor %}
+ {% include 'core/partials/pagination.html' %}
+
+{% endblock %}
diff --git a/src/core/templates/core/schoolyear_create_form.html b/src/core/templates/core/schoolyear_create_form.html
index 49f457f..8af9b10 100644
--- a/src/core/templates/core/schoolyear_create_form.html
+++ b/src/core/templates/core/schoolyear_create_form.html
@@ -1,12 +1,14 @@
{% extends 'base.html' %}
{% block content %}
-+ New Schoolyear
-
+
+ + New School year
+
+
{% endblock %}
diff --git a/src/core/templates/core/schoolyear_detail.html b/src/core/templates/core/schoolyear_detail.html
index 0a02ad2..10b912e 100644
--- a/src/core/templates/core/schoolyear_detail.html
+++ b/src/core/templates/core/schoolyear_detail.html
@@ -1,34 +1,31 @@
{% extends 'base.html' %}
-{% block head_title %}Project {{ schoolyear.name }} | {% endblock head_title %}
+{% block head_title %}Year {{ schoolyear.year }} | {% endblock head_title %}
{% block content %}
-
+
{% endblock %}
diff --git a/src/core/templates/core/schoolyear_form.html b/src/core/templates/core/schoolyear_form.html
index 2b3238c..de7da06 100644
--- a/src/core/templates/core/schoolyear_form.html
+++ b/src/core/templates/core/schoolyear_form.html
@@ -1,12 +1,18 @@
{% extends 'base.html' %}
+{% block head_title %}Edit Year {{ schoolyear.year }} | {% endblock head_title %}
+
{% block content %}
-Update Schoolyear
-
+
+
+
+
{% endblock %}
diff --git a/src/core/templates/core/schoolyear_list.html b/src/core/templates/core/schoolyear_list.html
index ca8583c..84deacc 100644
--- a/src/core/templates/core/schoolyear_list.html
+++ b/src/core/templates/core/schoolyear_list.html
@@ -8,38 +8,21 @@
-
-
-
- | Created |
- Year |
- Students |
- Components |
- Last Updated |
-
-
-
- {% for schoolyear in schoolyear_list %}
-
- | {{ schoolyear.created_at|date:'m/d/Y' }} |
- {{ schoolyear.year }} |
- |
- |
- |
-
- {% empty %}
-
- | No schoolyears yet. |
-
- {% endfor %}
-
-
+
{% include 'core/partials/pagination.html' %}
diff --git a/src/core/templates/core/score_confirm_delete.html b/src/core/templates/core/score_confirm_delete.html
new file mode 100644
index 0000000..9fa1792
--- /dev/null
+++ b/src/core/templates/core/score_confirm_delete.html
@@ -0,0 +1,31 @@
+{% extends "base.html" %}
+
+{% block head_title %}Delete Score {{ score.pk }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+ Delete Score
+
+
+{% endblock %}
diff --git a/src/core/templates/core/score_create_form.html b/src/core/templates/core/score_create_form.html
new file mode 100644
index 0000000..1366c99
--- /dev/null
+++ b/src/core/templates/core/score_create_form.html
@@ -0,0 +1,12 @@
+{% extends 'base.html' %}
+
+{% block content %}
++ New Score
+
+{% endblock %}
diff --git a/src/core/templates/core/score_detail.html b/src/core/templates/core/score_detail.html
new file mode 100644
index 0000000..7dcadeb
--- /dev/null
+++ b/src/core/templates/core/score_detail.html
@@ -0,0 +1,10 @@
+{% extends 'base.html' %}
+
+{% block content %}
+Score
+
+ Edit
+ Delete
+
+{{ score }}
+{% endblock %}
diff --git a/src/core/templates/core/score_form.html b/src/core/templates/core/score_form.html
new file mode 100644
index 0000000..d1039a8
--- /dev/null
+++ b/src/core/templates/core/score_form.html
@@ -0,0 +1,39 @@
+{% extends "base.html" %}
+
+{% block head_title %}Edit score {{ score.pk }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/score_list.html b/src/core/templates/core/score_list.html
new file mode 100644
index 0000000..f9a81d5
--- /dev/null
+++ b/src/core/templates/core/score_list.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+
+{% block content %}
+Scores
+
+
+ {% for score in score_list %}
+
+ {{ score }}
+
+ {% empty %}
+ No scores yet.
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/src/core/templates/core/student_detail.html b/src/core/templates/core/student_detail.html
index 906a91f..52d59e7 100644
--- a/src/core/templates/core/student_detail.html
+++ b/src/core/templates/core/student_detail.html
@@ -1,7 +1,7 @@
{% extends 'base.html' %}
{% load helpers %}
-{% block head_title %}Student {{ student.student_id }} | {% endblock head_title %}
+{% block head_title %}{{ student.student_id }} / {{ student.full_name }} | {% endblock head_title %}
{% block breadcrumbs %}
@@ -23,77 +23,87 @@
Edit
-
-
- {% if student.allergies %}
- - Allergies
- - {{ student.allergies }}
- {% endif %}
+
+
- Birthday
- {{ student.dob }}
- Age
- {{ student.age }}
+ - Allergies
+ - {% if student.allergies %}{{ student.allergies }}{% endif %}
{% if student.address %}
- Address
-
{{ student.address|linebreaksbr }}
{% endif %}
+ {% if student.tags.count > 0 %}
+ - Tags
+
+ {% for tag in student.tags.all %}
+
- {{ tag }}
{% if not forloop.last %}
{% endif %}
+ {% endfor %}
+
+ {% endif %}
Grades
- | Subject |
- Grade |
+
+ | Subject |
+ Grade |
+
{% for subject in subject_list %}
- | {{subject}} |
- {{subject.grade|grade_as_percentage:subject.grade_total}}% |
+ {{ subject }} {{ subject.description }} |
+ {{ subject.grade|grade_as_percentage:subject.grade_total }}% |
{% empty %}
- | No grades yet. To add a grade you will need to enter a score for this student on a component. |
+ No grades yet. You will need to enter a score for this student on a component. |
{% endfor %}
- Components
+ Scores
-
+
{% regroup score_list by component.subject as score_list %}
{% for subject in score_list %}
-
{{subject.grouper}}
-
-
-
- | Due Date |
- Component |
- Category |
- Score |
- Total |
- Percentage |
-
-
-
- {% for score in subject.list %}
-
- | {{score.component.due_date}} |
- {{score.component}} |
- {{score.component.get_category_display}} |
- {{score.value}} |
- {{score.component.grade_total}} |
- {{score.grade_as_percentage}}% |
- Change score |
-
- {% endfor %}
-
-
+
+
{{ subject.grouper }}
+
+
+
+ | Due Date |
+ Component |
+ Category |
+ Score |
+ Total |
+ Percentage |
+
+
+
+ {% for score in subject.list %}
+
+ | {{ score.component.due_date }} |
+ {{ score.component }} |
+ {{ score.component.get_category_display }} |
+ {{ score.value }} |
+ {{ score.component.grade_total }} |
+ {{ score.grade_as_percentage }}% |
+ Edit |
+
+ {% endfor %}
+
+
+
{% empty %}
No components graded yet.
{% endfor %}
@@ -109,15 +119,14 @@
- | Date |
- Status |
+ Date |
{% for entry in status.list %}
- | {{entry.day.date}} |
- Update |
+ {{ entry.school_day.date }} |
+ Edit |
{% endfor %}
diff --git a/src/core/templates/core/student_form.html b/src/core/templates/core/student_form.html
index 534a797..cdcbfdb 100644
--- a/src/core/templates/core/student_form.html
+++ b/src/core/templates/core/student_form.html
@@ -1,12 +1,29 @@
{% extends 'base.html' %}
+{% load helpers %}
+
+{% block head_title %}Edit Student {{ student.student_id }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
{% block content %}
-Update Student
-
+
+ Edit Student
+
+
{% endblock %}
diff --git a/src/core/templates/core/student_list.html b/src/core/templates/core/student_list.html
index d5e82d2..17e0d3c 100644
--- a/src/core/templates/core/student_list.html
+++ b/src/core/templates/core/student_list.html
@@ -18,13 +18,16 @@
Students
+ New Student
- Student Tags →
+ Student Tags →
- | Student No. ↕ |
+ Student No. ↕ |
Name |
+ Age |
+ Birthday |
+ Allergies |
Tags |
@@ -32,12 +35,19 @@
{% for student in student_list %}
| {{ student.student_id }} |
- {{ student }} |
- (tags) |
+ {{ student }} |
+ {{ student.age }} |
+ {{ student.dob }} |
+ {% if student.allergies %}{{ student.allergies }}{% endif %} |
+
+ {% for tag in student.tags.all %}
+ {{ tag }}
+ {% endfor %}
+ |
{% empty %}
- | No students yet. |
+ No students yet. |
{% endfor %}
diff --git a/src/core/templates/core/studenttag_confirm_delete.html b/src/core/templates/core/studenttag_confirm_delete.html
new file mode 100644
index 0000000..ab2ae03
--- /dev/null
+++ b/src/core/templates/core/studenttag_confirm_delete.html
@@ -0,0 +1,33 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Delete Tag | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/studenttag_create_form.html b/src/core/templates/core/studenttag_create_form.html
new file mode 100644
index 0000000..2d58cec
--- /dev/null
+++ b/src/core/templates/core/studenttag_create_form.html
@@ -0,0 +1,28 @@
+{% extends 'base.html' %}
+
+{% block head_title %}New Tag | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+ + New Tag
+
+
+{% endblock %}
diff --git a/src/core/templates/core/studenttag_detail.html b/src/core/templates/core/studenttag_detail.html
new file mode 100644
index 0000000..1dc3826
--- /dev/null
+++ b/src/core/templates/core/studenttag_detail.html
@@ -0,0 +1,50 @@
+{% extends 'base.html' %}
+{% load helpers %}
+
+{% block head_title %}Tag {{ tag }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+ Students with this tag
+
+
+
+ | Student No. ↕ |
+ Name |
+
+
+
+ {% for student in tag.student_set.all %}
+
+ | {{ student.student_id }} |
+ {{ student }} |
+
+ {% empty %}
+
+ | No students tagged yet. |
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/studenttag_form.html b/src/core/templates/core/studenttag_form.html
new file mode 100644
index 0000000..c273ace
--- /dev/null
+++ b/src/core/templates/core/studenttag_form.html
@@ -0,0 +1,33 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Edit Tag | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/studenttag_list.html b/src/core/templates/core/studenttag_list.html
new file mode 100644
index 0000000..da163a3
--- /dev/null
+++ b/src/core/templates/core/studenttag_list.html
@@ -0,0 +1,32 @@
+{% extends 'base.html' %}
+{% load helpers %}
+
+{% block head_title %}Student Tags | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+ {% for tag in studenttag_list %}
+ {{ tag }}
+ {% empty %}
+ No tags yet.
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/src/core/templates/core/subject_confirm_delete.html b/src/core/templates/core/subject_confirm_delete.html
new file mode 100644
index 0000000..490ee4b
--- /dev/null
+++ b/src/core/templates/core/subject_confirm_delete.html
@@ -0,0 +1,13 @@
+{% extends 'base.html' %}
+
+{% block content %}
+Delete Subject
+
+{% endblock %}
diff --git a/src/core/templates/core/subject_create_form.html b/src/core/templates/core/subject_create_form.html
new file mode 100644
index 0000000..d127d6c
--- /dev/null
+++ b/src/core/templates/core/subject_create_form.html
@@ -0,0 +1,28 @@
+{% extends 'base.html' %}
+
+{% block head_title %}New Subject | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/subject_detail.html b/src/core/templates/core/subject_detail.html
new file mode 100644
index 0000000..d28f946
--- /dev/null
+++ b/src/core/templates/core/subject_detail.html
@@ -0,0 +1,62 @@
+{% extends 'base.html' %}
+{% load helpers %}
+
+{% block head_title %}{{ subject }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+
+
+
+ | Due Date |
+ Description |
+ Category |
+ Grade Total |
+ Avg Score |
+
+
+
+ {% for component in subject.component_set.all %}
+
+ | {{component.due_date}} |
+ {{component.name}} |
+ {{component.get_category_display}} |
+ {{component.grade_total}} |
+ {{component.grade_avg_pre|floatformat:2}} |
+
+ {% empty %}
+
+ | No components yet. |
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/subject_form.html b/src/core/templates/core/subject_form.html
new file mode 100644
index 0000000..9cd3855
--- /dev/null
+++ b/src/core/templates/core/subject_form.html
@@ -0,0 +1,30 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Edit Subject | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/subject_list.html b/src/core/templates/core/subject_list.html
new file mode 100644
index 0000000..90089e5
--- /dev/null
+++ b/src/core/templates/core/subject_list.html
@@ -0,0 +1,48 @@
+{% extends 'base.html' %}
+{% load static %}
+
+{% block head_title %}Subjects | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+
+ | Name |
+ Components |
+
+
+
+ {% for subject in subject_list %}
+
+
+ {{ subject.name }}
+ {{ subject.description }}
+ |
+ {{ subject.component__count }} |
+
+ {% empty %}
+
+ | No subjects yet. |
+
+ {% endfor %}
+
+
+ {% include 'core/partials/pagination.html' %}
+
+{% endblock %}
diff --git a/src/core/templates/core/tag_confirm_delete.html b/src/core/templates/core/tag_confirm_delete.html
new file mode 100644
index 0000000..179de31
--- /dev/null
+++ b/src/core/templates/core/tag_confirm_delete.html
@@ -0,0 +1,33 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Delete Tag | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/tag_create_form.html b/src/core/templates/core/tag_create_form.html
new file mode 100644
index 0000000..7a1eee8
--- /dev/null
+++ b/src/core/templates/core/tag_create_form.html
@@ -0,0 +1,28 @@
+{% extends 'base.html' %}
+
+{% block head_title %}New Tag | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+ + New Tag
+
+
+{% endblock %}
diff --git a/src/core/templates/core/tag_detail.html b/src/core/templates/core/tag_detail.html
new file mode 100644
index 0000000..a91e3ee
--- /dev/null
+++ b/src/core/templates/core/tag_detail.html
@@ -0,0 +1,50 @@
+{% extends 'base.html' %}
+{% load helpers %}
+
+{% block head_title %}Tag {{ tag }} | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+ Subjects with this tag
+
+
+
+ | Subject |
+ Name |
+
+
+
+ {% for component in tag.component_set.all %}
+
+ | {{ component.subject.name }} |
+ {{ component }} |
+
+ {% empty %}
+
+ | No components tagged yet. |
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/tag_form.html b/src/core/templates/core/tag_form.html
new file mode 100644
index 0000000..3d0de72
--- /dev/null
+++ b/src/core/templates/core/tag_form.html
@@ -0,0 +1,35 @@
+{% extends 'base.html' %}
+
+{% block head_title %}Edit Tag | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+
+{% endblock %}
diff --git a/src/core/templates/core/tag_list.html b/src/core/templates/core/tag_list.html
new file mode 100644
index 0000000..86f1308
--- /dev/null
+++ b/src/core/templates/core/tag_list.html
@@ -0,0 +1,32 @@
+{% extends 'base.html' %}
+{% load helpers %}
+
+{% block head_title %}Tags | {% endblock head_title %}
+
+{% block breadcrumbs %}
+
+{% endblock breadcrumbs %}
+
+{% block content %}
+
+
+
+ {% for tag in tag_list %}
+ {{ tag }}
+ {% empty %}
+ No tags yet.
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/src/accounts/templates/accounts/profile.html b/src/core/templates/core/today.html
similarity index 60%
rename from src/accounts/templates/accounts/profile.html
rename to src/core/templates/core/today.html
index 6a4349d..691b4bb 100644
--- a/src/accounts/templates/accounts/profile.html
+++ b/src/core/templates/core/today.html
@@ -1,19 +1,18 @@
{% extends 'base.html' %}
{% load static %}
+{% block head_title %}Today |{% endblock %}
+
{% block content %}
- Welcome {{profile.user.first_name}} {{profile.user.last_name }}
-
- Here's what's going on today
-
+ Here's what's going on today
- Birthdays
+ Birthdays this week