Compare commits
26 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab18396e89 | ||
|
|
ae4e3f20ac | ||
|
|
4fde7e355b | ||
|
|
1ff9c0bd77 | ||
|
|
3fe46bc278 | ||
|
|
cde10c2f97 | ||
|
|
97aed60b38 | ||
|
|
1465402bfa | ||
|
|
8540aef9b8 | ||
|
|
9d91f7499d | ||
|
|
3f0ff01105 | ||
|
|
e61f3cea5f | ||
|
|
0267ffde12 | ||
|
|
6e8bc34475 | ||
|
|
a61e09c11e | ||
|
|
e5fedc2d83 | ||
|
|
e52064fe64 | ||
|
|
75e64f5065 | ||
|
|
7d16414908 | ||
|
|
5515eda18b | ||
|
|
fdf73b62e3 | ||
|
|
f9fcbf26f4 | ||
|
|
dbf48674f9 | ||
|
|
28113792f3 | ||
|
|
7801778112 | ||
|
|
9671824e1f |
7
.github/workflows/auto-add-to-project.yml
vendored
7
.github/workflows/auto-add-to-project.yml
vendored
@ -1,9 +1,12 @@
|
|||||||
name: Auto Add Issues to Project
|
name: Auto Add Issues and Pull Requests to Project
|
||||||
|
|
||||||
on:
|
on:
|
||||||
issues:
|
issues:
|
||||||
types:
|
types:
|
||||||
- opened
|
- opened
|
||||||
|
pull_request_target:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# https://github.com/actions/add-to-project
|
# https://github.com/actions/add-to-project
|
||||||
@ -11,7 +14,7 @@ jobs:
|
|||||||
name: Add issue and bugs to project
|
name: Add issue and bugs to project
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/add-to-project@v0.5.0
|
- uses: actions/add-to-project@v1.0.2
|
||||||
with:
|
with:
|
||||||
project-url: https://github.com/orgs/overhangio/projects/4
|
project-url: https://github.com/orgs/overhangio/projects/4
|
||||||
github-token: ${{ secrets.GH_PROJECT_PERSONAL_ACCESS_TOKEN }}
|
github-token: ${{ secrets.GH_PROJECT_PERSONAL_ACCESS_TOKEN }}
|
||||||
|
|||||||
4
.github/workflows/sync.yml
vendored
4
.github/workflows/sync.yml
vendored
@ -2,13 +2,13 @@ name: Sync with private repo
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ master, main, nightly ]
|
branches: [ release, main ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
sync:
|
sync:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Add remote
|
- name: Add remote
|
||||||
|
|||||||
10
.github/workflows/test.yml
vendored
10
.github/workflows/test.yml
vendored
@ -2,22 +2,22 @@ name: Run tests
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [master]
|
branches: [ release, main ]
|
||||||
|
push:
|
||||||
|
branches: [ release, main ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ['3.8', '3.12']
|
python-version: ['3.9', '3.12']
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
- name: Upgrade pip
|
|
||||||
run: python -m pip install --upgrade pip setuptools
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
pip install .[dev]
|
pip install .[dev]
|
||||||
|
|||||||
21
.hatch_build.py
Normal file
21
.hatch_build.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# https://hatch.pypa.io/latest/how-to/config/dynamic-metadata/
|
||||||
|
|
||||||
|
import os
|
||||||
|
import typing as t
|
||||||
|
|
||||||
|
from hatchling.metadata.plugin.interface import MetadataHookInterface
|
||||||
|
|
||||||
|
HERE = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
|
||||||
|
class MetaDataHook(MetadataHookInterface):
|
||||||
|
def update(self, metadata: dict[str, t.Any]) -> None:
|
||||||
|
about = load_about()
|
||||||
|
metadata["version"] = about["__version__"]
|
||||||
|
|
||||||
|
|
||||||
|
def load_about() -> dict[str, str]:
|
||||||
|
about: dict[str, str] = {}
|
||||||
|
with open(os.path.join(HERE, "tutornotes", "__about__.py"), "rt", encoding="utf-8") as f:
|
||||||
|
exec(f.read(), about)
|
||||||
|
return about
|
||||||
35
CHANGELOG.md
35
CHANGELOG.md
@ -19,6 +19,41 @@ instructions, because git commits are used to generate release notes:
|
|||||||
|
|
||||||
<!-- scriv-insert-here -->
|
<!-- scriv-insert-here -->
|
||||||
|
|
||||||
|
<a id='changelog-20.0.0'></a>
|
||||||
|
## v20.0.0 (2025-06-05)
|
||||||
|
|
||||||
|
- 💥[Feature] Upgrade to Teak. (by @jfavellar90)
|
||||||
|
|
||||||
|
<a id='changelog-19.0.2'></a>
|
||||||
|
## v19.0.2 (2025-03-12)
|
||||||
|
|
||||||
|
- [Improvement] Add hatch_build.py in sdist target to fix the installation issues (by @dawoudsheraz)
|
||||||
|
|
||||||
|
<a id='changelog-19.0.1'></a>
|
||||||
|
## v19.0.1 (2025-03-11)
|
||||||
|
|
||||||
|
- [Bugfix] Fix broken feature in `dev` mode, where the frontend is reporting a CORS error on loading the notes. (by @regisb)
|
||||||
|
|
||||||
|
- [Improvement] Migrate from `setup.py` (setuptools) to `pyproject.toml` (hatch). (by @jfavellar90)
|
||||||
|
|
||||||
|
<a id='changelog-19.0.0'></a>
|
||||||
|
## v19.0.0 (2024-10-24)
|
||||||
|
|
||||||
|
- [Bugfix] Fix legacy warnings during Docker build. (by @regisb)
|
||||||
|
|
||||||
|
- 💥[Feature] Update Notes Image to use Ubuntu 24.04 as base OS. (by @jfavellar90)
|
||||||
|
|
||||||
|
- [Bugfix] Actually mount edx-notes-api repositories from host on `tutor mounts add /path/to/edx-notes-api`. (by @regisb)
|
||||||
|
- 💥[Feature] Replace Elasticsearch by Meilisearch. The implementation is much more compact and readable. All content will be automatically re-indexed during init. (by @regisb)
|
||||||
|
|
||||||
|
- 💥 [Deprecation] Drop support for python 3.8 and set Python 3.9 as the minimum supported python version. (by @DawoudSheraz)
|
||||||
|
|
||||||
|
- 💥[Improvement] Rename Tutor's two branches (by @DawoudSheraz):
|
||||||
|
* Rename **master** to **release**, as this branch runs the latest official Open edX release tag.
|
||||||
|
* Rename **nightly** to **main**, as this branch runs the Open edX master branches, which are the basis for the next Open edX release.
|
||||||
|
|
||||||
|
- 💥[Feature] Upgrade to Sumac. (by @jfavellar90)
|
||||||
|
|
||||||
<a id='changelog-18.0.0'></a>
|
<a id='changelog-18.0.0'></a>
|
||||||
## v18.0.0 (2024-05-09)
|
## v18.0.0 (2024-05-09)
|
||||||
|
|
||||||
|
|||||||
@ -1,2 +0,0 @@
|
|||||||
recursive-include tutornotes/patches *
|
|
||||||
recursive-include tutornotes/templates *
|
|
||||||
24
Makefile
24
Makefile
@ -1,22 +1,31 @@
|
|||||||
.DEFAULT_GOAL := help
|
.DEFAULT_GOAL := help
|
||||||
.PHONY: docs
|
.PHONY: docs
|
||||||
SRC_DIRS = ./tutornotes
|
SRC_DIRS = ./tutornotes
|
||||||
BLACK_OPTS = --exclude templates ${SRC_DIRS}
|
RUFF_OPTS = --exclude templates ${SRC_DIRS}
|
||||||
|
|
||||||
# Warning: These checks are run on every PR.
|
# Warning: These checks are run on every PR.
|
||||||
test: test-lint test-types test-format # Run some static checks.
|
test: test-lint test-types test-format test-pythonpackage
|
||||||
|
|
||||||
test-format: ## Run code formatting tests.
|
test-format: ## Run code formatting tests.
|
||||||
black --check --diff $(BLACK_OPTS)
|
ruff format --check --diff $(RUFF_OPTS)
|
||||||
|
|
||||||
test-lint: ## Run code linting tests
|
test-lint:
|
||||||
pylint --errors-only --enable=unused-import,unused-argument --ignore=templates --ignore=docs/_ext ${SRC_DIRS}
|
ruff check ${SRC_DIRS}
|
||||||
|
|
||||||
test-types: ## Run type checks.
|
test-types: ## Run type checks.
|
||||||
mypy --exclude=templates --ignore-missing-imports --implicit-reexport --strict ${SRC_DIRS}
|
mypy --exclude=templates --ignore-missing-imports --implicit-reexport --strict ${SRC_DIRS}
|
||||||
|
|
||||||
|
build-pythonpackage:
|
||||||
|
python -m build --sdist
|
||||||
|
|
||||||
|
test-pythonpackage: build-pythonpackage
|
||||||
|
twine check dist/tutor_notes-$(shell make version).tar.gz
|
||||||
|
|
||||||
format: ## Format code automatically.
|
format: ## Format code automatically.
|
||||||
black $(BLACK_OPTS)
|
ruff format $(RUFF_OPTS)
|
||||||
|
|
||||||
|
fix-lint: ## Fix linting issues automatically.
|
||||||
|
ruff check --fix $(RUFF_OPTS)
|
||||||
|
|
||||||
isort: ## Sort imports. This target is not mandatory because the output may be incompatible with black formatting. Provided for convenience purposes.
|
isort: ## Sort imports. This target is not mandatory because the output may be incompatible with black formatting. Provided for convenience purposes.
|
||||||
isort --skip=templates ${SRC_DIRS}
|
isort --skip=templates ${SRC_DIRS}
|
||||||
@ -27,6 +36,9 @@ changelog-entry: ## Create a new changelog entry.
|
|||||||
changelog: ## Collect changelog entries in the CHANGELOG.md file.
|
changelog: ## Collect changelog entries in the CHANGELOG.md file.
|
||||||
scriv collect
|
scriv collect
|
||||||
|
|
||||||
|
version: ## Print the current tutor-notes version
|
||||||
|
@python -c 'import io, os; about = {}; exec(io.open(os.path.join("tutornotes", "__about__.py"), "rt", encoding="utf-8").read(), about); print(about["__version__"])'
|
||||||
|
|
||||||
ESCAPE =
|
ESCAPE =
|
||||||
help: ## Print this help.
|
help: ## Print this help.
|
||||||
@grep -E '^([a-zA-Z_-]+:.*?## .*|######* .+)$$' Makefile \
|
@grep -E '^([a-zA-Z_-]+:.*?## .*|######* .+)$$' Makefile \
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
Students notes plugin for `Tutor <https://docs.tutor.edly.io>`_
|
Students notes plugin for `Tutor <https://docs.tutor.edly.io>`_
|
||||||
===================================================================
|
===================================================================
|
||||||
|
|
||||||
This is a plugin for `Tutor <https://docs.tutor.edly.io>`_ to easily add the `Open edX note-taking app <https://github.com/openedx/edx-notes-api>`_ to an Open edX platform. This app allows students to annotate portions of the courseware (see `the official documentation <https://edx.readthedocs.io/projects/open-edx-building-and-running-a-course/en/open-release-redwood.master/exercises_tools/notes.html>`_).
|
This is a plugin for `Tutor <https://docs.tutor.edly.io>`_ to easily add the `Open edX note-taking app <https://github.com/openedx/edx-notes-api>`_ to an Open edX platform. This app allows students to annotate portions of the courseware (see `the official documentation <https://docs.openedx.org/en/latest/educators/how-tos/course_development/exercise_tools/enable_notes.html>`_).
|
||||||
|
|
||||||
.. image:: https://edx.readthedocs.io/projects/open-edx-building-and-running-a-course/en/open-release-redwood.master/_images/SFD_SN_bodyexample.png
|
.. image:: https://docs.openedx.org/en/latest/_images/SFD_SN_bodyexample.png
|
||||||
:alt: Notes in action
|
:alt: Notes in action
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
@ -23,7 +23,7 @@ Then, to make migrations & tasks::
|
|||||||
|
|
||||||
You should beware that the ``notes.<LMS_HOST>`` domain name should exist and point to your server. For instance, if your LMS is hosted at http://myopenedx.com, the notes service should be found at http://notes.myopenedx.com.
|
You should beware that the ``notes.<LMS_HOST>`` domain name should exist and point to your server. For instance, if your LMS is hosted at http://myopenedx.com, the notes service should be found at http://notes.myopenedx.com.
|
||||||
|
|
||||||
If you would like to host the notes service at a different domain name, you can set the ``NOTES_HOST`` configuration variable (see below). When testing Tutor on a local computer, this will be automatically set to notes.local.edly.io.
|
If you would like to host the notes service at a different domain name, you can set the ``NOTES_HOST`` configuration variable (see below). When testing Tutor on a local computer, this will be automatically set to notes.local.openedx.io.
|
||||||
|
|
||||||
To enable student notes for a specific course, you should go to the course advanced settings in the studio, and set "Enable Student Notes" to "true". Then, hit "save changes".
|
To enable student notes for a specific course, you should go to the course advanced settings in the studio, and set "Enable Student Notes" to "true". Then, hit "save changes".
|
||||||
|
|
||||||
@ -59,4 +59,4 @@ This Tutor plugin is maintained by Jhony Avella from `eduNEXT <https://www.edune
|
|||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
|
|
||||||
This software is licensed under the terms of the `GNU Affero General Public License (AGPL) <https://github.com/overhangio/tutor-notes/blob/master/LICENSE.txt>`_.
|
This software is licensed under the terms of the `GNU Affero General Public License (AGPL) <https://github.com/overhangio/tutor-notes/blob/release/LICENSE.txt>`_.
|
||||||
|
|||||||
@ -0,0 +1,2 @@
|
|||||||
|
- [Improvement] Migrate from pylint and black to ruff. (by @dawoudsheraz)
|
||||||
|
- [Improvement] Test python package distribution build when running make-test. (by @dawoudsheraz)
|
||||||
@ -1,2 +1,87 @@
|
|||||||
|
# https://packaging.python.org/en/latest/tutorials/packaging-projects/
|
||||||
|
# https://hatch.pypa.io/latest/config/build/
|
||||||
|
|
||||||
|
[project]
|
||||||
|
name = "tutor-notes"
|
||||||
|
description = "A Tutor plugin for student notes"
|
||||||
|
authors = [
|
||||||
|
{ name = "Edly" },
|
||||||
|
{ email = "hello@edly.io"},
|
||||||
|
]
|
||||||
|
maintainers = [
|
||||||
|
{ name = "Jhony Avella" },
|
||||||
|
{ email = "jhony.avella@edunext.co" },
|
||||||
|
]
|
||||||
|
license = {text = "AGPL-3.0-only"}
|
||||||
|
readme = {file = "README.rst", content-type = "text/x-rst"}
|
||||||
|
requires-python = ">=3.9"
|
||||||
|
classifiers = [
|
||||||
|
"Development Status :: 5 - Production/Stable",
|
||||||
|
"Intended Audience :: Developers",
|
||||||
|
"License :: OSI Approved :: GNU Affero General Public License v3",
|
||||||
|
"Operating System :: OS Independent",
|
||||||
|
"Programming Language :: Python",
|
||||||
|
"Programming Language :: Python :: 3.9",
|
||||||
|
"Programming Language :: Python :: 3.10",
|
||||||
|
"Programming Language :: Python :: 3.11",
|
||||||
|
"Programming Language :: Python :: 3.12",
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
"tutor>=20.0.0,<21.0.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
# These fields will be set by hatch_build.py
|
||||||
|
dynamic = ["version"]
|
||||||
|
|
||||||
|
[project.optional-dependencies]
|
||||||
|
dev = [
|
||||||
|
"tutor[dev]>=20.0.0,<21.0.0",
|
||||||
|
"ruff"
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# https://packaging.python.org/en/latest/specifications/well-known-project-urls/#well-known-labels
|
||||||
|
[project.urls]
|
||||||
|
Homepage = "https://docs.tutor.edly.io/"
|
||||||
|
Documentation = "https://github.com/overhangio/tutor-notes#readme"
|
||||||
|
Issues = "https://github.com/overhangio/tutor-notes/issues"
|
||||||
|
Source = "https://github.com/overhangio/tutor-notes"
|
||||||
|
Changelog = "https://github.com/overhangio/tutor-notes/blob/release/CHANGELOG.md"
|
||||||
|
Community = "https://discuss.openedx.org/tag/tutor"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["setuptools", "wheel"]
|
requires = ["hatchling"]
|
||||||
|
build-backend = "hatchling.build"
|
||||||
|
|
||||||
|
# hatch-specific configuration
|
||||||
|
[tool.hatch.metadata.hooks.custom]
|
||||||
|
path = ".hatch_build.py"
|
||||||
|
|
||||||
|
[tool.hatch.build.targets.wheel]
|
||||||
|
packages = ["tutornotes"]
|
||||||
|
|
||||||
|
[tool.hatch.build.targets.sdist]
|
||||||
|
# Disable strict naming, otherwise twine is not able to detect name/version
|
||||||
|
strict-naming = false
|
||||||
|
include = [ "/tutornotes", ".hatch_build.py"]
|
||||||
|
exclude = ["tests*"]
|
||||||
|
|
||||||
|
[project.entry-points."tutor.plugin.v1"]
|
||||||
|
notes = "tutornotes.plugin"
|
||||||
|
|
||||||
|
[tool.ruff]
|
||||||
|
exclude = ["templates", "docs/_ext"]
|
||||||
|
|
||||||
|
[tool.ruff.lint]
|
||||||
|
# E: pycodestyle errors
|
||||||
|
# I: isort
|
||||||
|
# N: pep8-naming
|
||||||
|
select = ["E", "I", "N"]
|
||||||
|
|
||||||
|
# F401: unused-import
|
||||||
|
# F841: unused-variable
|
||||||
|
# W292: missing-newline-at-end-of-file
|
||||||
|
extend-select = ["F401", "F841", "W292"]
|
||||||
|
|
||||||
|
[tool.ruff.format]
|
||||||
|
# Default config is automatically taken from https://docs.astral.sh/ruff/configuration/
|
||||||
|
|||||||
50
setup.py
50
setup.py
@ -1,50 +0,0 @@
|
|||||||
import io
|
|
||||||
import os
|
|
||||||
from setuptools import setup, find_packages
|
|
||||||
|
|
||||||
here = os.path.abspath(os.path.dirname(__file__))
|
|
||||||
|
|
||||||
with io.open(os.path.join(here, "README.rst"), "rt", encoding="utf8") as f:
|
|
||||||
readme = f.read()
|
|
||||||
|
|
||||||
about = {}
|
|
||||||
with io.open(
|
|
||||||
os.path.join(here, "tutornotes", "__about__.py"), "rt", encoding="utf-8"
|
|
||||||
) as f:
|
|
||||||
exec(f.read(), about)
|
|
||||||
|
|
||||||
setup(
|
|
||||||
name="tutor-notes",
|
|
||||||
version=about["__version__"],
|
|
||||||
url="https://docs.tutor.edly.io/",
|
|
||||||
project_urls={
|
|
||||||
"Documentation": "https://docs.tutor.edly.io/",
|
|
||||||
"Code": "https://github.com/overhangio/tutor-notes",
|
|
||||||
"Issue tracker": "https://github.com/overhangio/tutor-notes/issues",
|
|
||||||
"Community": "https://discuss.openedx.org",
|
|
||||||
},
|
|
||||||
license="AGPLv3",
|
|
||||||
author="Overhang.IO",
|
|
||||||
author_email="contact@overhang.io",
|
|
||||||
maintainer="eduNEXT",
|
|
||||||
description="A Tutor plugin for student notes",
|
|
||||||
long_description=readme,
|
|
||||||
packages=find_packages(exclude=["tests*"]),
|
|
||||||
include_package_data=True,
|
|
||||||
python_requires=">=3.8",
|
|
||||||
install_requires=["tutor>=18.0.0,<19.0.0"],
|
|
||||||
extras_require={"dev": ["tutor[dev]>=18.0.0,<19.0.0"]},
|
|
||||||
entry_points={"tutor.plugin.v1": ["notes = tutornotes.plugin"]},
|
|
||||||
classifiers=[
|
|
||||||
"Development Status :: 5 - Production/Stable",
|
|
||||||
"Intended Audience :: Developers",
|
|
||||||
"License :: OSI Approved :: GNU Affero General Public License v3",
|
|
||||||
"Operating System :: OS Independent",
|
|
||||||
"Programming Language :: Python",
|
|
||||||
"Programming Language :: Python :: 3.8",
|
|
||||||
"Programming Language :: Python :: 3.9",
|
|
||||||
"Programming Language :: Python :: 3.10",
|
|
||||||
"Programming Language :: Python :: 3.11",
|
|
||||||
"Programming Language :: Python :: 3.12",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
@ -1 +1 @@
|
|||||||
__version__ = "18.0.0"
|
__version__ = "20.0.0"
|
||||||
|
|||||||
@ -15,8 +15,8 @@ spec:
|
|||||||
app.kubernetes.io/name: notes
|
app.kubernetes.io/name: notes
|
||||||
spec:
|
spec:
|
||||||
securityContext:
|
securityContext:
|
||||||
runAsUser: 1000
|
runAsUser: {{ APP_USER_ID }}
|
||||||
runAsGroup: 1000
|
runAsGroup: {{ APP_USER_ID }}
|
||||||
containers:
|
containers:
|
||||||
- name: notes
|
- name: notes
|
||||||
image: {{ NOTES_DOCKER_IMAGE }}
|
image: {{ NOTES_DOCKER_IMAGE }}
|
||||||
|
|||||||
@ -4,4 +4,7 @@ notes-job:
|
|||||||
DJANGO_SETTINGS_MODULE: notesserver.settings.tutor
|
DJANGO_SETTINGS_MODULE: notesserver.settings.tutor
|
||||||
volumes:
|
volumes:
|
||||||
- ../plugins/notes/apps/settings/tutor.py:/app/edx-notes-api/notesserver/settings/tutor.py:ro
|
- ../plugins/notes/apps/settings/tutor.py:/app/edx-notes-api/notesserver/settings/tutor.py:ro
|
||||||
|
{%- for mount in iter_mounts(MOUNTS, "notes") %}
|
||||||
|
- {{ mount }}
|
||||||
|
{%- endfor %}
|
||||||
depends_on: {{ [("mysql", RUN_MYSQL)]|list_if }}
|
depends_on: {{ [("mysql", RUN_MYSQL)]|list_if }}
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
setowner 1000 /mounts/notes
|
setowner {{ APP_USER_ID }} /mounts/notes
|
||||||
|
|||||||
@ -6,5 +6,8 @@ notes:
|
|||||||
volumes:
|
volumes:
|
||||||
- ../plugins/notes/apps/settings/tutor.py:/app/edx-notes-api/notesserver/settings/tutor.py:ro
|
- ../plugins/notes/apps/settings/tutor.py:/app/edx-notes-api/notesserver/settings/tutor.py:ro
|
||||||
- ../../data/notes:/app/data
|
- ../../data/notes:/app/data
|
||||||
|
{%- for mount in iter_mounts(MOUNTS, "notes") %}
|
||||||
|
- {{ mount }}
|
||||||
|
{%- endfor %}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
depends_on: {{ [("mysql", RUN_MYSQL)]|list_if }}
|
depends_on: {{ [("mysql", RUN_MYSQL)]|list_if }}
|
||||||
|
|||||||
@ -10,14 +10,14 @@ from tutor.__about__ import __version_suffix__
|
|||||||
|
|
||||||
from .__about__ import __version__
|
from .__about__ import __version__
|
||||||
|
|
||||||
# Handle version suffix in nightly mode, just like tutor core
|
# Handle version suffix in main mode, just like tutor core
|
||||||
if __version_suffix__:
|
if __version_suffix__:
|
||||||
__version__ += "-" + __version_suffix__
|
__version__ += "-" + __version_suffix__
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"VERSION": __version__,
|
"VERSION": __version__,
|
||||||
"DOCKER_IMAGE": "{{ DOCKER_REGISTRY }}overhangio/openedx-notes:{{ NOTES_VERSION }}",
|
"DOCKER_IMAGE": "{{ DOCKER_REGISTRY }}overhangio/openedx-notes:{{ NOTES_VERSION }}", # noqa: E501
|
||||||
"HOST": "notes.{{ LMS_HOST }}",
|
"HOST": "notes.{{ LMS_HOST }}",
|
||||||
"MYSQL_DATABASE": "notes",
|
"MYSQL_DATABASE": "notes",
|
||||||
"MYSQL_USERNAME": "notes",
|
"MYSQL_USERNAME": "notes",
|
||||||
|
|||||||
@ -4,13 +4,14 @@ SECRET_KEY = "{{ NOTES_SECRET_KEY }}"
|
|||||||
ALLOWED_HOSTS = [
|
ALLOWED_HOSTS = [
|
||||||
"notes",
|
"notes",
|
||||||
"{{ NOTES_HOST }}",
|
"{{ NOTES_HOST }}",
|
||||||
|
"{{ NOTES_HOST }}:8120",
|
||||||
]
|
]
|
||||||
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
"default": {
|
"default": {
|
||||||
"ENGINE": "django.db.backends.mysql",
|
"ENGINE": "django.db.backends.mysql",
|
||||||
"HOST": "{{ MYSQL_HOST }}",
|
"HOST": "{{ MYSQL_HOST }}",
|
||||||
"PORT": {{MYSQL_PORT}},
|
"PORT": {{ MYSQL_PORT }},
|
||||||
"NAME": "{{ NOTES_MYSQL_DATABASE }}",
|
"NAME": "{{ NOTES_MYSQL_DATABASE }}",
|
||||||
"USER": "{{ NOTES_MYSQL_USERNAME }}",
|
"USER": "{{ NOTES_MYSQL_USERNAME }}",
|
||||||
"PASSWORD": "{{ NOTES_MYSQL_PASSWORD }}",
|
"PASSWORD": "{{ NOTES_MYSQL_PASSWORD }}",
|
||||||
@ -23,11 +24,12 @@ DATABASES = {
|
|||||||
CLIENT_ID = "notes"
|
CLIENT_ID = "notes"
|
||||||
CLIENT_SECRET = "{{ NOTES_OAUTH2_SECRET }}"
|
CLIENT_SECRET = "{{ NOTES_OAUTH2_SECRET }}"
|
||||||
|
|
||||||
ELASTICSEARCH_DSL = {
|
# Meilisearch credentials
|
||||||
'default': {
|
ES_DISABLED = True
|
||||||
'hosts': '{{ ELASTICSEARCH_SCHEME }}://{{ ELASTICSEARCH_HOST }}:{{ ELASTICSEARCH_PORT }}'
|
MEILISEARCH_ENABLED = True
|
||||||
}
|
MEILISEARCH_URL = "{{ MEILISEARCH_URL }}"
|
||||||
}
|
MEILISEARCH_API_KEY = "{{ MEILISEARCH_API_KEY }}"
|
||||||
|
MEILISEARCH_INDEX = "{{ MEILISEARCH_INDEX_PREFIX }}student_notes"
|
||||||
|
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
|||||||
@ -1,24 +1,27 @@
|
|||||||
# syntax=docker/dockerfile:1.4
|
# syntax=docker/dockerfile:1
|
||||||
FROM docker.io/python:3.12-slim-bookworm
|
FROM docker.io/ubuntu:24.04
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
# Delete default UID=1000 `ubuntu` user to ensure we can use id 1000 for app user
|
||||||
|
RUN userdel -r ubuntu
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||||
apt update && \
|
apt update && \
|
||||||
apt upgrade -y && \
|
apt upgrade -y && \
|
||||||
apt install -y \
|
apt install -y \
|
||||||
locales \
|
language-pack-en \
|
||||||
git \
|
git \
|
||||||
python3-dev \
|
python3 \
|
||||||
build-essential \
|
python3-pip \
|
||||||
default-libmysqlclient-dev \
|
python3-venv \
|
||||||
pkg-config && \
|
libmysqlclient-dev \
|
||||||
sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
|
pkg-config
|
||||||
locale-gen
|
RUN ln -s /usr/bin/python3 /usr/bin/python
|
||||||
ENV LC_ALL en_US.UTF-8
|
|
||||||
|
|
||||||
###### Git-clone Notes repo ######
|
###### Git-clone Notes repo ######
|
||||||
ARG APP_USER_ID=1000
|
ARG APP_USER_ID={{ HOST_USER_ID }}
|
||||||
RUN useradd --home-dir /app --create-home --shell /bin/bash --uid ${APP_USER_ID} app
|
RUN useradd --home-dir /app --create-home --shell /bin/bash --uid ${APP_USER_ID} app
|
||||||
USER ${APP_USER_ID}
|
USER ${APP_USER_ID}
|
||||||
|
|
||||||
@ -27,12 +30,17 @@ WORKDIR /app/edx-notes-api
|
|||||||
|
|
||||||
###### Install python venv ######
|
###### Install python venv ######
|
||||||
RUN python -m venv /app/venv
|
RUN python -m venv /app/venv
|
||||||
ENV PATH /app/venv/bin:${PATH}
|
ENV PATH=/app/venv/bin:${PATH}
|
||||||
# https://pypi.org/project/setuptools/
|
# https://pypi.org/project/setuptools/
|
||||||
# https://pypi.org/project/pip/
|
# https://pypi.org/project/pip/
|
||||||
# https://pypi.org/project/wheel/
|
# https://pypi.org/project/wheel/
|
||||||
RUN --mount=type=cache,target=/app/.cache/pip,sharing=shared pip install setuptools==69.2.0 pip==24.0 wheel==0.43.0
|
RUN --mount=type=cache,target=/app/.cache/pip,sharing=shared pip install setuptools==78.1.0 pip==25.0.1 wheel==0.46.0
|
||||||
RUN --mount=type=cache,target=/app/.cache/pip,sharing=shared pip install -r requirements/base.txt
|
RUN --mount=type=cache,target=/app/.cache/pip,sharing=shared pip install -r requirements/base.txt
|
||||||
|
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
CMD gunicorn --workers=2 --name notes --bind=0.0.0.0:8000 --max-requests=1000 notesserver.wsgi:application
|
CMD ["gunicorn", \
|
||||||
|
"--workers=2", \
|
||||||
|
"--name", "notes", \
|
||||||
|
"--bind=0.0.0.0:8000", \
|
||||||
|
"--max-requests=1000", \
|
||||||
|
"notesserver.wsgi:application"]
|
||||||
|
|||||||
@ -1,2 +1,4 @@
|
|||||||
./manage.py migrate
|
./manage.py migrate
|
||||||
./manage.py search_index --rebuild -f
|
|
||||||
|
# Re-index with meilisearch
|
||||||
|
./manage.py shell -c "from notesapi.v1.views.meilisearch import reindex; reindex()"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user