@ -5,10 +5,31 @@ from apps.course.models import Course, CourseCategory, Attachment, Glossary, Les
from apps.course.models.course import get_localized_field
from apps.course.models.course import get_localized_field
from apps.chat.models import RoomMessage
from apps.chat.models import RoomMessage
from apps.account.serializers import UserProfileSerializer
from apps.account.serializers import UserProfileSerializer
from decimal import Decimal
import ast
import ast
import json
import json
def resolve_request_lang ( request , default = ' en ' ) :
language_code = getattr ( request , ' LANGUAGE_CODE ' , None )
if language_code :
return str ( language_code ) . lower ( )
if not request :
return default
header_value = ' '
if hasattr ( request , ' headers ' ) :
header_value = request . headers . get ( ' Accept-Language ' , ' ' )
if not header_value and hasattr ( request , ' META ' ) :
header_value = request . META . get ( ' HTTP_ACCEPT_LANGUAGE ' , ' ' )
if header_value :
return header_value . split ( ' , ' ) [ 0 ] . strip ( ) . lower ( )
return default
class CourseCategorySerializer ( serializers . ModelSerializer ) :
class CourseCategorySerializer ( serializers . ModelSerializer ) :
course_count = serializers . SerializerMethodField ( )
course_count = serializers . SerializerMethodField ( )
@ -21,7 +42,7 @@ class CourseCategorySerializer(serializers.ModelSerializer):
def _lang ( self ) :
def _lang ( self ) :
request = self . context . get ( ' request ' )
request = self . context . get ( ' request ' )
return getattr ( request , ' LANGUAGE_CODE ' , None ) or ' en '
return resolve_request_lang ( request )
def get_name ( self , obj ) :
def get_name ( self , obj ) :
return get_localized_field ( self . _lang ( ) , obj . name )
return get_localized_field ( self . _lang ( ) , obj . name )
@ -41,6 +62,7 @@ class CourseListSerializer(serializers.ModelSerializer):
price = serializers . SerializerMethodField ( )
price = serializers . SerializerMethodField ( )
discount_percentage = serializers . SerializerMethodField ( )
discount_percentage = serializers . SerializerMethodField ( )
final_price = serializers . SerializerMethodField ( )
final_price = serializers . SerializerMethodField ( )
currency = serializers . SerializerMethodField ( )
is_free = serializers . SerializerMethodField ( )
is_free = serializers . SerializerMethodField ( )
title = serializers . SerializerMethodField ( )
title = serializers . SerializerMethodField ( )
slug = serializers . SerializerMethodField ( )
slug = serializers . SerializerMethodField ( )
@ -68,11 +90,12 @@ class CourseListSerializer(serializers.ModelSerializer):
' price ' ,
' price ' ,
' discount_percentage ' ,
' discount_percentage ' ,
' final_price ' ,
' final_price ' ,
' currency ' ,
]
]
def _lang ( self ) :
def _lang ( self ) :
request = self . context . get ( ' request ' )
request = self . context . get ( ' request ' )
return getattr ( request , ' LANGUAGE_CODE ' , None ) or ' en '
return resolve_request_lang ( request )
def get_title ( self , obj ) :
def get_title ( self , obj ) :
return get_localized_field ( self . _lang ( ) , obj . title )
return get_localized_field ( self . _lang ( ) , obj . title )
@ -110,22 +133,27 @@ class CourseListSerializer(serializers.ModelSerializer):
return max ( lessons_count , obj . lessons_count )
return max ( lessons_count , obj . lessons_count )
def get_price ( self , obj ) :
def get_price ( self , obj ) :
if obj . is_free or obj . price == 0 :
amount = obj . get_price_for_language ( self . _lang ( ) )
if obj . is_free or amount == 0 :
return " 0.00 "
return " 0.00 "
return str ( obj . price )
return str ( amount )
def get_discount_percentage ( self , obj ) :
def get_discount_percentage ( self , obj ) :
if obj . is_free or obj . price == 0 :
if obj . is_free or obj . get_ price_for_language ( self . _lang ( ) ) == 0 :
return 0
return 0
return obj . discount_percentage
return obj . discount_percentage
def get_final_price ( self , obj ) :
def get_final_price ( self , obj ) :
if obj . is_free or obj . price == 0 :
amount = obj . get_final_price_for_language ( self . _lang ( ) )
if obj . is_free or amount == 0 :
return " 0.00 "
return " 0.00 "
return str ( obj . final_price )
return str ( amount )
def get_currency ( self , obj ) :
return obj . get_currency_for_language ( self . _lang ( ) )
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 ( Decimal ( obj . price or 0 ) == 0 and Decimal ( obj . price_rub or 0 ) == 0 )
class CourseDetailSerializer ( serializers . ModelSerializer ) :
class CourseDetailSerializer ( serializers . ModelSerializer ) :
@ -142,6 +170,7 @@ class CourseDetailSerializer(serializers.ModelSerializer):
price = serializers . SerializerMethodField ( )
price = serializers . SerializerMethodField ( )
discount_percentage = serializers . SerializerMethodField ( )
discount_percentage = serializers . SerializerMethodField ( )
final_price = serializers . SerializerMethodField ( )
final_price = serializers . SerializerMethodField ( )
currency = serializers . SerializerMethodField ( )
is_free = serializers . SerializerMethodField ( )
is_free = serializers . SerializerMethodField ( )
is_professor = serializers . SerializerMethodField ( )
is_professor = serializers . SerializerMethodField ( )
title = serializers . SerializerMethodField ( )
title = serializers . SerializerMethodField ( )
@ -181,6 +210,7 @@ class CourseDetailSerializer(serializers.ModelSerializer):
' price ' ,
' price ' ,
' discount_percentage ' ,
' discount_percentage ' ,
' final_price ' ,
' final_price ' ,
' currency ' ,
' timing ' ,
' timing ' ,
' features ' ,
' features ' ,
' last_lesson_id ' ,
' last_lesson_id ' ,
@ -389,25 +419,29 @@ class CourseDetailSerializer(serializers.ModelSerializer):
return obj . participants . count ( )
return obj . participants . count ( )
def get_price ( self , obj ) :
def get_price ( self , obj ) :
if obj . is_free or obj . price == 0 :
amount = obj . get_price_for_language ( self . _lang ( ) )
if obj . is_free or amount == 0 :
return " 0.00 "
return " 0.00 "
return str ( obj . price )
return str ( amount )
def get_discount_percentage ( self , obj ) :
def get_discount_percentage ( self , obj ) :
if obj . is_free or obj . price == 0 :
if obj . is_free or obj . get_ price_for_language ( self . _lang ( ) ) == 0 :
return 0
return 0
return obj . discount_percentage
return obj . discount_percentage
def get_final_price ( self , obj ) :
def get_final_price ( self , obj ) :
if obj . is_free or obj . price == 0 :
amount = obj . get_final_price_for_language ( self . _lang ( ) )
if obj . is_free or amount == 0 :
return " 0.00 "
return " 0.00 "
return str ( obj . final_price )
return str ( amount )
def get_currency ( self , obj ) :
return obj . get_currency_for_language ( self . _lang ( ) )
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 ( Decimal ( obj . price or 0 ) == 0 and Decimal ( obj . price_rub or 0 ) == 0 )
def _lang ( self ) :
def _lang ( self ) :
request = self . context . get ( ' request ' )
request = self . context . get ( ' request ' )
return getattr ( request , ' LANGUAGE_CODE ' , None ) or ' en '
return resolve_request_lang ( request )
def get_title ( self , obj ) :
def get_title ( self , obj ) :
return get_localized_field ( self . _lang ( ) , obj . title )
return get_localized_field ( self . _lang ( ) , obj . title )