Skip to content

Commit

Permalink
Merge pull request #9 from cookiecutter-openedx/mcdaniel_20230330
Browse files Browse the repository at this point in the history
prep for PyPi publication
  • Loading branch information
lpm0073 authored Mar 31, 2023
2 parents a3cd9ff + 85c137f commit 3522518
Show file tree
Hide file tree
Showing 82 changed files with 1,344 additions and 255 deletions.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ repos:
--report-level=warning,
]
- repo: https://github.com/codespell-project/codespell
rev: v2.2.2
rev: v2.2.4
hooks:
- id: codespell
files: \.(py|sh|rst|yml|yaml)$
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [0.1.3] (2022-3-30)

- add AGPLv3 license
- make xmodule imports backward compatible to nutmeg and earlier
- add __about__.py
- enhance setup.up setup() meta data
- bump classifier from alpha to beta
- refactor in order to make repo more condusive to uploading to PyPi
- version bumps to black, flake8 and their supporting plugins
- line entire code base for PEP 263 and B950 compliance
- setup pyproject.toml for PyPi publishing

## [0.1.2] (2022-3-29)

- add a module level IS_READY boolean to prevent ready() from running multiple times during init
Expand Down
671 changes: 671 additions & 0 deletions LICENSE.txt

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ tutor local run cms ./manage.py cms openedx_plugin_cms_init
* Set your Python interpreter to 3.8x
* install black: <https://pypi.org/project/black/>
* install flake8: <https://flake8.pycqa.org/en/latest/>
* pip install flake8-coding

```bash
# Run these from within your edx-platform virtual environment
Expand Down
27 changes: 27 additions & 0 deletions __about__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# coding=utf-8
import os

# Increment this version number to trigger a new release. See
# CHANGELOG.md for information on the versioning scheme.
__version__ = "0.1.3"

# The version suffix will be appended to the actual version, separated by a
# dash. Use this suffix to differentiate between the actual released version and
# the versions from other branches. For instance: set the suffix to "nightly" in
# the nightly branch.
# The suffix is cleanly separated from the __version__ in this module to avoid
# conflicts when merging branches.
__version_suffix__ = ""

# The app name will be used to define the name of the default plugin root and
# plugin directory. To avoid conflicts between multiple locally-installed
# versions, if it is defined the version suffix will also be appended to the app
# name.
__app__ = os.environ.get("OPENEDX_PLUGIN_EXAMPLE", "example-plugin")

# Package version, as installed by pip, does not include the version suffix.
__package_version__ = __version__

if __version_suffix__:
__version__ += "-" + __version_suffix__
__app__ += "-" + __version_suffix__
1 change: 1 addition & 0 deletions openedx_plugin/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
# coding=utf-8
default_app_config = "openedx_plugin.apps.CustomPluginConfig"
1 change: 1 addition & 0 deletions openedx_plugin/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding=utf-8
"""
written by: Lawrence McDaniel
https://lawrencemcdaniel.com
Expand Down
1 change: 1 addition & 0 deletions openedx_plugin/api/serializers.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding=utf-8
"""
written by: Lawrence McDaniel
https://lawrencemcdaniel.com
Expand Down
1 change: 1 addition & 0 deletions openedx_plugin/api/urls.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding=utf-8
"""
written by: Lawrence McDaniel
https://lawrencemcdaniel.com
Expand Down
1 change: 1 addition & 0 deletions openedx_plugin/api/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding=utf-8
"""
written by: Lawrence McDaniel
https://lawrencemcdaniel.com
Expand Down
11 changes: 8 additions & 3 deletions openedx_plugin/apps.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding=utf-8
"""
written by: Lawrence McDaniel
https://lawrencemcdaniel.com
Expand All @@ -13,7 +14,11 @@

# see: https://github.com/openedx/edx-django-utils/blob/master/edx_django_utils/plugins/
from edx_django_utils.plugins import PluginSettings, PluginURLs
from openedx.core.djangoapps.plugins.constants import ProjectType, SettingsType, PluginSignals
from openedx.core.djangoapps.plugins.constants import (
ProjectType,
SettingsType,
PluginSignals,
)


# Signals (aka receivers) defined in https://github.com/openedx/openedx-events/blob/main/openedx_events/learning/signals.py
Expand Down Expand Up @@ -49,7 +54,6 @@


class CustomPluginConfig(AppConfig):

name = "openedx_plugin"
label = "openedx_plugin"

Expand Down Expand Up @@ -142,7 +146,8 @@ def ready(self):
log.info("{label} {version} is ready.".format(label=self.label, version=__version__))
log.info(
"{label} found the following Django signals: {signals}".format(
label=self.label, signals=json.dumps(OPENEDX_SIGNALS, cls=PluginJSONEncoder, indent=4)
label=self.label,
signals=json.dumps(OPENEDX_SIGNALS, cls=PluginJSONEncoder, indent=4),
)
)
waffle_init()
Expand Down
35 changes: 17 additions & 18 deletions openedx_plugin/dashboard/utils.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding=utf-8
"""
written by: Lawrence McDaniel
https://lawrencemcdaniel.com
Expand Down Expand Up @@ -38,24 +39,22 @@ def set_language_preference(request):
language_param = request.GET.get("language")
if language_param:
log.info(
"set_language_preference() found language url param of {language_param} in the request object".format(
language_param=language_param
)
"set_language_preference() found language url param of "
" {language_param} in the request object".format(language_param=language_param)
)

preferred_language = get_user_preference(request.user, LANGUAGE_KEY)
if preferred_language:
log.info(
"set_language_preference() found an existing saved language preference for user {username} of {preferred_language}. Ignoring url param.".format(
username=request.user.username, preferred_language=preferred_language
)
"set_language_preference() found an existing saved language "
" preference for user {username} of {preferred_language}. "
" Ignoring url param.".format(username=request.user.username, preferred_language=preferred_language)
)
return None
else:
log.info(
"set_language_preference() no language preference set for user {username}".format(
username=request.user.username
)
"set_language_preference() no language preference set for user "
" {username}".format(username=request.user.username)
)

languages = released_languages()
Expand All @@ -68,34 +67,34 @@ def set_language_preference(request):
log.info("set_language_preference() no available language, exiting.")
return None
log.info(
"openedx_plugin.utils.set_language_preference() (2) detected language param={language_param}. closest installed={closest_lang}".format(
"openedx_plugin.utils.set_language_preference() (2) detected "
" language param={language_param}. closest installed={closest_lang}".format(
language_param=language_param, closest_lang=closest_lang
)
)
set_user_preference(request.user, LANGUAGE_KEY, closest_lang)
return None
else:
log.info(
"set_language_preference() no language param found in the request header for user {username}".format(
username=request.user.username
)
"set_language_preference() no language param found in the request "
" header for user {username}".format(username=request.user.username)
)

# 3.) try infer a language preference from the referring host
referer = urlparse(request.META.get("HTTP_REFERER", "Direct"))
referer_domain = referer.netloc
log.info(
"set_language_preference() analyzing http referer {referer} with domain {domain}".format(
referer=referer, domain=referer_domain
)
"set_language_preference() analyzing http referer {referer} with domain"
" {domain}".format(referer=referer, domain=referer_domain)
)
if referer_domain and referer_domain[:2].lower() == "mx":
closest_lang = get_closest_released_language("es_MX")
if not closest_lang:
log.info("set_language_preference() no available language, quiting.")
log.info("set_language_preference() no available language, quitting.")
return None
log.info(
"openedx_plugin.utils.set_language_preference() (3) detected referer_domain={referer_domain}. closest installed={closest_lang}".format(
"openedx_plugin.utils.set_language_preference() (3) detected "
" referer_domain={referer_domain}. closest installed={closest_lang}".format(
referer_domain=referer_domain, closest_lang=closest_lang
)
)
Expand Down
52 changes: 33 additions & 19 deletions openedx_plugin/dashboard/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding=utf-8
"""
Written by: Lawrence McDaniel
https://lawrencemcdaniel.com
Expand All @@ -9,19 +10,28 @@
- redirect the user elsewhere, like say, an onboarding page
- update user profile data
"""
# python stuff
import logging
from urllib.parse import urlparse

# django stuff
from django.shortcuts import redirect
from django.urls import reverse
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import ensure_csrf_cookie

# open edx stuff
from opaque_keys.edx.keys import CourseKey
from common.djangoapps.student.models import CourseEnrollment
from xmodule.modulestore.django import modulestore

try:
# for olive and later
from xmodule.modulestore.django import modulestore
except ImportError:
# for backward compatibility with nutmeg and earlier
from common.lib.xmodule.xmodule.modulestore.django import modulestore

# our stuff
from .utils import set_language_preference

log = logging.getLogger(__name__)
Expand Down Expand Up @@ -58,10 +68,13 @@ def student_dashboard(request):
)
)
else:
log.info("student_dashboard() - initiating after referal {referer}".format(referer=referer.netloc))
log.info("student_dashboard() - initiating after referral {referer}".format(referer=referer.netloc))

log.info(
"student_dashboard() - user {username} is accessing example via {platform}. Referer is {referer}. Received a language preference of {language_param} and a pre-enrollment course key of {enroll_in}".format(
"student_dashboard() - user {username} is accessing example via "
" {platform}. Referer is {referer}. Received a language "
" preference of {language_param} and a pre-enrollment course"
" key of {enroll_in}".format(
username=username,
platform=platform,
referer=referer.netloc,
Expand All @@ -85,31 +98,30 @@ def student_dashboard(request):

try:
course_key = CourseKey.from_string(enroll_in)
except Exception:
except Exception: # noqa: B902
log.warning(
"student_dashboard() received an invalid CourseKey string in the enroll url param. Ignoring. value was: {enroll_in}".format(
enroll_in=enroll_in
)
"student_dashboard() received an invalid CourseKey string in "
" the enroll url param. Ignoring. value was: "
" {enroll_in}".format(enroll_in=enroll_in)
)

if course_key:
try:
course = modulestore().get_course(course_key)
except Exception as e:
except Exception as e: # noqa: B902
log.warning(
"student_dashboard() encountered a handled exception while attempting to initialize course object for course key {enroll_in}. Exception: {e}".format(
enroll_in=enroll_in, e=e
)
"student_dashboard() encountered a handled exception "
" while attempting to initialize course object for "
" course key {enroll_in}. Exception: {e}".format(enroll_in=enroll_in, e=e)
)

try:
if not CourseEnrollment.is_enrolled(request.user, course_key=course_key):
CourseEnrollment.enroll(request.user, course_key=course_key)
else:
log.info(
"student_dashboard() user {username} is already enrolled in course {enroll_in}.".format(
username=request.user.username, enroll_in=enroll_in
)
"student_dashboard() user {username} is already enrolled in"
" course {enroll_in}.".format(username=request.user.username, enroll_in=enroll_in)
)

if course.has_started():
Expand All @@ -121,14 +133,16 @@ def student_dashboard(request):
)
else:
log.info(
"student_dashboard() course {enroll_in} has not yet started. Redirecting the user to their dashboard.".format(
enroll_in=enroll_in
)
"student_dashboard() course {enroll_in} has not yet "
" started. Redirecting the user to their "
" dashboard.".format(enroll_in=enroll_in)
)

except Exception as e:
except Exception as e: # noqa: B902
log.warning(
"student_dashboard() encountered a handled exception while attempting to enroll user {username} in the course {enroll_in}. Exception: {e}".format(
"student_dashboard() encountered a handled exception while "
" attempting to enroll user {username} in the course "
" {enroll_in}. Exception: {e}".format(
username=request.user.username, enroll_in=enroll_in, e=e
)
)
Expand Down
18 changes: 11 additions & 7 deletions openedx_plugin/locale/utils.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding=utf-8
"""
Lawrence McDaniel - https://lawrencemcdaniel.com
Feb-2022
Expand All @@ -20,7 +21,7 @@
def get_marketing_site(request):
"""
Returns the url to the marketing site for the user
based on informatin that can be gleaned from the request object.
based on information that can be gleaned from the request object.
First, determine the best possible language code for the user
taking into account all available information and meta data we have about the user.
Expand All @@ -44,18 +45,19 @@ def language_from_request(request):
"""
preferred_language = None

# 1.) try to get the Open edX language setting chosen explicitely by the user
# 1.) try to get the Open edX language setting chosen explicitly by the user
# using the language drop-down in the LMS site header.
try:
if request.user and request.user.is_authenticated:
preferred_language = get_user_preference(request.user, LANGUAGE_KEY)
log.info(
"language_from_request() found an existing language preference of {preferred_language} for username {username}".format(
"language_from_request() found an existing language preference "
" of {preferred_language} for username {username}".format(
preferred_language=preferred_language,
username=request.user.username,
)
)
except Exception:
except Exception: # noqa: B902
# is the user is not authenticated or if the user is logging out
# then this is prone to raising an exception.
pass
Expand All @@ -69,7 +71,9 @@ def language_from_request(request):
# if necessary, reduce the language setting to the most closely installed language
closest_released_language = get_closest_released_language(preferred_language)
log.info(
"language_from_request() found language param of {preferred_language} in the request params. Closest released language is {closest_released_language}".format(
"language_from_request() found language param of "
" {preferred_language} in the request params. Closest released "
" language is {closest_released_language}".format(
preferred_language=preferred_language,
closest_released_language=closest_released_language,
)
Expand All @@ -82,7 +86,7 @@ def language_from_request(request):
try:
if request.LANGUAGE_CODE:
return request.LANGUAGE_CODE
except Exception:
except Exception: # noqa: B902
pass

# 4.) Try to grab the Django-assigned default language code, if its assigned.
Expand All @@ -91,7 +95,7 @@ def language_from_request(request):
# the Django default language
if request.LANGUAGE:
return request.LANGUAGE
except Exception:
except Exception: # noqa: B902
pass

# 5.) All possible methods failed, so use the system default of English.
Expand Down
1 change: 1 addition & 0 deletions openedx_plugin/locale/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding=utf-8
"""
Lawrence McDaniel - https://lawrencemcdaniel.com
Feb-2022
Expand Down
1 change: 1 addition & 0 deletions openedx_plugin/management/commands/openedx_plugin_init.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# coding=utf-8
from django.core.management.base import BaseCommand

from ...waffle import waffle_init
Expand Down
Loading

0 comments on commit 3522518

Please sign in to comment.