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, null=True)
file = models.FileField(upload_to=upload_path, null=True, blank=True)
link = models.URLField(max_length=200, null=True, blank=True)
created_date = models.DateTimeField(auto_now_add=True)

so here I need help how to correctly get those fileds and make duplicate 
from top Course object to bottom TextLinkFileStep objects

def make_duplicate(modeladmin, request, queryset):
for obj in queryset:
pk = obj.id
try:
course = Course.objects.prefetch_related(
"sections",
"sections__sub_sections",
"sections__sub_sections__tests",
"sections__sub_sections__tests__answers",
Prefetch(
"sections__sub_sections__steps",
Step.objects.select_related("step_text_link_file", "step_test"),
),
"skills",
).get(pk=pk)

# new course
new_course = course
new_course.pk = None
new_course.name = course.name + " Copy"
new_course.status = course.status

# course_skills
for skill in course.skills.all():
new_skill = skill
new_skill.pk = None
new_skill.course = new_course
new_skill.save()

course_order_list = list()

# changing order list
new_course.save()
# course_sections
for section in course.sections.all():
new_section = section
new_section.pk = None
new_section.course = new_course

section_order_list = list()
new_section.save()
course_order_list.append(new_section.id)

# section sub_section
for sub_section in section.sub_sections.all():
new_sub_section = sub_section
new_sub_section.pk = None
new_sub_section.section = new_section

sub_section_order_list = []
new_sub_section.save()
section_order_list.append(new_sub_section.id)
# steps and text_link_file
for step in sub_section.steps.all():
new_step = step
new_step.pk = None
new_step.sub_section = new_sub_section
new_step.save()
# copying test_step and test_step
if step.step_type == Step.TEST:
print("step is test")
# new_test_step = step.step_test
# new_test_step.pk = None
# new_test_step.step = new_step
# new_test_step.save()

sub_section_order_list.append(new_step.id)
print(step.id) # error new step iz

try:
# text_file_link, txt_file_created = TextLinkFileStep.objects.get_or_create(
# step=Step(pk=step.id)) # .values('text', 'file', 'link')

# new_text_file_link = text_file_link
# needed line below
new_text_file_link = TextLinkFileStep.objects.create(
step=step,
text=step.text_file_link.text,
link=step.text_file_link.link,
file=step.text_file_link.file,
)
# new_text_file_link = step.step_text_link_file
# new_text_file_link.pk = None
# new_text_file_link.step = new_step
# new_text_file_link.text = text_file_link.text
print("text is", step.text_file_link)
new_text_file_link.save()
except:
print("text link file step tries to be existed")

# tests = Test.objects.filter(sub_section__pk=sub_section.id)
# for test in list(tests):
# new_test = test
# new_test.pk = None
# new_test.sub_section = new_sub_section
# new_test.save()
# answers = AnswerStep.objects.filter(test__pk=test.id)
# for answer in list(answers):
# new_answer = answer
# new_answer.pk = None
# new_answer.test = new_test
# new_answer.save()

new_sub_section.order_list = from_list_to_chars(sub_section_order_list)
new_sub_section.save()
new_section.order_list = from_list_to_chars(section_order_list)
new_section.save()
new_course.order_list = from_list_to_chars(course_order_list)
new_course.save()

except Course.DoesNotExist:
print("course does not exist")

So my function above is failing in Step and TextLinkFileStep objects 
I need your assistance in this issue. My only hope is for this community))
Feel free to make any suggestions
Best regards 

-- 
You received this message because you are subscribed to the Google Groups 
"Django REST framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-rest-framework+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-rest-framework/e411f03a-c6ee-4627-8bca-0ace14f1b231n%40googlegroups.com.

Reply via email to