init
This commit is contained in:
BIN
student/__pycache__/admin.cpython-313.pyc
Normal file
BIN
student/__pycache__/admin.cpython-313.pyc
Normal file
Binary file not shown.
BIN
student/__pycache__/forms.cpython-313.pyc
Normal file
BIN
student/__pycache__/forms.cpython-313.pyc
Normal file
Binary file not shown.
BIN
student/__pycache__/models.cpython-313.pyc
Normal file
BIN
student/__pycache__/models.cpython-313.pyc
Normal file
Binary file not shown.
BIN
student/__pycache__/urls.cpython-313.pyc
Normal file
BIN
student/__pycache__/urls.cpython-313.pyc
Normal file
Binary file not shown.
BIN
student/__pycache__/views.cpython-313.pyc
Normal file
BIN
student/__pycache__/views.cpython-313.pyc
Normal file
Binary file not shown.
8
student/admin.py
Normal file
8
student/admin.py
Normal 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
7
student/forms.py
Normal 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']
|
41
student/migrations/0001_initial.py
Normal file
41
student/migrations/0001_initial.py
Normal 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')),
|
||||
],
|
||||
),
|
||||
]
|
0
student/migrations/__init__.py
Normal file
0
student/migrations/__init__.py
Normal file
BIN
student/migrations/__pycache__/0001_initial.cpython-313.pyc
Normal file
BIN
student/migrations/__pycache__/0001_initial.cpython-313.pyc
Normal file
Binary file not shown.
BIN
student/migrations/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
student/migrations/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
28
student/models.py
Normal file
28
student/models.py
Normal 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
15
student/urls.py
Normal 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
93
student/views.py
Normal 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
|
||||
})
|
Reference in New Issue
Block a user