@ -1,14 +1,8 @@
from rest_framework import serializers
from rest_framework import serializers
<< << << < HEAD
from dj_filer.admin import get_thumbs
from apps.course.models import Course , CourseCategory , Attachment , Glossary , LessonCompletion , Participant , Lesson
== == == =
# from dj_filer.admin import get_thumbs
# from dj_filer.admin import get_thumbs
from utils import get_thumbs
from utils import get_thumbs
from apps.course.models import Course , CourseCategory , Attachment , Glossary , LessonCompletion , Participant , Lesson , CourseAttachment , CourseGlossary , CourseLesson
from apps.course.models import Course , CourseCategory , Attachment , Glossary , LessonCompletion , Participant , Lesson , CourseAttachment , CourseGlossary , CourseLesson
>> >> >> > develop
from apps.chat.models import RoomMessage
from apps.chat.models import RoomMessage
from apps.account.serializers import UserProfileSerializer
from apps.account.serializers import UserProfileSerializer
@ -30,15 +24,11 @@ class CourseListSerializer(serializers.ModelSerializer):
thumbnail = serializers . SerializerMethodField ( )
thumbnail = serializers . SerializerMethodField ( )
participant_count = serializers . SerializerMethodField ( )
participant_count = serializers . SerializerMethodField ( )
lessons_count = serializers . SerializerMethodField ( )
lessons_count = serializers . SerializerMethodField ( )
<< << << < HEAD
== == == =
price = serializers . SerializerMethodField ( )
price = serializers . SerializerMethodField ( )
discount_percentage = serializers . SerializerMethodField ( )
discount_percentage = serializers . SerializerMethodField ( )
final_price = serializers . SerializerMethodField ( )
final_price = serializers . SerializerMethodField ( )
is_free = serializers . SerializerMethodField ( )
is_free = serializers . SerializerMethodField ( )
>> >> >> > develop
class Meta :
class Meta :
model = Course
model = Course
fields = [
fields = [
@ -68,13 +58,6 @@ class CourseListSerializer(serializers.ModelSerializer):
return obj . participants . count ( )
return obj . participants . count ( )
def get_lessons_count ( self , obj ) :
def get_lessons_count ( self , obj ) :
<< << << < HEAD
lessons_count = obj . lessons . filter ( is_active = True ) . count ( )
return max ( lessons_count , obj . lessons_count )
== == == =
# Use prefetched lessons if available
# Use prefetched lessons if available
if hasattr ( obj , ' lessons ' ) and obj . lessons . all ( ) :
if hasattr ( obj , ' lessons ' ) and obj . lessons . all ( ) :
lessons_count = sum ( 1 for lesson in obj . lessons . all ( ) if lesson . is_active )
lessons_count = sum ( 1 for lesson in obj . lessons . all ( ) if lesson . is_active )
@ -100,16 +83,11 @@ class CourseListSerializer(serializers.ModelSerializer):
def get_is_free ( self , obj ) :
def get_is_free ( self , obj ) :
return obj . is_free or obj . price == 0
return obj . is_free or obj . price == 0
>> >> >> > develop
class CourseDetailSerializer ( serializers . ModelSerializer ) :
class CourseDetailSerializer ( serializers . ModelSerializer ) :
category = CourseCategorySerializer ( )
category = CourseCategorySerializer ( )
<< << << < HEAD
professor = UserProfileSerializer ( )
== == == =
professor = serializers . SerializerMethodField ( )
professor = serializers . SerializerMethodField ( )
>> >> >> > develop
thumbnail = serializers . SerializerMethodField ( )
thumbnail = serializers . SerializerMethodField ( )
participant_count = serializers . SerializerMethodField ( )
participant_count = serializers . SerializerMethodField ( )
access = serializers . SerializerMethodField ( )
access = serializers . SerializerMethodField ( )
@ -117,9 +95,6 @@ class CourseDetailSerializer(serializers.ModelSerializer):
lessons_count = serializers . SerializerMethodField ( )
lessons_count = serializers . SerializerMethodField ( )
last_lesson_id = serializers . SerializerMethodField ( )
last_lesson_id = serializers . SerializerMethodField ( )
room_id = serializers . SerializerMethodField ( )
room_id = serializers . SerializerMethodField ( )
<< << << < HEAD
== == == =
user_transaction_status = serializers . SerializerMethodField ( )
user_transaction_status = serializers . SerializerMethodField ( )
price = serializers . SerializerMethodField ( )
price = serializers . SerializerMethodField ( )
discount_percentage = serializers . SerializerMethodField ( )
discount_percentage = serializers . SerializerMethodField ( )
@ -127,7 +102,6 @@ class CourseDetailSerializer(serializers.ModelSerializer):
is_free = serializers . SerializerMethodField ( )
is_free = serializers . SerializerMethodField ( )
is_professor = serializers . SerializerMethodField ( )
is_professor = serializers . SerializerMethodField ( )
>> >> >> > develop
class Meta :
class Meta :
model = Course
model = Course
fields = [
fields = [
@ -138,10 +112,7 @@ class CourseDetailSerializer(serializers.ModelSerializer):
' access ' ,
' access ' ,
' participant_count ' ,
' participant_count ' ,
' professor ' ,
' professor ' ,
<< << << < HEAD
== == == =
' is_professor ' ,
' is_professor ' ,
>> >> >> > develop
' thumbnail ' ,
' thumbnail ' ,
' video_type ' ,
' video_type ' ,
' video_file ' ,
' video_file ' ,
@ -163,11 +134,6 @@ class CourseDetailSerializer(serializers.ModelSerializer):
' features ' ,
' features ' ,
' last_lesson_id ' ,
' last_lesson_id ' ,
' room_id ' ,
' room_id ' ,
<< << << < HEAD
]
def get_room_id ( self , obj ) :
== == == =
' user_transaction_status '
' user_transaction_status '
]
]
@ -176,14 +142,11 @@ class CourseDetailSerializer(serializers.ModelSerializer):
if hasattr ( obj , ' room_messages ' ) and obj . room_messages . all ( ) :
if hasattr ( obj , ' room_messages ' ) and obj . room_messages . all ( ) :
return obj . room_messages . first ( ) . id
return obj . room_messages . first ( ) . id
# Fallback to direct query if not prefetched
# Fallback to direct query if not prefetched
>> >> >> > develop
room_message = RoomMessage . objects . filter ( course = obj ) . first ( )
room_message = RoomMessage . objects . filter ( course = obj ) . first ( )
if room_message :
if room_message :
return room_message . id
return room_message . id
return None
return None
<< << << < HEAD
== == == =
def get_user_transaction_status ( self , obj ) :
def get_user_transaction_status ( self , obj ) :
from apps.transaction.models import TransactionParticipant
from apps.transaction.models import TransactionParticipant
if student : = self . _get_authenticated_user ( ) :
if student : = self . _get_authenticated_user ( ) :
@ -196,29 +159,10 @@ class CourseDetailSerializer(serializers.ModelSerializer):
return latest_transaction . status
return latest_transaction . status
return None
return None
>> >> >> > develop
def get_last_lesson_id ( self , obj ) :
def get_last_lesson_id ( self , obj ) :
request = self . context . get ( ' request ' )
request = self . context . get ( ' request ' )
if request and request . user . is_authenticated :
if request and request . user . is_authenticated :
user = request . user
user = request . user
<< << << < HEAD
# آخرین درس تکمیلشده توسط کاربر
last_completed_lesson = LessonCompletion . objects . filter (
student = user ,
lesson__course = obj
) . order_by ( ' -completed_at ' ) . first ( )
if last_completed_lesson :
# پیدا کردن درس بعدی بر اساس priority
next_lesson = Lesson . objects . filter (
course = obj ,
priority__gt = last_completed_lesson . lesson . priority ,
is_active = True
) . order_by ( ' priority ' ) . first ( )
if not next_lesson :
next_lesson = Lesson . objects . filter (
== == == =
# Use prefetched lessons if available
# Use prefetched lessons if available
if hasattr ( obj , ' lessons ' ) and obj . lessons . all ( ) :
if hasattr ( obj , ' lessons ' ) and obj . lessons . all ( ) :
@ -257,16 +201,11 @@ class CourseDetailSerializer(serializers.ModelSerializer):
) . order_by ( ' priority ' ) . first ( )
) . order_by ( ' priority ' ) . first ( )
if not next_lesson :
if not next_lesson :
next_lesson = CourseLesson . objects . filter (
next_lesson = CourseLesson . objects . filter (
>> >> >> > develop
course = obj ,
course = obj ,
is_active = True
is_active = True
) . order_by ( ' priority ' ) . first ( )
) . order_by ( ' priority ' ) . first ( )
if next_lesson :
if next_lesson :
<< << << < HEAD
return next_lesson . id
== == == =
return next_lesson . id
return next_lesson . id
>> >> >> > develop
return None
return None
@ -277,15 +216,12 @@ class CourseDetailSerializer(serializers.ModelSerializer):
return False
return False
return True
return True
return False
return False
<< << << < HEAD
== == == =
def get_professor ( self , obj ) :
def get_professor ( self , obj ) :
""" Return the course professor ' s profile using UserProfileSerializer """
""" Return the course professor ' s profile using UserProfileSerializer """
if obj . professor :
if obj . professor :
return UserProfileSerializer ( obj . professor , context = self . context ) . data
return UserProfileSerializer ( obj . professor , context = self . context ) . data
return None
return None
>> >> >> > develop
def get_is_professor ( self , obj ) :
def get_is_professor ( self , obj ) :
if professor : = self . _get_authenticated_user ( ) :
if professor : = self . _get_authenticated_user ( ) :
@ -293,14 +229,11 @@ class CourseDetailSerializer(serializers.ModelSerializer):
return False
return False
def get_lessons_count ( self , obj ) :
def get_lessons_count ( self , obj ) :
<< << << < HEAD
== == == =
# Use prefetched lessons if available
# Use prefetched lessons if available
if hasattr ( obj , ' lessons ' ) and obj . lessons . all ( ) :
if hasattr ( obj , ' lessons ' ) and obj . lessons . all ( ) :
lessons_count = sum ( 1 for lesson in obj . lessons . all ( ) if lesson . is_active )
lessons_count = sum ( 1 for lesson in obj . lessons . all ( ) if lesson . is_active )
return max ( lessons_count , obj . lessons_count )
return max ( lessons_count , obj . lessons_count )
# Fallback to direct query
# Fallback to direct query
>> >> >> > develop
lessons_count = obj . lessons . filter ( is_active = True ) . count ( )
lessons_count = obj . lessons . filter ( is_active = True ) . count ( )
return max ( lessons_count , obj . lessons_count )
return max ( lessons_count , obj . lessons_count )
@ -309,14 +242,10 @@ class CourseDetailSerializer(serializers.ModelSerializer):
if student : = self . _get_authenticated_user ( ) :
if student : = self . _get_authenticated_user ( ) :
if not self . _is_participant ( student , obj ) :
if not self . _is_participant ( student , obj ) :
return None
return None
<< << << < HEAD
return self . _get_completed_lessons_count ( student , obj )
== == == =
completed_count = self . _get_completed_lessons_count ( student , obj )
completed_count = self . _get_completed_lessons_count ( student , obj )
# Ensure completed count doesn't exceed total lessons count
# Ensure completed count doesn't exceed total lessons count
total_lessons = self . get_lessons_count ( obj )
total_lessons = self . get_lessons_count ( obj )
return min ( completed_count , total_lessons )
return min ( completed_count , total_lessons )
>> >> >> > develop
return None
return None
def _is_participant ( self , student , course ) :
def _is_participant ( self , student , course ) :
@ -330,11 +259,6 @@ class CourseDetailSerializer(serializers.ModelSerializer):
def _get_completed_lessons_count ( self , student , course ) :
def _get_completed_lessons_count ( self , student , course ) :
""" Helper method to count completed lessons for the student in the given course. """
""" Helper method to count completed lessons for the student in the given course. """
<< << << < HEAD
return LessonCompletion . objects . filter (
student = student ,
lesson__course = course
== == == =
# Use prefetched completions if available
# Use prefetched completions if available
if hasattr ( course , ' lessons ' ) and course . lessons . all ( ) :
if hasattr ( course , ' lessons ' ) and course . lessons . all ( ) :
completed_count = 0
completed_count = 0
@ -348,7 +272,6 @@ class CourseDetailSerializer(serializers.ModelSerializer):
return LessonCompletion . objects . filter (
return LessonCompletion . objects . filter (
student = student ,
student = student ,
course_lesson__course = course
course_lesson__course = course
>> >> >> > develop
) . count ( )
) . count ( )
@ -356,9 +279,6 @@ class CourseDetailSerializer(serializers.ModelSerializer):
return get_thumbs ( obj . thumbnail , self . context . get ( ' request ' ) )
return get_thumbs ( obj . thumbnail , self . context . get ( ' request ' ) )
def get_participant_count ( self , obj ) :
def get_participant_count ( self , obj ) :
<< << << < HEAD
return obj . participants . count ( )
== == == =
# Use prefetched participants if available
# Use prefetched participants if available
if hasattr ( obj , ' participants ' ) and obj . participants . all ( ) :
if hasattr ( obj , ' participants ' ) and obj . participants . all ( ) :
return len ( obj . participants . all ( ) )
return len ( obj . participants . all ( ) )
@ -381,25 +301,17 @@ class CourseDetailSerializer(serializers.ModelSerializer):
return str ( obj . final_price )
return str ( obj . final_price )
def get_is_free ( self , obj ) :
def get_is_free ( self , obj ) :
return obj . is_free or obj . price == 0
return obj . is_free or obj . price == 0
>> >> >> > develop
class MyCourseListSerializer ( serializers . ModelSerializer ) :
class MyCourseListSerializer ( serializers . ModelSerializer ) :
category = CourseCategorySerializer ( )
category = CourseCategorySerializer ( )
thumbnail = serializers . SerializerMethodField ( )
thumbnail = serializers . SerializerMethodField ( )
<< << << < HEAD
lessons_complated_count = serializers . SerializerMethodField ( )
class Meta :
model = Course
== == == =
lessons_count = serializers . SerializerMethodField ( )
lessons_count = serializers . SerializerMethodField ( )
lessons_complated_count = serializers . SerializerMethodField ( )
lessons_complated_count = serializers . SerializerMethodField ( )
class Meta :
class Meta :
model = Course
model = Course
>> >> >> > develop
fields = [
fields = [
' id ' ,
' id ' ,
' title ' ,
' title ' ,
@ -414,9 +326,6 @@ class MyCourseListSerializer(serializers.ModelSerializer):
def get_thumbnail ( self , obj ) :
def get_thumbnail ( self , obj ) :
return get_thumbs ( obj . thumbnail , self . context . get ( ' request ' ) )
return get_thumbs ( obj . thumbnail , self . context . get ( ' request ' ) )
<< << << < HEAD
== == == =
def get_lessons_count ( self , obj ) :
def get_lessons_count ( self , obj ) :
""" Get the actual count of active lessons """
""" Get the actual count of active lessons """
@ -428,30 +337,22 @@ class MyCourseListSerializer(serializers.ModelSerializer):
lessons_count = obj . lessons . filter ( is_active = True ) . count ( )
lessons_count = obj . lessons . filter ( is_active = True ) . count ( )
return max ( lessons_count , obj . lessons_count )
return max ( lessons_count , obj . lessons_count )
>> >> >> > develop
def get_lessons_complated_count ( self , obj ) :
def get_lessons_complated_count ( self , obj ) :
if student : = self . _get_authenticated_user ( ) :
if student : = self . _get_authenticated_user ( ) :
if not self . _is_participant ( student , obj ) :
if not self . _is_participant ( student , obj ) :
return None
return None
<< << << < HEAD
return self . _get_completed_lessons_count ( student , obj )
== == == =
completed_count = self . _get_completed_lessons_count ( student , obj )
completed_count = self . _get_completed_lessons_count ( student , obj )
# Ensure completed count doesn't exceed total lessons count
# Ensure completed count doesn't exceed total lessons count
total_lessons = self . get_lessons_count ( obj )
total_lessons = self . get_lessons_count ( obj )
return min ( completed_count , total_lessons )
return min ( completed_count , total_lessons )
>> >> >> > develop
return None
return None
def _is_participant ( self , student , course ) :
def _is_participant ( self , student , course ) :
""" Helper method to check if a student is a participant in the given course. """
""" Helper method to check if a student is a participant in the given course. """
<< << << < HEAD
== == == =
# اگر کاربر استاد دوره است، دسترسی کامل دارد
# اگر کاربر استاد دوره است، دسترسی کامل دارد
if course . professor == student :
if course . professor == student :
return True
return True
# در غیر این صورت چک میکنیم که آیا participant است یا خیر
# در غیر این صورت چک میکنیم که آیا participant است یا خیر
>> >> >> > develop
return Participant . objects . filter ( student = student , course = course ) . exists ( )
return Participant . objects . filter ( student = student , course = course ) . exists ( )
def _get_authenticated_user ( self ) :
def _get_authenticated_user ( self ) :
@ -461,11 +362,6 @@ class MyCourseListSerializer(serializers.ModelSerializer):
def _get_completed_lessons_count ( self , student , course ) :
def _get_completed_lessons_count ( self , student , course ) :
""" Helper method to count completed lessons for the student in the given course. """
""" Helper method to count completed lessons for the student in the given course. """
<< << << < HEAD
return LessonCompletion . objects . filter (
student = student ,
lesson__course = course
== == == =
# Use prefetched completions if available
# Use prefetched completions if available
if hasattr ( course , ' lessons ' ) and course . lessons . all ( ) :
if hasattr ( course , ' lessons ' ) and course . lessons . all ( ) :
completed_count = 0
completed_count = 0
@ -479,7 +375,6 @@ class MyCourseListSerializer(serializers.ModelSerializer):
return LessonCompletion . objects . filter (
return LessonCompletion . objects . filter (
student = student ,
student = student ,
course_lesson__course = course
course_lesson__course = course
>> >> >> > develop
) . count ( )
) . count ( )
@ -487,8 +382,6 @@ class AttachmentSerializer(serializers.ModelSerializer):
class Meta :
class Meta :
model = Attachment
model = Attachment
fields = [ ' id ' , ' title ' , ' file ' , ' file_size ' ]
fields = [ ' id ' , ' title ' , ' file ' , ' file_size ' ]
<< << << < HEAD
== == == =
class CourseAttachmentSerializer ( serializers . ModelSerializer ) :
class CourseAttachmentSerializer ( serializers . ModelSerializer ) :
@ -499,14 +392,11 @@ class CourseAttachmentSerializer(serializers.ModelSerializer):
class Meta :
class Meta :
model = CourseAttachment
model = CourseAttachment
fields = [ ' id ' , ' title ' , ' file ' , ' file_size ' ]
fields = [ ' id ' , ' title ' , ' file ' , ' file_size ' ]
>> >> >> > develop
class GlossarySerializer ( serializers . ModelSerializer ) :
class GlossarySerializer ( serializers . ModelSerializer ) :
class Meta :
class Meta :
model = Glossary
model = Glossary
<< << << < HEAD
== == == =
fields = [ ' id ' , ' title ' , ' description ' ]
fields = [ ' id ' , ' title ' , ' description ' ]
@ -516,5 +406,4 @@ class CourseGlossarySerializer(serializers.ModelSerializer):
class Meta :
class Meta :
model = CourseGlossary
model = CourseGlossary
>> >> >> > develop
fields = [ ' id ' , ' title ' , ' description ' ]
fields = [ ' id ' , ' title ' , ' description ' ]