This commit is contained in:
Dmitriy
2025-06-23 01:24:34 +03:00
commit 60b4e0e839
303 changed files with 35737 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

8
student/admin.py Normal file
View File

@ -0,0 +1,8 @@
from django.contrib import admin
from .models import Student
@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
list_display = ('profile', 'progress', 'created_at', 'updated_at')
list_filter = ('created_at', 'updated_at')
search_fields = ('profile__user__username', 'profile__user__email')

7
student/forms.py Normal file
View File

@ -0,0 +1,7 @@
from django import forms
from .models import Student
class StudentProfileForm(forms.ModelForm):
class Meta:
model = Student
fields = ['medical_certificate', 'driving_license_number']

View File

@ -0,0 +1,41 @@
# Generated by Django 5.0.2 on 2025-06-10 19:27
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('accounts', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Student',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('medical_certificate', models.FileField(blank=True, null=True, upload_to='medical_certificates/')),
('driving_license_number', models.CharField(blank=True, max_length=20)),
('progress', models.IntegerField(default=0, help_text='Прогресс обучения в процентах')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('profile', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='accounts.profile')),
],
),
migrations.CreateModel(
name='StudentProgress',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('theory_progress', models.IntegerField(default=0)),
('practice_progress', models.IntegerField(default=0)),
('last_lesson_date', models.DateTimeField(blank=True, null=True)),
('notes', models.TextField(blank=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='student.student')),
],
),
]

View File

28
student/models.py Normal file
View File

@ -0,0 +1,28 @@
from django.db import models
from django.contrib.auth.models import User
from accounts.models import Profile
#from schedule.models import Course
class Student(models.Model):
profile = models.OneToOneField(Profile, on_delete=models.CASCADE)
#course = models.ForeignKey(Course, on_delete=models.SET_NULL, null=True)
medical_certificate = models.FileField(upload_to='medical_certificates/', null=True, blank=True)
driving_license_number = models.CharField(max_length=20, blank=True)
progress = models.IntegerField(default=0, help_text="Прогресс обучения в процентах")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.profile.user.get_full_name()}"
class StudentProgress(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
theory_progress = models.IntegerField(default=0)
practice_progress = models.IntegerField(default=0)
last_lesson_date = models.DateTimeField(null=True, blank=True)
notes = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"Прогресс {self.student} - Теория: {self.theory_progress}%, Практика: {self.practice_progress}%"

15
student/urls.py Normal file
View File

@ -0,0 +1,15 @@
from django.urls import path
from . import views
app_name = 'student'
urlpatterns = [
path('', views.student_list, name='list'),
path('<int:pk>/', views.student_detail, name='detail'),
path('<int:pk>/schedule/', views.student_schedule, name='schedule'),
path('progress/', views.student_progress, name='student_progress'),
path('profile/', views.student_profile, name='student_profile'),
path('profile/edit/', views.edit_student_profile, name='edit_student_profile'),
path('lessons/', views.lesson_list, name='student_lesson_list'),
path('lesson/<int:pk>/', views.lesson_detail, name='student_lesson_detail'),
]

93
student/views.py Normal file
View File

@ -0,0 +1,93 @@
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .models import Student, StudentProgress
from schedule.models import Lesson, LessonEnrollment
from .forms import StudentProfileForm
@login_required
def student_dashboard(request):
student = get_object_or_404(Student, profile__user=request.user)
enrollments = LessonEnrollment.objects.filter(student=student).select_related('lesson')
return render(request, 'student/dashboard.html', {
'student': student,
'enrollments': enrollments
})
@login_required
def student_schedule(request):
student = get_object_or_404(Student, profile__user=request.user)
enrollments = LessonEnrollment.objects.filter(student=student).select_related('lesson')
return render(request, 'student/schedule.html', {
'student': student,
'enrollments': enrollments
})
@login_required
def student_progress(request):
student = get_object_or_404(Student, profile__user=request.user)
progress = StudentProgress.objects.get_or_create(student=student)[0]
return render(request, 'student/progress.html', {
'student': student,
'progress': progress
})
@login_required
def student_profile(request):
student = get_object_or_404(Student, profile__user=request.user)
return render(request, 'student/profile.html', {'student': student})
@login_required
def edit_student_profile(request):
student = get_object_or_404(Student, profile__user=request.user)
if request.method == 'POST':
form = StudentProfileForm(request.POST, request.FILES, instance=student)
if form.is_valid():
form.save()
messages.success(request, 'Профиль успешно обновлен!')
return redirect('student_profile')
else:
form = StudentProfileForm(instance=student)
return render(request, 'student/edit_profile.html', {'form': form})
@login_required
def lesson_list(request):
student = get_object_or_404(Student, profile__user=request.user)
enrollments = LessonEnrollment.objects.filter(student=student).select_related('lesson')
return render(request, 'student/lesson_list.html', {
'student': student,
'enrollments': enrollments
})
@login_required
def lesson_detail(request, pk):
student = get_object_or_404(Student, profile__user=request.user)
lesson = get_object_or_404(Lesson, pk=pk)
enrollment = get_object_or_404(LessonEnrollment, student=student, lesson=lesson)
return render(request, 'student/lesson_detail.html', {
'student': student,
'lesson': lesson,
'enrollment': enrollment
})
def student_list(request):
students = Student.objects.all().order_by('user__last_name', 'user__first_name')
return render(request, 'student/student_list.html', {'students': students})
@login_required
def student_detail(request, pk):
student = get_object_or_404(Student, pk=pk)
enrolled_lessons = Lesson.objects.filter(enrolled_students=student)
return render(request, 'student/student_detail.html', {
'student': student,
'enrolled_lessons': enrolled_lessons
})
@login_required
def student_schedule(request, pk):
student = get_object_or_404(Student, pk=pk)
enrolled_lessons = Lesson.objects.filter(enrolled_students=student).order_by('date', 'start_time')
return render(request, 'student/student_schedule.html', {
'student': student,
'enrolled_lessons': enrolled_lessons
})