Hello everyone,
I am bit confused about making duplicate of a Course object in admin
actions with all related child objects. So my Models are:
class Course(models.Model):
PROGRAMMING = 1
DESIGN = 2
ROBOTICS = 3
DIGITAL_LITERACY = 4
IT_ENTREPRENEURSHIP = 5
CATEGORY_CHOICES = (
(PROGRAMMING, 'Программирование, IT предпринимательство'),
(DESIGN, 'Компьютерная графика и медиа'),
(ROBOTICS, 'Робототехника и электроника'),
(DIGITAL_LITERACY, 'Компьютерная грамотность'),
)
NEW = 1
PROGRESS = 2
READY = 3
STATUS_CHOICES = (
(NEW, 'Новый'),
(PROGRESS, 'В прогрессе'),
(READY, 'Готово'),
)
class Meta:
ordering = ['pk']
course_type = models.ForeignKey(
Category, related_name='courses', on_delete=models.SET_NULL, blank=True,
null=True, db_index=True)
name = models.CharField(max_length=120, db_index=True)
short_description = models.TextField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
image = models.FileField(upload_to=upload_path, null=True, blank=True)
icon = models.FileField(upload_to=upload_path, null=True, blank=True)
video_link = models.URLField(max_length=200, null=True, blank=True)
target_audience = models.TextField(blank=True, null=True)
price = models.DecimalField(max_digits=8, decimal_places=2, default=0.00,
validators=[
MinValueValidator(Decimal('0.00'))], blank=True)
author = models.ForeignKey(
'users.User', default=1, on_delete=models.SET_NULL, null=True)
language = models.CharField(
max_length=3, choices=settings.LANGUAGES, default='ru', db_index=True)
category = models.PositiveSmallIntegerField(
choices=CATEGORY_CHOICES, default=PROGRAMMING, db_index=True)
robotics_kit = models.ForeignKey(
RoboticsKit, related_name='courses', on_delete=models.SET_NULL, blank=True,
null=True)
course_class = models.ManyToManyField(
CourseClass, related_name='courses')
status = models.PositiveSmallIntegerField(
choices=STATUS_CHOICES, default=NEW, blank=True)
order_list = models.CharField(max_length=500, validators=[
int_list_validator], blank=True, null=True)
created_date = models.DateTimeField(auto_now_add=True)
is_accessible = models.BooleanField(default=True, null=True, blank=True)
is_intro = models.BooleanField(default=False, null=True, blank=True)
projects = models.ManyToManyField(
"self", blank=True, related_name='courses')
# objects = DefaultSelectOrPrefetchManager(
# select_related=('robotics_kit', 'course_class', 'course_type'))
def __str__(self):
return self.name
class Section(models.Model):
class Meta:
ordering = ['pk']
course = models.ForeignKey(
Course, related_name='sections', on_delete=models.CASCADE)
name = models.CharField(max_length=120)
created_date = models.DateTimeField(auto_now_add=True)
order_list = models.CharField(max_length=500, validators=[
int_list_validator], blank=True, null=True)
def __str__(self):
return self.name
class SubSection(models.Model):
class Meta:
ordering = ['pk']
section = models.ForeignKey(
Section, related_name='sub_sections', on_delete=models.CASCADE)
name = models.CharField(max_length=120)
goal = models.TextField(max_length=500, default='', blank=True, null=True)
image = models.FileField(upload_to=upload_path, null=True, blank=True,
validators=[
FileExtensionValidator(allowed_extensions=['jpg', 'png', 'jpeg'])])
link = models.URLField(max_length=200, null=True, blank=True)
created_date = models.DateTimeField(auto_now_add=True)
order_list = models.CharField(max_length=500, validators=[
int_list_validator], blank=True, null=True)
is_homework = models.BooleanField(default=False)
materials = GenericRelation(
"Material", null=True, related_query_name='sub_section')
comments = GenericRelation(
"Comment", null=True, related_query_name='sub_sections')
point = models.PositiveSmallIntegerField(default=0)
skills = models.ManyToManyField(Skill)
hours = models.PositiveIntegerField(default=0, blank=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("sub_section", kwargs={"course_pk": self.section.course.pk,
"section_pk": self.section.pk, "sub_section_pk": self.pk})
class Step(models.Model):
class Meta:
ordering = ['pk']
TEXT = 1
HINT = 2
TEST = 3
EXERCISE = 4
CODE_EXAMPLE = 5
MODELING_3D = 6
VIDEO = 7
MATERIALS = 8
TYPE_CHOICES = (
(TEXT, 'Текст'),
(HINT, 'Подсказка'),
(TEST, 'Тестовое задание'),
(EXERCISE, 'Упражнение для программирование'),
(CODE_EXAMPLE, 'Пример кода'),
(MODELING_3D, 'Пример 3D модели'),
(VIDEO, 'Видео'),
(MATERIALS, 'Материалы'),
)
sub_section = models.ForeignKey(
SubSection, related_name='steps', on_delete=models.CASCADE)
name = models.CharField(blank=True, max_length=255)
step_type = models.PositiveSmallIntegerField(
choices=TYPE_CHOICES, default=TEXT)
materials = GenericRelation(
"Material", null=True, related_query_name='step')
created_date = models.DateTimeField(auto_now_add=True)
class TextLinkFileStep(models.Model):
step = models.OneToOneField(
Step, related_name='step_text_link_file', on_delete=models.CASCADE,
null=True, blank=True)
text = models.TextField(blank=True, n