Open source backend for abakus.no, frontend located at webkom/lego-webapp
LEGO Er Ganske Oppdelt
LEGO requires python3.11, docker and uv. Services like Postgres, Redis, Thumbor and Minio run inside docker.
$ git clone git@github.com:webkom/lego.git && cd lego/
$ echo "from .development import *" > lego/settings/local.py
$ docker compose up -d
$ uv run python manage.py initialize_developmentuv run creates .venv on first use and re-syncs it against uv.lock, so there is nothing to install up front and nothing to activate.
$ docker compose up -d
$ uv run python manage.py runserver# Note 1: Whenever you switch branches you might need to make minor changes
$ uv run python manage.py migrate # If the branch has a database in another state than yours
# Note 2: When you make changes to models, or constants used by models, you need to create new migrations
$ uv run python manage.py makemigrations # Creates one or more new files that must be commited
# Remember to format generated migrations! (using e.g. `make fixme`)uv.lock conflicts
If you have updated dependencies it's likely you might get conflicts in the uv lock file. This solution should resolve most conflicts quite well:
$ git rebase origin/master
# If conflicts
$ git checkout --theirs uv.lock
$ uv lock
# The conflicts should be resolvedIf you get problems it can be a solution to delete the
.venv, and do a fresh setup
This codebase uses the PEP 8 code style. We enforce this with ruff. In addition to the standards outlined in PEP 8, we have a few guidelines (see pyproject.toml for more info):
Format the code with ruff
$ make fixmeTo check if it is formatted properly, run:
$ uv run --only-group lint ruff check lego
$ uv run --only-group lint ruff format --check legoTo check if it is typed properly, run:
$ uv run --group mypy --group prod mypy .If you want to run a specific test class you can run
$ ./manage.py test lego.apps.[APP]You can add flags to speed up the tests
By adding the
--keepdbthe next time it will go a lot faster to run the tests multiple times.
By adding the
--parallelwill run multiple tests in parallel using multiple cores.
If you want to check your test coverage, you can do the following
# Run all tests in LEGO. Remember to add the recommended flags mentioned above
$ uv run --group coverage coverage run --source=lego ./manage.py test
# If you now have multiple coverage files or a .coverage.* file, you'll have to combine it in order to output report
$ uv run --group coverage coverage combine
# Then you can output the full coverage report
$ uv run --group coverage coverage report
# or a small one that only contains the things you are interested in
$ uv run --group coverage coverage report | grep [some string]LEGO runs in Docker Swarm and deploys are managed by Drone and Ansible.
How to deploy:
- Make sure the changes are pushed to master and the test passes.
- Have you added some new settings in
settings/? If so, make sure theAnsible variablesreflects these changes. - We run migrations automatically, make sure they work!
- Push to the
buildbranch. From master:git push origin master:build - Wait for the
buildbuild to complete. The last step will bedocker build - Go to ci.webkom.dev and use the promote feature to deploy the staging/production build.
Ansible will automatically run the playbook for deploying the new build to staging or production based on the target selected in step 6.
Debugging
If you get an error while installing project dependencies, you might be missing some on your system.
$ apt-get install libpq-dev python3-devFor MACOS you need to
brew install postgresql
Exporting a survey as PDF needs pango, which weasyprint loads at runtime. On
MACOS install it with brew install pango. If it still fails to load, uv has
picked a python whose dylib path does not include homebrew's; rebuild the venv
against homebrew's interpreter:
$ rm -rf .venv && uv sync --python "$(brew --prefix)/bin/python3.11"If you get ld: library not found for -lssl
export LDFLAGS="-L/usr/local/opt/openssl/lib"
When changing the user fixtures one must load new fixtures
./manage.py load_fixtures --generate
An overview of the available users for development can be found in this PR