-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
MIL-107 m2m связь пользователей, направлений и уровней #403
base: dev
Are you sure you want to change the base?
Changes from 7 commits
77254aa
8c4f7f5
6e62b45
0cea7ab
f89d2ae
e8e2829
1986fee
30671b6
a9d4a45
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,6 +11,7 @@ | |
CourseFaq, | ||
CourseKnowledge, | ||
CourseProgressStatus, | ||
Division, | ||
Knowledge, | ||
Lesson, | ||
LessonProgressStatus, | ||
|
@@ -97,6 +98,9 @@ class CourseAdmin(admin.ModelAdmin): | |
"""Админка курса.""" | ||
|
||
inlines = (CourseFaqInline, CourseKnowledgeInline, ChapterInline) | ||
list_filter = [ | ||
"division", | ||
] | ||
model = Course | ||
list_display = ( | ||
"title", | ||
|
@@ -105,6 +109,7 @@ class CourseAdmin(admin.ModelAdmin): | |
"user_created", | ||
"created_at", | ||
"updated_at", | ||
"division", | ||
) | ||
ordering = ("-updated_at",) | ||
empty_value_display = "-пусто-" | ||
|
@@ -228,12 +233,7 @@ class KnowledgeAdmin(admin.ModelAdmin): | |
|
||
inlines = (CourseKnowledgeInline,) | ||
ordering = ("-updated_at",) | ||
list_display = ( | ||
"title", | ||
"author", | ||
"created_at", | ||
"updated_at", | ||
) | ||
list_display = ("title", "author", "created_at", "updated_at") | ||
|
||
|
||
@admin.register(Lesson) | ||
|
@@ -278,3 +278,29 @@ class SubscriptionAdmin(admin.ModelAdmin): | |
] | ||
|
||
ordering = ("-updated_at",) | ||
|
||
|
||
@admin.register(Division) | ||
class DivisionAdmin(admin.ModelAdmin): | ||
"""Aдминка для Division.""" | ||
|
||
ordering = ("-updated_at",) | ||
list_display = ("title", "author", "updated_at", "courses") | ||
exclude = ("author",) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. автора нужно добавить в raw_field (посмотри по проект по "row") |
||
list_select_related = ("author",) | ||
Leontiev93 marked this conversation as resolved.
Show resolved
Hide resolved
Leontiev93 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
@admin.display(description="Курсы") | ||
def courses(self, obj): | ||
Leontiev93 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
"""Показывает курсы по этим направлениям.""" | ||
return [[course.title] for course in obj.course_set.all()] | ||
|
||
def get_queryset(self, request): | ||
qs = self.model._default_manager.get_queryset().prefetch_related("course_set") | ||
ordering = self.get_ordering(request) | ||
if ordering: | ||
qs = qs.order_by(*ordering) | ||
return qs | ||
Leontiev93 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
def save_model(self, request, obj, form, change): | ||
obj.author = request.user | ||
obj.save() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
# Generated by Django 3.2.20 on 2024-02-29 18:49 | ||
|
||
from django.conf import settings | ||
from django.db import migrations, models | ||
import django.db.models.deletion | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
('courses', '0026_alter_lesson_lesson_type'), | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name='Division', | ||
fields=[ | ||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('created_at', models.DateTimeField(auto_now_add=True)), | ||
('updated_at', models.DateTimeField(auto_now=True, db_index=True)), | ||
('deleted_at', models.DateTimeField(blank=True, null=True)), | ||
('title', models.CharField(max_length=250, verbose_name='Название направления')), | ||
('description', models.CharField(max_length=1000, verbose_name='Описание направления')), | ||
('author', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Создатель направления')), | ||
], | ||
options={ | ||
'verbose_name': 'Направление', | ||
'verbose_name_plural': 'Направления', | ||
}, | ||
), | ||
migrations.AddField( | ||
model_name='course', | ||
name='division', | ||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='courses.division', verbose_name='Направление курса'), | ||
), | ||
migrations.AddConstraint( | ||
model_name='division', | ||
constraint=models.UniqueConstraint(fields=('title',), name='unique_division'), | ||
), | ||
] |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,6 +9,7 @@ | |
Level, | ||
Location, | ||
User, | ||
UserDivisionLevel, | ||
UserRole, | ||
Volunteer, | ||
VolunteerBadge, | ||
|
@@ -36,6 +37,11 @@ class LevelAdmin(admin.ModelAdmin): | |
inlines = [VolunteerLevelInline] | ||
|
||
|
||
class UserDivisionLevelInline(admin.TabularInline): | ||
model = UserDivisionLevel | ||
extra = 1 | ||
|
||
|
||
class BadgeAdminForm(forms.ModelForm): | ||
class Meta: | ||
model = Badge | ||
|
@@ -102,7 +108,17 @@ def clean(self): | |
|
||
|
||
class VolunteerAdmin(admin.ModelAdmin): | ||
inlines = [VolunteerLevelInline, VolunteerBadgeInline] | ||
inlines = [VolunteerLevelInline, VolunteerBadgeInline, UserDivisionLevelInline] | ||
|
||
|
||
class UserDivisionLevelAdmin(admin.ModelAdmin): | ||
list_display = ("id", "volunteer", "division", "level") | ||
list_display_links = ("volunteer",) | ||
list_filter = ( | ||
"volunteer", | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. волонтера добавь в raw_field |
||
"division", | ||
"level", | ||
) | ||
|
||
|
||
admin.site.register(User, CustomUserAdmin) | ||
|
@@ -113,3 +129,4 @@ class VolunteerAdmin(admin.ModelAdmin): | |
admin.site.register(Department) | ||
admin.site.register(Badge, BadgeAdmin) | ||
admin.site.register(Level, LevelAdmin) | ||
admin.site.register(UserDivisionLevel, UserDivisionLevelAdmin) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. отдельно таблицу связей отображать не надо в карточке пользователя добавь отображение списка направлений |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
# Generated by Django 3.2.20 on 2024-02-29 18:49 | ||
|
||
from django.db import migrations, models | ||
import django.db.models.deletion | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
('courses', '0027_auto_20240229_2149'), | ||
('users', '0007_badge_badge_slug'), | ||
] | ||
|
||
operations = [ | ||
migrations.AddField( | ||
model_name='badge', | ||
name='division', | ||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='courses.division', verbose_name='Направление умения'), | ||
), | ||
migrations.AddConstraint( | ||
model_name='badge', | ||
constraint=models.UniqueConstraint(fields=('name', 'division'), name='unique_badge'), | ||
), | ||
] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
# Generated by Django 3.2.20 on 2024-03-12 18:51 | ||
|
||
from django.db import migrations, models | ||
import django.db.models.deletion | ||
|
||
|
||
class Migration(migrations.Migration): | ||
Leontiev93 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
dependencies = [ | ||
('courses', '0027_auto_20240229_2149'), | ||
('users', '0008_auto_20240229_2149'), | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name='UserDivisionLevel', | ||
fields=[ | ||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
], | ||
options={ | ||
'verbose_name': 'Уровень волонтера по направлениям', | ||
'verbose_name_plural': 'Уровни волонтеров по направлениям', | ||
}, | ||
), | ||
migrations.RemoveConstraint( | ||
model_name='badge', | ||
name='unique_badge', | ||
), | ||
migrations.AlterField( | ||
model_name='badge', | ||
name='division', | ||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='courses.division', verbose_name='Направление умения'), | ||
), | ||
migrations.AddField( | ||
model_name='userdivisionlevel', | ||
name='division', | ||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.division', verbose_name='Направление умения'), | ||
), | ||
migrations.AddField( | ||
model_name='userdivisionlevel', | ||
name='level', | ||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.level', verbose_name='Уровень умения'), | ||
), | ||
migrations.AddField( | ||
model_name='userdivisionlevel', | ||
name='volunteer', | ||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='division_level', to='users.volunteer', verbose_name='Волонтер'), | ||
), | ||
migrations.AddField( | ||
model_name='volunteer', | ||
name='division_levels', | ||
field=models.ManyToManyField(blank=True, related_name='volunteers', through='users.UserDivisionLevel', to='courses.Division', verbose_name='Уровень умения'), | ||
), | ||
] | ||
Leontiev93 marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -163,6 +163,9 @@ class BadgeCategory(models.TextChoices): | |
blank=True, | ||
verbose_name="Курс для получения", | ||
) | ||
division = models.ForeignKey( | ||
"courses.Division", on_delete=models.SET_NULL, verbose_name="Направление умения", null=True, blank=True | ||
) | ||
|
||
class Meta: | ||
db_table = "badges" | ||
|
@@ -296,6 +299,13 @@ class Volunteer(models.Model): | |
) | ||
created_at = models.DateTimeField("Дата и время создания запси", auto_now_add=True) | ||
updated_at = models.DateTimeField("Дата обновления записи", auto_now=True) | ||
division_levels = models.ManyToManyField( | ||
"courses.Division", | ||
through="users.UserDivisionLevel", | ||
blank=True, | ||
related_name="volunteers", | ||
Leontiev93 marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. здесь указывается имя для обратной связи, related_name="+", |
||
verbose_name="Уровень умения", | ||
) | ||
|
||
class Meta: | ||
db_table = "volunteers" | ||
|
@@ -321,3 +331,27 @@ def create_default_volunteer_level(sender, instance, created, **kwargs): | |
|
||
if not existing_record: | ||
VolunteerLevel.objects.create(volunteer=volunteer, level=beginner_level, confirmed=True) | ||
|
||
|
||
class UserDivisionLevel(models.Model): | ||
"""Модель для связи пользователей, направлений и уровней.""" | ||
|
||
volunteer = models.ForeignKey( | ||
Volunteer, | ||
on_delete=models.CASCADE, | ||
related_name="division_level", | ||
verbose_name="Волонтер", | ||
) | ||
division = models.ForeignKey("courses.Division", on_delete=models.CASCADE, verbose_name="Направление умения") | ||
level = models.ForeignKey( | ||
Level, | ||
on_delete=models.CASCADE, | ||
verbose_name="Уровень умения", | ||
) | ||
|
||
class Meta: | ||
verbose_name = "Уровень волонтера по направлениям" | ||
verbose_name_plural = "Уровни волонтеров по направлениям" | ||
|
||
def __str__(self): | ||
return f"Направление {self.division.title}" | ||
Leontiev93 marked this conversation as resolved.
Show resolved
Hide resolved
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
оставь как было