Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
162 commits
Select commit Hold shift + click to select a range
b5fb62a
certificate configuration
nez2021 Apr 13, 2021
bc2e2d4
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 13, 2021
1dd2198
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 13, 2021
cf5bf61
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 14, 2021
de2cded
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 14, 2021
d7157b1
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 15, 2021
e6ec817
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 19, 2021
e7de009
display certificate menu in studio
nez2021 Apr 19, 2021
3e775a8
Implement new notification types and change API format
Apr 21, 2021
8188adc
Merged in features/LMA-751 (pull request #9)
Apr 21, 2021
889c2ec
LMA-752 Banner related
Apr 21, 2021
0c0bc5c
config changes
nez2021 Apr 22, 2021
8166b74
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 22, 2021
55f89c8
LMA-752: Front end bootstrap changes for full screen
Apr 22, 2021
3cc4a5d
Implemented unread feature for notification
Apr 22, 2021
1571d77
Merged in features/LMA-767 (pull request #10)
Apr 22, 2021
afbe5c0
LMA-752, Fixed the following
Apr 23, 2021
e0d100a
Merge branch 'features/LMA-752' into develop
Apr 23, 2021
de702f7
LMA-752: Fix for web image loading,
Apr 23, 2021
df93db8
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 23, 2021
44293d6
Change notification API response format
Apr 23, 2021
0a7c486
Merged in features/LMA-807 (pull request #11)
Apr 23, 2021
f24510e
LMA-752 : Fixes
Apr 23, 2021
11c47e5
Merge branch 'develop' of bitbucket.org:ntuclink/lhubml into develop
Apr 23, 2021
dee926d
local change for banner
nez2021 Apr 23, 2021
c56ea7e
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 23, 2021
e8c51c1
LMA-752: Studio import fix
Apr 23, 2021
f11115f
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 23, 2021
7e0e9aa
Completed LMA-638
arafay993 Apr 23, 2021
6d874ac
LMA-752: url fix
Apr 23, 2021
764d9a2
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 23, 2021
e188d3a
LMA-638 check button issue solved
arafay993 Apr 24, 2021
8c95370
Revert "LMA-638 check button issue solved. Removed unnecessary file"
arafay993 Apr 24, 2021
fd94b52
Revert "Revert "LMA-638 check button issue solved. Removed unnecessar…
arafay993 Apr 26, 2021
a933bc4
Revert "LMA-638 check button issue solved"
arafay993 Apr 26, 2021
4a49daa
LMA-638: GST calculation on multiselect, append two decimal places in…
arafay993 Apr 27, 2021
b76f95f
LMA-638: Fixed: LMS Shopping cart multi select not working with tax
arafay993 Apr 27, 2021
74a9fdd
Change Order history API format and add extra field
Apr 27, 2021
d4cdbfb
Merged in features/LMA-765-updated (pull request #13)
Apr 27, 2021
3eed815
footer changes & course detail own_review field merge
nez2021 Apr 28, 2021
b0d15bb
Fixed order history API formating
Apr 28, 2021
1d39c47
Merged in features/LMA-765-fix (pull request #14)
Apr 28, 2021
3a3758a
Fixed: format discounted_price to two decimal places in mobile apis a…
arafay993 Apr 28, 2021
91d7102
Merge branch 'gs/koa.master' of github.com:yasir1brahim/edx-platform …
arafay993 Apr 28, 2021
dc9f0bf
Implemented notification multiple actions and endpoints
Apr 29, 2021
f7a8539
Merged in features/LMA-766 (pull request #15)
Apr 29, 2021
239de60
merge thiru discovery banner and GJ image hiding
nez2021 Apr 29, 2021
8823294
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 29, 2021
88565bd
Modified response format for handouts API
Apr 29, 2021
0dfb196
Merged in features/LMA-536 (pull request #16)
Apr 29, 2021
7be8da0
Change notification format from form data into json
Apr 29, 2021
badae00
Merged in features/LMA-766-updated (pull request #17)
Apr 29, 2021
b2e2be8
LMA-723: Convert price values into string and roundoff in CourseDetai…
arafay993 Apr 29, 2021
8ca487d
Merge branch 'features/LMA-723' of github.com:yasir1brahim/edx-platfo…
arafay993 Apr 29, 2021
b9b1cce
thiru home api
nez2021 Apr 30, 2021
bb3dd62
thiru home api change
nez2021 Apr 30, 2021
713b0f7
Merge branch 'develop' of https://bitbucket.org/ntuclink/lhubml into …
nez2021 Apr 30, 2021
5746036
Merged develop into gs/koa.master
nez2021 Apr 30, 2021
791f97f
Merge branch 'gs/koa.master' of https://bitbucket.org/ntuclink/lhubml…
arafay993 May 3, 2021
a0e5c0a
Fixed: Course not created in ecommerce
arafay993 May 3, 2021
7898176
LMA-535: Disable course price field. Save course price in course over…
arafay993 May 4, 2021
b6a4b44
LMA-535: Disable course price field, when for the newly created courses.
arafay993 May 4, 2021
ae4e561
Thiru LMA-769
nez2021 May 5, 2021
37f6820
Thiru LMA-769
nez2021 May 5, 2021
639c812
added missing comma
nez2021 May 5, 2021
38977ed
Added the fields of price_string and discounted_price_string
arafay993 May 6, 2021
c4b2219
LMA-643: Redirected to Basket page on click of Buy Now and Checkout b…
arafay993 May 6, 2021
2fd585a
Merge branch features/LMA-643 into gs/koa.master and resolved conflicts
arafay993 May 6, 2021
a310d19
Added extra course_id field for notification API
May 6, 2021
2a93193
Merged in features/LMA-39-extra-field (pull request #18)
May 6, 2021
94d9913
LMA-723: Added field "discount_percentage_string" in course details api
May 6, 2021
f3def63
Merge branch 'features-LMA-723' of github.com:yasir1brahim/edx-platfo…
arafay993 May 6, 2021
5ef9584
Resolved issue related to merge conflicts
arafay993 May 6, 2021
82d9c1b
LMA-643: Disable checkout button when cart is empty
May 6, 2021
28294b7
Merge branch 'gs/koa.master' of https://bitbucket.org/ntuclink/lhubml…
arafay993 May 7, 2021
562da01
Implemented certificate pdf generation
May 7, 2021
4cafc20
Merged in features/LMA-719 (pull request #19)
May 7, 2021
e1ba4f4
Fixed user image on reviews tab
May 7, 2021
b2c23a5
Merged in features/LMA-551-image (pull request #20)
May 7, 2021
3ce9484
Implemented detail order API
May 7, 2021
903c067
Merged in features/LMA-833 (pull request #21)
May 7, 2021
73dcea6
Added discounted_price_string field in course listing API
arafay993 May 10, 2021
8e62378
Merge branch 'gs/koa.master' of https://bitbucket.org/ntuclink/lhubml…
arafay993 May 10, 2021
d64718b
LMA-535: Created a new application lhub_ecommerce_offer in edx-platform
arafay993 May 10, 2021
9c83b68
LMA-535: Registered models in admin.py lhub_ecommerce_offer
arafay993 May 10, 2021
2444411
LMA-535: Removed course model and added course in offer model with ma…
arafay993 May 10, 2021
156988c
LMA-364: Created API for categorized view of courses in Discover New
May 10, 2021
02e7183
LMA-535: Added urls in lhub_ecommerce_offer and lms urls
arafay993 May 10, 2021
0196ec4
LMA-535: Added API for create, update, delete ecommerce offer in lhub…
arafay993 May 11, 2021
86cf4aa
LMA-535: Added delete functionality in ecommerce_offer API
arafay993 May 11, 2021
797b78f
LMA-535: changed API url
arafay993 May 11, 2021
49a1e13
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 11, 2021
11fe071
LMA-535: Dynamically setted DateTime in Offer table
arafay993 May 11, 2021
f17ec14
LMA-535: Created delete Offer API in lms
arafay993 May 11, 2021
8704c6a
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 11, 2021
5ceb089
LMA-535: Set discounted_price and discounted_percentage with respect …
arafay993 May 12, 2021
1139b21
LMA-535: Changed Delete API URL
arafay993 May 12, 2021
5f49e6d
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 12, 2021
6e44e80
LMA-364: Static slider
May 12, 2021
a210688
LMA-535: Added is_active field in Offer table in lms
arafay993 May 17, 2021
2e199a3
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 17, 2021
a5bfdd5
LMA-535: Made migration for the new field is_active in lms Offer table
arafay993 May 17, 2021
a92b854
LMA-535: Added is_active field in admin.py in lms lhub_ecommerce_offer
arafay993 May 17, 2021
2e2ec82
LMA-535: Renamed is_active field to is_suspended in lms lhub_ecommerc…
arafay993 May 17, 2021
18bf802
LMA-364: Course Recommendation, Made categorized view for the logged …
May 17, 2021
71284c4
LMA-535: Displayed discount of type value and done date validity for …
arafay993 May 17, 2021
ca8c679
note tab for web
nez2021 May 18, 2021
1e30fc8
note web changes
nez2021 May 18, 2021
e8ff429
resolving conflicts
nez2021 May 18, 2021
d35681f
envs for server
nez2021 May 18, 2021
520400b
LMA-364: Dynamic slider for logged in user categorized views
May 18, 2021
33499b7
LMA-535: Added Coupon model and made APIs for create/update/delete of…
arafay993 May 19, 2021
7bb891c
LMA-364: Make the slider operational for top rated courses
May 19, 2021
59f3ebf
LMA-535: Added coupons on course card and set priority in offer in lms
arafay993 May 20, 2021
da31d6b
LMA-535: Set priority in offer lms and added blank value to True in o…
arafay993 May 20, 2021
b90a894
LMA-535: Added name field in Coupon model and in Coupon API
arafay993 May 20, 2021
225d99d
LMA-535: Refactored Available Vouchers field
arafay993 May 20, 2021
5d138cc
Add extra fields for order detail API
May 20, 2021
e81c98f
Merged in features/LMA-833-extra-fields (pull request #28)
May 20, 2021
5f087da
LMA-535: Added 'discount_type' field in Course Listing API
arafay993 May 20, 2021
e8e75e9
LMA-535: Added discount_type, voucher_applicable and available_vouche…
arafay993 May 20, 2021
a6e6609
LMA-535: Fixed Course Detail API response
arafay993 May 20, 2021
53c90ba
LMA-535: Showed vouchers on course card in lms
arafay993 May 20, 2021
d51c21a
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 20, 2021
79c4341
LMA-364: Dynamic Slider/ Non-logged and logged in user pages adjusted
May 20, 2021
bcb2e1d
LMA-535: Added Voucher information in Recommended Courses API response
arafay993 May 20, 2021
fc9cf52
LMA-364: Made course categorization urls dynamic
arafay993 May 20, 2021
c96adf0
LMA 535 changes for coupon in shopping cart
arafay993 May 20, 2021
815e21b
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 20, 2021
b9b91a9
Resolved merge conflicts of LMA-535 and LMA-364
arafay993 May 20, 2021
34527e3
Resolved merge conflicts of LMS-535 and LMA-364
arafay993 May 20, 2021
e7d04b2
LMA-364: Course Recommendation for logged in and non-logged in user w…
May 20, 2021
39de9fe
Merge branch 'features/LMA-364' of github.com:yasir1brahim/edx-platfo…
May 20, 2021
56b8fc6
Resolve merge conflicts of LMA-364
arafay993 May 20, 2021
253f520
Fix email and twitter social sharing links
May 21, 2021
9c0e0a2
Merged in features/LMA-608-fix (pull request #30)
May 21, 2021
2b9da25
LMA-364: Resolved issues
May 21, 2021
1690b1d
LMA-535: Showed coupons on loggedin and not loggedin course pages in …
arafay993 May 21, 2021
a0ad0b8
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 21, 2021
b58e2f6
LMA-364: Fix Banner position
May 21, 2021
1bcc61f
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
May 21, 2021
1d1af44
Resolved merge conflicts
arafay993 May 21, 2021
651e177
LMA-535: Showed coupon on recommended courses at shopping cart page.
arafay993 May 21, 2021
75eecce
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 21, 2021
ace046a
LMA-364: Added images on the course-card in courses categorization
May 21, 2021
11ab6c1
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
May 21, 2021
90564c1
LMA-535: Fixed redirecting url to /basket after checked out of shoppi…
arafay993 May 21, 2021
bb830b8
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 21, 2021
afe15fc
LMA-364: Made slider visible through script
May 21, 2021
06d791f
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
May 21, 2021
4ec0f9b
LMA-364: Resolved repeated courses on recommended course slider
May 21, 2021
02603ec
LMA-535: Made coupon_code capitalized
arafay993 May 22, 2021
3d31589
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 22, 2021
bceaeb7
LMA-364: Enable prices on the course card slider
May 22, 2021
329371a
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
May 22, 2021
76ae9bd
LMA-535: Fixed end_datetime on Coupon create functionality
arafay993 May 22, 2021
a6d1412
Merge branch 'features/LMA-535' of github.com:yasir1brahim/edx-platfo…
arafay993 May 22, 2021
7d03e98
Resolved Merge conflicts of features/LMA-535 and gs/koa.master
arafay993 May 22, 2021
08b9e07
Merge branch 'gs/koa.master' of github.com:yasir1brahim/edx-platform …
arafay993 May 22, 2021
4c43abe
Merge branch 'gs/koa.master' of https://bitbucket.org/ntuclink/lhubml…
arafay993 May 24, 2021
895011e
Resolved issue: Non logged in user can not access site
arafay993 May 24, 2021
ebbad76
LMA-364: Console-Error handled
May 25, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion cms/envs/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@
# in sync with the ones in lms/envs/common.py
'ENABLE_DISCUSSION_SERVICE': True,
'ENABLE_TEXTBOOK': True,
'IS_NOTE_TAB_ENABLED': True,

# When True, all courses will be active, regardless of start date
# DO NOT SET TO True IN THIS FILE
Expand Down Expand Up @@ -273,7 +274,7 @@
'ALLOW_COURSE_RERUNS': True,

# Certificates Web/HTML Views
'CERTIFICATES_HTML_VIEW': False,
'CERTIFICATES_HTML_VIEW': True,

# Teams feature
'ENABLE_TEAMS': True,
Expand Down Expand Up @@ -1516,6 +1517,15 @@
'openedx.core.djangoapps.content.learning_sequences.apps.LearningSequencesConfig',

'ratelimitbackend',

#banner related
'lms.djangoapps.banner.apps.BannerConfig',

#Note
'lms.djangoapps.note.apps.NoteApiConfig',

# course_block_user related
'lms.djangoapps.course_block_user.apps.CourseBlockUserConfig'
]


Expand Down
1 change: 1 addition & 0 deletions cms/envs/production.py
Original file line number Diff line number Diff line change
Expand Up @@ -575,3 +575,4 @@ def get_env_setting(setting):
LOGO_URL_PNG = ENV_TOKENS.get('LOGO_URL_PNG', LOGO_URL_PNG)
LOGO_TRADEMARK_URL = ENV_TOKENS.get('LOGO_TRADEMARK_URL', LOGO_TRADEMARK_URL)
FAVICON_URL = ENV_TOKENS.get('FAVICON_URL', FAVICON_URL)

6 changes: 3 additions & 3 deletions cms/static/js/views/settings/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,12 @@ define(['js/views/validation', 'codemirror', 'underscore', 'jquery', 'jquery.ui'
//Disable course sale type if already exist or not indexed in discovery
if (this.model.get('indexed_in_discovery') && this.model.get('course_sale_type') === null) {
this.$el.find('#course-course-sale-type').prop("disabled", false)
this.$el.find('#course-course-price').prop("disabled", false)
}
else {
this.$el.find('#course-course-sale-type').prop("disabled", true)
this.$el.find('#course-course-price').prop("disabled", false)
}
//Disable course price
this.$el.find('#course-course-price').prop("disabled", true)
},

render: function () {
Expand Down Expand Up @@ -403,7 +403,7 @@ define(['js/views/validation', 'codemirror', 'underscore', 'jquery', 'jquery.ui'
this.$el.find('#course-course-price').prop("disabled", true)
}
else {
this.$el.find('#course-course-price').prop("disabled", false)
this.$el.find('#course-course-price').prop("disabled", true)
}
},
updateModel: function (event) {
Expand Down
8 changes: 8 additions & 0 deletions common/djangoapps/course_modes/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@

@python_2_unicode_compatible
class CourseMode(models.Model):

@property
def get_price_string(self):
if self.min_price > 0:
price_string = self.min_price
return "%.2f" % price_string
return "%.2f" % 0.0

"""
We would like to offer a course in a variety of modes.

Expand Down
4 changes: 4 additions & 0 deletions common/djangoapps/feedback/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,8 @@ class Meta:
fields=['user_id', 'course_id'],
)
]
@classmethod
def is_reviewed(cls, user=None, course_id=None):
reviews = cls.objects.filter(user_id=user, course_id=course_id)
return True if reviews else False

5 changes: 3 additions & 2 deletions common/djangoapps/student/views/management.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
from common.djangoapps.util.db import outer_atomic
from common.djangoapps.util.json_request import JsonResponse
from xmodule.modulestore.django import modulestore

from lms.djangoapps.banner.models import Banner
log = logging.getLogger("edx.student")

AUDIT_LOG = logging.getLogger("audit")
Expand Down Expand Up @@ -185,7 +185,8 @@ def filter_courses(course):

# allow for theme override of the courses list
context['courses_list'] = theming_helpers.get_template_path('courses_list.html')

#fetch banner for courses to show in home page
context['banner_list'] = Banner.objects.filter(platform__in = ['WEB', 'BOTH'], enabled=True)
# Insert additional context for use in the template
context.update(extra_context)

Expand Down
1 change: 1 addition & 0 deletions lms/djangoapps/banner/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
default_app_config = 'lms.djangoapps.banner.BannerConfig'
6 changes: 6 additions & 0 deletions lms/djangoapps/banner/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.contrib import admin
from .models import Banner


# Register your models here.
admin.site.register(Banner)
Empty file.
35 changes: 35 additions & 0 deletions lms/djangoapps/banner/api/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""
Serializers for Banner
"""
from rest_framework import serializers
from lms.djangoapps.banner.models import Banner
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from logging import getLogger
log = getLogger(__name__)

class BannerSerializer(serializers.ModelSerializer):
"""
Serializer for BadgeClass model.
"""
course_over_view = serializers.SlugRelatedField(
read_only=True,
slug_field='display_name'
)
course_id = serializers.SerializerMethodField('course_id_')
banner_img_url = serializers.SerializerMethodField('banner_img_url_')

def course_id_(self, obj):
if obj.course_over_view.display_name and obj.course_over_view.display_number_with_default:
return str(CourseOverview.objects.filter(display_name = obj.course_over_view.display_name, display_number_with_default = obj.course_over_view.display_number_with_default).values_list('id', flat=True)[0])
else:
return None

def banner_img_url_(self, obj):
if obj:
return str(obj.banner_img_url_txt)
else:
return None

class Meta(object):
model = Banner
fields = ('course_id', 'course_over_view', 'enabled', 'platform', 'slide_position', 'created_by', 'banner_img_url')
14 changes: 14 additions & 0 deletions lms/djangoapps/banner/api/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""
URLs for banner API
"""


from django.conf.urls import url

from .views import BannerApi
from . import views

urlpatterns = [
url('^details/$', BannerApi.as_view(), name='banner_api'),
url('^home/$', views.mobile_home_page, name='mobile_api'),
]
184 changes: 184 additions & 0 deletions lms/djangoapps/banner/api/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
"""
API views for banner
"""

from edx_rest_framework_extensions.auth.session.authentication import SessionAuthenticationAllowInactiveUser
from rest_framework.generics import ListAPIView
from rest_framework.exceptions import APIException, NotFound
from lms.djangoapps.banner.models import Banner
from openedx.core.lib.api.authentication import BearerAuthenticationAllowInactiveUser
from .serializers import BannerSerializer
from rest_framework import status
from openedx.core.lib.api.view_utils import DeveloperErrorViewMixin, view_auth_classes
from edx_rest_framework_extensions.auth.jwt.authentication import JwtAuthentication
from rest_framework.permissions import IsAuthenticated
from edx_rest_framework_extensions.paginators import NamespacedPageNumberPagination
from django.core.paginator import InvalidPage
from rest_framework.serializers import ValidationError
from rest_framework.status import HTTP_200_OK, HTTP_500_INTERNAL_SERVER_ERROR

from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response


class LazyPageNumberPagination(NamespacedPageNumberPagination):
"""
NamespacedPageNumberPagination that works with a LazySequence queryset.

The paginator cache uses ``@cached_property`` to cache the property values for
count and num_pages. It assumes these won't change, but in the case of a
LazySquence, its count gets updated as we move through it. This class clears
the cached property values before reporting results so they will be recalculated.

"""

def get_paginated_response(self, data):
# Clear the cached property values to recalculate the estimated count from the LazySequence
del self.page.paginator.__dict__['count']
del self.page.paginator.__dict__['num_pages']

# Paginate queryset function is using cached number of pages and sometime after
# deleting from cache when we recalculate number of pages are different and it raises
# EmptyPage error while accessing the previous page link. So we are catching that exception
# and raising 404. For more detail checkout PROD-1222
page_number = self.request.query_params.get(self.page_query_param, 1)
try:
self.page.paginator.validate_number(page_number)
except InvalidPage as exc:
msg = self.invalid_page_message.format(
page_number=page_number, message=str(exc)
)
self.page.number = self.page.paginator.num_pages
raise NotFound(msg)

return super(LazyPageNumberPagination, self).get_paginated_response(data)

@view_auth_classes(is_authenticated=True)
class BannerApi(DeveloperErrorViewMixin, ListAPIView):

class BannerApiPageNumberPagination(LazyPageNumberPagination):
max_page_size = 100

pagination_class = BannerApiPageNumberPagination
serializer_class = BannerSerializer
authentication_classes = (
BearerAuthenticationAllowInactiveUser,
SessionAuthenticationAllowInactiveUser,
JwtAuthentication,
)
permission_classes = (IsAuthenticated,)

# def get_queryset(self):
# """
# The query will return 1 to 10 images of banner, platform is both(mobile, web) or mobile alone as of now
# """
# queryset = Banner.objects.filter(platform__in=['MOBILE', 'BOTH'], enabled=True)
# return queryset
# # raise CustomAPIException("Invalid course ID.", status_code=status.HTTP_404_NOT_FOUND)

def get(self, request, format=None):
banners = Banner.objects.filter(platform__in=['MOBILE', 'BOTH'], enabled=True)
serializer = BannerSerializer(banners, many=True)
result = {"results":serializer.data}
pagination = {"next":None, "previous": None, "count": 1, "num_pages": 1 if len(serializer.data)<=100 else int(len(serializer.data)/100)}
x = Response({"message": "", "result": result, "pagination":pagination, "status": True, "status_code": 200})
if x and serializer.data:
return x
elif not serializer.data:
return Response({"message": "No data found", "result": result, "pagination":pagination, "status": True, "status_code": 200})
else:
return Response({"message": "Error", "result": result, "pagination":pagination, "status": False, "status_code": 400})


class CustomAPIException(ValidationError):
"""
raises API exceptions with custom messages and custom status codes
"""
status_code = status.HTTP_400_BAD_REQUEST
default_code = 'error'

def __init__(self, detail, status_code=None):
self.detail = detail
if status_code is not None:
self.status_code = status_code

"""
API views for Mobile Home page
"""


from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from openedx.core.lib.api.authentication import BearerAuthentication
from rest_framework.authentication import SessionAuthentication
import requests
from edx_rest_framework_extensions.auth.jwt.authentication import JwtAuthentication
from logging import getLogger
#from ..decorators import mobile_view
from lms.djangoapps.mobile_api.utils import API_V05, API_V1
logger = getLogger(__name__)

@api_view(['GET'])
@authentication_classes((BearerAuthentication, SessionAuthentication, JwtAuthentication))
@permission_classes([IsAuthenticated])
def mobile_home_page(request):
home_page_url = {}
base = request.get_host()
bearer_token_from_request = request.META.get('HTTP_AUTHORIZATION')

url_list = dict()
url_list["banner"] = '/api/banner/details/'
url_list["category"] = '/api/courses/v2/courses/categories/?page=1&page_size=1000'
url_list['recommended_courses'] = '/api/courses/v2/recommended/courses/?page=1&page_size=10'
url_list["most_popular"] = '/api/commerce/v2/courses/?platform_visibility=mobile&ordering=enrollments_count'
url_list["top_rated_courses"] = '/api/commerce/v2/courses/?platform_visibility=mobile&ordering=-ratings'
url_list["free_courses"] = '/api/commerce/v2/courses/?platform_visibility=mobile&sale_type=free'
headers = {
'Authorization': bearer_token_from_request
}
http = 'http://'
response_obj = {"message": "Authentication Failed ", "net_response_chunk": {}, "status": False, "status_code": 401}
error_flag = True
response_code_list = []
api_version = 'v1'
if api_version:
try:
for key, api_url in url_list.items():
actual_request = requests.get(http+base+api_url, headers=headers)
data = actual_request.json()
home_page_url[key] = data
response_code_list.append(data['status_code'])
except Exception as ex:
#dont' expose the specify error internal to system to outside API, Put it in generic manner
logger.error("Error while processing mobile home API - Exception as %s", ex)
response_obj = {"message": "ERROR", "net_response_chunk": {}, "status": False,
"status_code": 500}
error_flag = True
pass
response_final_codes = list(set(response_code_list))
#stream line 200, 202 and 500
if len(response_final_codes) == 1 and response_final_codes[0] == 200:
error_flag = False
elif len(response_final_codes) >= 2 and 200 in response_final_codes:
response_obj['status_code'] = status.HTTP_202_ACCEPTED
response_obj['status'] = True
response_obj['net_response_chunk'] = home_page_url if home_page_url else ""
response_obj['message'] = "partial success"
return Response(response_obj)
else:
error_flag = True

if not error_flag:
response_obj['status_code'] =status.HTTP_200_OK
response_obj['status'] = True
response_obj['net_response_chunk'] = home_page_url if home_page_url else ""
response_obj['message'] = ""
return Response(response_obj)
else:
return Response(response_obj)
else:
obj = {"message": "Wrong API version", "net_response_chunk": {}, "status": False, "status_code": 400}
return Response(obj)
13 changes: 13 additions & 0 deletions lms/djangoapps/banner/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"""
App Configuration
"""
from django.apps import AppConfig

class BannerConfig(AppConfig):
name = 'lms.djangoapps.banner'
verbose_name = 'banner'

def ready(self):
super().ready()
# noinspection PyUnresolvedReferences
import lms.djangoapps.banner.signals
33 changes: 33 additions & 0 deletions lms/djangoapps/banner/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 2.2.18 on 2021-04-20 06:55

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
('course_overviews', '0038_merge_20210405_0536'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='Banner',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('banner_img_url_txt', models.TextField(blank=True, default='')),
('banner_img', models.ImageField(upload_to='banner/lms/courses')),
('enabled', models.BooleanField(default=True)),
('platform', models.CharField(choices=[('mobile', 'MOBILE'), ('web', 'WEB'), ('both', 'BOTH')], max_length=10)),
('slide_position', models.IntegerField()),
('created_time', models.DateTimeField(auto_now_add=True)),
('updated_time', models.DateTimeField(auto_now=True)),
('course_over_view', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='course_over_view', to='course_overviews.CourseOverview')),
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]
Loading