{"id":20754361,"url":"https://github.com/venhance/otis-web","last_synced_at":"2025-04-05T10:08:33.421Z","repository":{"id":26298842,"uuid":"107870186","full_name":"vEnhance/otis-web","owner":"vEnhance","description":"OTIS course management system","archived":false,"fork":false,"pushed_at":"2025-03-22T20:10:31.000Z","size":6267,"stargazers_count":40,"open_issues_count":30,"forks_count":78,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-29T09:09:39.076Z","etag":null,"topics":["course-management-system","django","python3"],"latest_commit_sha":null,"homepage":"https://web.evanchen.cc/otis.html","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vEnhance.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-10-22T13:52:31.000Z","updated_at":"2025-03-24T01:44:37.000Z","dependencies_parsed_at":"2023-09-29T07:00:51.473Z","dependency_job_id":"fb6373ee-57d6-4b2c-9687-bf65795a2724","html_url":"https://github.com/vEnhance/otis-web","commit_stats":{"total_commits":3091,"total_committers":24,"mean_commits":"128.79166666666666","dds":0.0368812681979942,"last_synced_commit":"0e5cccb3973cb761f82b6ef306e7acd18ad307a7"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vEnhance%2Fotis-web","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vEnhance%2Fotis-web/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vEnhance%2Fotis-web/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vEnhance%2Fotis-web/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vEnhance","download_url":"https://codeload.github.com/vEnhance/otis-web/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247318744,"owners_count":20919484,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["course-management-system","django","python3"],"created_at":"2024-11-17T09:17:15.111Z","updated_at":"2025-04-05T10:08:33.399Z","avatar_url":"https://github.com/vEnhance.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[\u003cimg src=\"https://img.shields.io/github/languages/top/vEnhance/otis-web\" alt=\"Top languages\"\u003e](https://img.shields.io/github/languages/top/vEnhance/otis-web)\n[\u003cimg src=\"https://img.shields.io/github/license/vEnhance/otis-web\" alt=\"MIT License\"\u003e](https://github.com/vEnhance/otis-web/blob/main/LICENSE.txt)\n[\u003cimg src=\"https://img.shields.io/github/last-commit/vEnhance/otis-web\" alt=\"Last update\"\u003e](https://img.shields.io/github/last-commit/vEnhance/otis-web)\n\u003cimg src=\"https://img.shields.io/github/forks/vEnhance/otis-web\" alt=\"Forks\"\u003e\n\u003cimg src=\"https://img.shields.io/github/stars/vEnhance/otis-web\" alt=\"Stars\"\u003e\n[\u003cimg src=\"https://github.com/vEnhance/otis-web/actions/workflows/ci.yml/badge.svg\" alt=\"OTIS-WEB status\"\u003e](https://github.com/vEnhance/otis-web/actions)\n[\u003cimg src=\"https://github.com/vEnhance/otis-web/actions/workflows/codeql-analysis.yml/badge.svg\" alt=\"OTIS-WEB status\"\u003e](https://github.com/vEnhance/otis-web/actions)\n\n[\u003cimg src=\"https://img.shields.io/badge/html-djlint-blueviolet.svg\" alt=\"djlint\"\u003e](https://www.djlint.com)\n[\u003cimg src=\"https://img.shields.io/badge/python%20style-black-000000.svg\" alt=\"style: black\"\u003e](https://github.com/psf/black)\n[\u003cimg src=\"https://img.shields.io/badge/types-pyright-00cca7.svg\" alt=\"types: pyright\"\u003e](https://github.com/Microsoft/pyright)\n[\u003cimg src=\"https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\" alt=\"lint: ruff\"\u003e](https://github.com/astral-sh/ruff)\n[\u003cimg src=\"https://coveralls.io/repos/github/vEnhance/otis-web/badge.svg?branch=main\" alt=\"Coverage status\"\u003e](https://coveralls.io/github/vEnhance/otis-web?branch=main)\n\n# OTIS-WEB\n\nThese are the source files for the internal website\nthat I use to teach my course [OTIS](https://web.evanchen.cc/otis.html).\nIt is pretty standard Django, so you should be able to spin\nup a local server on a standard Unix environment.\n\n## Installation instructions\n\nVideo tutorial: https://youtu.be/W27XcqeXp20\n\n### Standard Linux environment\n\nIf you're just trying to get a local copy of the OTIS-WEB code\nand don't plan to submit any code back, then skip steps 0 and 4,\nand replace `YOUR_USERNAME` in step 2 with `vEnhance`.\n\n0. Create an account on GitHub if you haven't already, and\n   [fork the repository](https://docs.github.com/en/get-started/quickstart/fork-a-repo).\n1. Install the following standard tools: `python` (version 3.10), `pip`, `git`.\n   (For each tool, search \"[name of thing to install] [your OS]\" on the web.)\n2. Clone this repository using the command\n   `git clone https://github.com/YOUR_USERNAME/otis-web`.\n3. Run `git submodule update --init --recursive`\n   in order to pull the `evans_django_tools` submodule.\n4. Type `git checkout -b feature` to checkout a new branch named `feature`;\n   this will make your life a bit easier than working on `main`.\n   If you already know what feature you're trying to implement,\n   you can use that, e.g. `git checkout -b add-bunny-pictures`.\n5. [Install Poetry](https://python-poetry.org/docs/).\n   This enables you to use the `poetry` command;\n   verify this by checking `poetry --help` produces a help message.\n6. Once you have `poetry`, hit `poetry install`.\n   This will automatically create a\n   Python virtual environment and install stuff inside it.\n   (If you are an expert familiar with Python virtual environments\n   and want to use your own rather than Poetry's auto-created one,\n   then activate said environment before running `poetry install`.)\n\n   On some systems, `poetry install` could fail when trying to install\n   `mysqlclient`. You will have to separately install `pkg-config`\n   [mysql](https://github.com/PyMySQL/mysqlclient#install) in that case;\n   see that link for instructions, under the \"Install\" section.\n\n7. If it isn't already activated,\n   [activate the Python virtual environment][activate]\n   that was created in the previous step.\n   The easiest way to do so is to run `poetry shell`.\n\n   (_Note_: you have to do this step every time you start working on the\n   project. That is, always run `poetry shell` before doing any work, or\n   for experts, activate the virtual environment using your preferred method.)\n\n8. If everything is working, `python manage.py check` should\n   run with no errors.\n9. Run `python manage.py migrate` to create the local database.\n10. Run `python manage.py createsuperuser` to create an admin user.\n11. Run `python manage.py runserver`.\n    The command will spin up a continuously running server.\n12. Point your browser to `http://127.0.0.1:8000`.\n    You should be able to log in with the user you defined in step 9.\n13. The website is functional now, but it is a bit bare-bones.\n    To populate it with some test data, use `http://127.0.0.1:8000/admin`\n    or run `./fixtures/load-all.sh`.\n    - To log in with the dummy accounts in the fixtures, it's easiest to log in\n      with the superuser account and then use the hijack feature.\n\n[activate]: https://python-poetry.org/docs/basic-usage/#activating-the-virtual-environment\n\nOptional steps:\n\n- If you need to set up environment variables,\n  copy `env` to `.env` and uncomment the relevant lines.\n- If you want to test the Stripe stuff, a few more steps are needed.\n  Briefly: install the Stripe CLI.\n  Create some API keys and `stripe login`.\n  Add these API keys to `.env` (the three `STRIPE_*` variables).\n  Then run `stripe listen --forward-to localhost:8000/payments/webhook/`.\n\n[venv]: https://djangocentral.com/how-to-a-create-virtual-environment-for-python/\n\n### Using Docker\n\n0. Follow steps 0 - 3 from the above tutorial.\n1. Make sure to install [Docker](https://www.docker.com/) and make sure you\n   download a version compatible with your computer.\n2. Set up the 3 environment variables at the bottom of `env` by copying them to\n   `.env` and uncommenting them. Note that you should not have any spaces (it is\n   fine to leave the values as it is, but if you want to change anything, just\n   make sure there is no whitespace surrounding the `=`).\n3. Run `docker compose build`. Wait for it to finish.\n4. To start the server, run `docker compose up -d`. To execute a command inside\n   the container, run `docker exec -it otis-web /bin/bash`. To stop the server,\n   run `docker compose down`.\n5. Follow steps 11 - 12 from above.\n\nNote: You may need to delete db.sqlite3 if you're not getting desired results,\nas it serves as a cache. At this point, spinning up 2 separate containers with\nseparate data stores is not supported.\n\n## Feature requests or bug reports\n\nSubmit an [issue on GitHub](https://github.com/vEnhance/otis-web/issues).\n\n## Pull requests\n\nFor OTIS students: pull requests welcome!\nIf you think the website can be improved in some way, feel free to implement it.\nSee [contributing guidelines](CONTRIBUTING.md).\nIt's OK if you don't have much code experience; I'm willing to guide you along.\n\n`526561645265616452656164`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvenhance%2Fotis-web","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvenhance%2Fotis-web","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvenhance%2Fotis-web/lists"}