├── .env.example ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── dependabot.yml └── workflows │ ├── deploy.yml │ └── django.yml ├── .gitignore ├── .idea ├── .gitignore ├── dataSources.xml ├── discord.xml ├── icon.svg ├── inspectionProfiles │ ├── Project_Default.xml │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── rurusetto.iml └── vcs.xml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── code_of_conduct.md ├── function └── resize_image.py ├── requirements.txt ├── rurusetto-readme-logo.svg └── rurusetto ├── api ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ └── __init__.py ├── models.py ├── serializers.py ├── tests.py ├── urls.py └── views.py ├── custom_storages.py ├── manage.py ├── media ├── cover_pics │ └── 2768f90fe157d04d686eb6f81ef09794e0ec3f88f7bc42a9e6199cb788b20acc_8pyMWHH.png ├── default.css ├── default.jpeg ├── default.png ├── default_beatmap_cover.jpeg ├── default_beatmap_thumbnail.jpeg ├── default_cover.png ├── default_icon.png ├── default_logo.jpeg ├── default_recommend_beatmap_cover.png ├── default_wiki_cover.jpeg ├── editor │ └── peppy_20210804185739840077.jpeg ├── profile_pics │ ├── 1612258077_kDmnM9X.jpeg │ └── deadinside.png └── wiki_images │ ├── alternate-mod.png │ ├── autoplay-mod.png │ ├── autotouch-mod.png │ ├── barrel-roll-mod.png │ ├── challenge-mod.png │ ├── default_logo_20211009112953862588.jpeg │ ├── difficulty-adjust-mod.png │ ├── double-time-mod.png │ ├── easy-mod.png │ ├── experimental-mod.png │ ├── flashlight-mod.png │ ├── half-time-mod.png │ ├── hard-rock-mod.png │ ├── hidden-mod.png │ ├── hold-tiles-mod.png │ ├── holds-mod.png │ ├── mirror-mod.png │ ├── no-doubles-mod.png │ ├── no-fail-mod.png │ ├── no-sliders-mod.png │ ├── one-button-mod.png │ ├── random-mod.png │ ├── relax-mod.png │ ├── reverse-spin-mod.png │ ├── spin-mod.png │ ├── spin-tiles-mod.png │ ├── sudden-death-mod.png │ ├── triplets-mod.png │ └── untangle-mod.png ├── rurusetto ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── templates ├── 400.html ├── 403.html ├── 404.html └── 500.html ├── users ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── locale │ ├── en │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── es │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── fr │ │ └── LC_MESSAGES │ │ │ └── django.po │ └── th │ │ └── LC_MESSAGES │ │ └── django.po ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_profile_image.py │ ├── 0003_profile_about_me.py │ ├── 0004_auto_20210728_2047.py │ ├── 0005_alter_profile_cover.py │ ├── 0006_alter_profile_cover.py │ ├── 0007_auto_20210804_1904.py │ ├── 0008_profile_oauth_first_migrate.py │ ├── 0009_auto_20210807_0855.py │ ├── 0010_auto_20210807_0920.py │ ├── 0011_profile_osu_username.py │ ├── 0012_profile_osu_id.py │ ├── 0013_auto_20210807_1907.py │ ├── 0014_config_update_profile_every_login.py │ ├── 0015_alter_profile_osu_id.py │ ├── 0016_auto_20210811_0523.py │ ├── 0017_auto_20210811_1237.py │ ├── 0018_auto_20210811_1802.py │ ├── 0019_config_theme.py │ ├── 0020_alter_config_theme.py │ ├── 0021_config_subpage_index.py │ ├── 0022_alter_config_subpage_index.py │ ├── 0023_tag.py │ ├── 0024_profile_tag.py │ ├── 0025_alter_tag_description.py │ ├── 0026_alter_tag_description.py │ ├── 0027_auto_20210909_0102.py │ ├── 0028_alter_profile_support_message.py │ ├── 0029_config_hide_email.py │ ├── 0030_profile_cover_light.py │ ├── 0031_alter_profile_image.py │ ├── 0032_auto_20211011_0942.py │ ├── 0033_config_language.py │ ├── 0034_alter_config_language.py │ ├── 0035_alter_config_theme.py │ ├── 0036_alter_config_theme.py │ ├── 0037_alter_config_language.py │ ├── 0038_alter_config_language.py │ └── __init__.py ├── models.py ├── signals.py ├── static │ ├── css │ │ ├── hover.css │ │ ├── index.css │ │ └── login.css │ ├── img │ │ ├── 159201.jpeg │ │ ├── 243007.jpeg │ │ ├── 243010.jpeg │ │ ├── 243018.jpeg │ │ ├── 685481.jpeg │ │ ├── 701370.png │ │ ├── 714226.png │ │ ├── 748076.png │ │ ├── 918716.jpg │ │ ├── guest-profile.png │ │ ├── settings-cover-light.png │ │ └── settings-cover-night.jpeg │ └── logo │ │ ├── osu-logo-pink.png │ │ ├── osu-logo.png │ │ ├── rurusetto-logo-1x.png │ │ ├── rurusetto-logo-2x.png │ │ ├── rurusetto-logo-3x.png │ │ ├── rurusetto-logo-black-1x.png │ │ ├── rurusetto-logo-black-2x.png │ │ ├── rurusetto-logo-black-3x.png │ │ ├── rurusetto-logo-black.svg │ │ ├── rurusetto-logo-white-1x.png │ │ ├── rurusetto-logo-white-2x.png │ │ ├── rurusetto-logo-white-3x.png │ │ ├── rurusetto-logo-white.svg │ │ ├── rurusetto-logo-with-name-1x.png │ │ ├── rurusetto-logo-with-name-2x.png │ │ ├── rurusetto-logo-with-name-3x.png │ │ ├── rurusetto-logo-with-name.svg │ │ └── rurusetto-logo.svg ├── templates │ ├── account │ │ ├── login.html │ │ └── signup.html │ ├── socialaccount │ │ ├── authentication_error.html │ │ ├── connections.html │ │ ├── login.html │ │ ├── login_cancelled.html │ │ └── snippets │ │ │ └── provider_list.html │ └── users │ │ ├── delete_account.html │ │ ├── profile.html │ │ └── settings.html ├── tests.py └── views.py └── wiki ├── __init__.py ├── action.py ├── admin.py ├── apps.py ├── forms.py ├── function.py ├── locale ├── en │ └── LC_MESSAGES │ │ └── django.po ├── es │ └── LC_MESSAGES │ │ └── django.po ├── fr │ └── LC_MESSAGES │ │ └── django.po └── th │ └── LC_MESSAGES │ └── django.po ├── migrations ├── 0001_initial.py ├── 0002_auto_20210802_1807.py ├── 0003_ruleset.py ├── 0004_alter_ruleset_cover_image.py ├── 0005_auto_20210802_1843.py ├── 0006_ruleset_icon.py ├── 0007_alter_ruleset_last_edited_at.py ├── 0008_auto_20210802_2042.py ├── 0009_auto_20210802_2053.py ├── 0010_ruleset_verified.py ├── 0011_ruleset_slug.py ├── 0012_remove_ruleset_open_source.py ├── 0013_ruleset_logo.py ├── 0014_alter_ruleset_logo.py ├── 0015_alter_ruleset_content.py ├── 0016_auto_20210804_1904.py ├── 0017_alter_changelog_note.py ├── 0018_rename_github_link_ruleset_source.py ├── 0019_ruleset_created_at.py ├── 0020_ruleset_opengraph_image.py ├── 0021_customwiki.py ├── 0022_customwiki_title.py ├── 0023_subpage.py ├── 0024_alter_subpage_slug.py ├── 0025_alter_subpage_ruleset_id.py ├── 0026_subpage_creator.py ├── 0027_recommendbeatmap.py ├── 0028_recommendbeatmap_comment.py ├── 0029_recommendbeatmap_version.py ├── 0030_recommendbeatmap_beatmapset_id.py ├── 0031_recommendbeatmap_url.py ├── 0032_alter_recommendbeatmap_difficultyrating.py ├── 0033_recommendbeatmap_beatmap_thumbnail.py ├── 0034_auto_20210829_0904.py ├── 0035_ruleset_recommend_beatmap_cover.py ├── 0036_recommendbeatmap_owner_approved.py ├── 0037_recommendbeatmap_owner_seen.py ├── 0038_auto_20210921_1230.py ├── 0039_ruleset_github_download_filename.py ├── 0040_action.py ├── 0040_ruleset_dark_icon.py ├── 0041_auto_20211003_1906.py ├── 0041_auto_20211004_2347.py ├── 0042_alter_action_time_finish.py ├── 0043_merge_20211005_1701.py ├── 0044_rulesetstatus.py ├── 0045_alter_rulesetstatus_latest_update.py ├── 0046_auto_20211006_0457.py ├── 0047_ruleset_cover_image_light.py ├── 0048_ruleset_custom_css.py ├── 0049_alter_ruleset_custom_css.py ├── 0050_alter_ruleset_custom_css.py ├── 0051_auto_20211010_1416.py ├── 0052_alter_recommendbeatmap_comment.py ├── 0053_rulesetstatus_pre_release.py ├── 0054_ruleset_archive.py ├── 0055_ruleset_direct_download_link.py ├── 0056_ruleset_can_download.py ├── 0057_alter_ruleset_direct_download_link.py ├── 0058_recommendbeatmap_approved_date_and_more.py ├── 0059_ruleset_github_localisation_filename_and_more.py └── __init__.py ├── models.py ├── signals.py ├── static ├── css │ ├── index-with-form.css │ ├── progres-bar.css │ ├── styles.css │ └── wiki-page.css ├── favicon │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ └── site.webmanifest ├── img │ ├── 123252.png │ ├── 684477.png │ ├── 701370.png │ ├── 737403.png │ ├── 743487.jpeg │ ├── add-recommend-beatmap-cover-light.jpg │ ├── add-recommend-beatmap-cover-night.png │ ├── add-subpage-cover-light.png │ ├── add-subpage-cover-night.jpeg │ ├── archived-rulesets-cover-light.jpg │ ├── archived-rulesets-cover-light.png │ ├── archived-rulesets-cover-night.jpg │ ├── changelog-cover-light.png │ ├── changelog-cover-light2.jpeg │ ├── changelog-cover-light3.png │ ├── changelog-cover-night.jpeg │ ├── changelog-cover-night2.png │ ├── create-rulesets-cover-light.png │ ├── create-rulesets-cover-night.png │ ├── default-beatmap-background.png │ ├── default.jpeg │ ├── default.png │ ├── download-localization.png │ ├── download-rulesets-update.png │ ├── download-rulesets.png │ ├── edit-subpage-cover-light.jpg │ ├── edit-subpage-cover-light.png │ ├── edit-subpage-cover-night.png │ ├── edit-wiki-cover-light.png │ ├── edit-wiki-cover-night.jpeg │ ├── get-beatmap-id.png │ ├── home-cover-light.jpeg │ ├── home-cover-light2.png │ ├── home-cover-night.png │ ├── install-cover-light.png │ ├── install-cover-night.png │ ├── install-localization-cover-light.png │ ├── install-localization-cover-night.jpg │ ├── installing-localization.png │ ├── installing-rulesets.png │ ├── listing-cover-light.png │ ├── listing-cover-night.png │ ├── localization-complete.png │ ├── maintainer-cover-light.jpg │ ├── maintainer-cover-night.png │ ├── maintainer-cover-night2.png │ ├── open-osu-folder-update.png │ ├── open-osu-folder.png │ ├── rulesets-complete.png │ ├── status-cover-light.png │ └── status-cover-night.jpg └── js │ ├── custom.js │ ├── custom.min.js │ ├── player.js │ └── wiki.js ├── templates ├── __init__.py └── wiki │ ├── __init__.py │ ├── add_recommend_beatmap.html │ ├── add_subpage.html │ ├── archived_rulesets.html │ ├── base.html │ ├── changelog.html │ ├── create_ruleset.html │ ├── edit_ruleset_wiki.html │ ├── edit_subpage.html │ ├── home.html │ ├── install.html │ ├── listing.html │ ├── localisation_how_to.html │ ├── maintainer.html │ ├── recommend_beatmap.html │ ├── recommend_beatmap_approval.html │ ├── snippets │ ├── beatmap_approval_card.html │ ├── beatmap_card.html │ ├── beatmap_info_modal.html │ └── star_rating_color.html │ ├── status.html │ ├── subpage.html │ └── wiki_page.html ├── templatetags ├── __init__.py ├── constants.py ├── convert_file_size.py ├── convert_star_rating.py ├── get_genre_name.py ├── get_language_name.py ├── length_format.py ├── markdown_converter.py ├── round_up.py ├── settings_value.py └── thousand_seperator.py ├── tests.py ├── urls.py └── views.py /.env.example: -------------------------------------------------------------------------------- 1 | SECRET_KEY=secure_secret_key 2 | DEBUG=False 3 | TEST_SERVER=False 4 | ALLOWED_HOSTS=localhost 5 | OSU_OAUTH_CLIENT_ID= 6 | OSU_OAUTH_CLIENT_SECRET= 7 | OSU_API_V1_KEY= 8 | GITHUB_TOKEN= 9 | GA_TRACKING_ID= 10 | SENTRY_DSN= 11 | 12 | DATABASE_DEVELOPMENT=True 13 | DATABASE_TYPE= 14 | DATABASE_NAME= 15 | DATABASE_USER= 16 | DATABASE_PASSWORD= 17 | DATABASE_HOST= 18 | DATABASE_PORT= 19 | 20 | STATIC_LOCAL=True 21 | AWS_ACCESS_KEY_ID= 22 | AWS_SECRET_ACCESS_KEY= 23 | AWS_STORAGE_BUCKET_NAME= 24 | AWS_S3_ENDPOINT_URL= 25 | AWS_S3_CUSTOM_DOMAIN= -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Found a bug? Create a report to help us improve! 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Time you found the bug:** 11 | Please put the exactly date and time that you find this bug and put the timezone too. 12 | 13 | **Username or your profile page link:** 14 | If this bug relate to the account area, please put your username in the site or your profile link here. If you are not login please fill this as `Guest`. (If you are not comfortable to share your profile link publicly please send it to contact@rulesets.info) 15 | 16 | **Page or URL link of the previous page and the page that you found the bug:** 17 | URL of the previous and the page that the bug is occured 18 | 19 | **Describe the bug:** 20 | [] This bug lead to 500 server error. 21 | A clear and concise description of what the bug is here. 22 | 23 | **Reproduce:** 24 | Steps to reproduce the behavior 25 | 26 | **Expected behavior:** 27 | A clear and concise description of what you expected to happen. 28 | 29 | **Screenshots:** 30 | If applicable, add screenshots to help explain your problem. 31 | 32 | **Browser:** 33 | Browser that you are using to create this bug. 34 | 35 | **Desktop or Device:** 36 | What device are you using to found this bug? Please tell the device and its operating system! 37 | 38 | **Additional context:** 39 | Add any other context about the problem here. 40 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Got something you think should change or be added? Explain your idea to us! 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the new feature:** 11 | Have a new idea? Explain it here! 12 | 13 | **Proposal design of the feature:** 14 | Describe the design or the flow or the new feature 15 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "pip" 4 | directory: "/" 5 | open-pull-requests-limit: 10 6 | schedule: 7 | interval: "monthly" 8 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Changes to Server 2 | on: 3 | push: 4 | tags: 5 | - '*' 6 | 7 | jobs: 8 | build: 9 | name: Build 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Executing remote SSH commands 13 | uses: appleboy/ssh-action@master 14 | with: 15 | host: ${{ secrets.HOST }} 16 | username: ${{ secrets.USERNAME }} 17 | password: ${{ secrets.PASSWORD }} 18 | script: | 19 | cd rurusetto/rurusetto 20 | git pull 21 | source myprojectenv/bin/activate 22 | cd wiki 23 | django-admin compilemessages 24 | cd .. 25 | cd users 26 | django-admin compilemessages 27 | cd .. 28 | cd .. 29 | pip install --upgrade --force-reinstall -r requirements.txt 30 | cd rurusetto 31 | python manage.py migrate 32 | python manage.py collectstatic --noinput --clear 33 | echo ${{ secrets.PASSWORD }} | sudo -S -k systemctl restart gunicorn.socket gunicorn.service 34 | -------------------------------------------------------------------------------- /.github/workflows/django.yml: -------------------------------------------------------------------------------- 1 | name: Continuous Integration 2 | 3 | on: 4 | push: 5 | branches: [ new-website ] 6 | pull_request: 7 | branches: [ new-website ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | strategy: 14 | max-parallel: 4 15 | matrix: 16 | python-version: [3.11] 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Set up Python ${{ matrix.python-version }} 21 | uses: actions/setup-python@v2 22 | with: 23 | python-version: ${{ matrix.python-version }} 24 | - name: Install Dependencies 25 | run: | 26 | python -m pip install --upgrade pip 27 | pip install -r requirements.txt 28 | - name: Run Tests 29 | run: | 30 | cd rurusetto 31 | python manage.py migrate 32 | python manage.py test 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Python template 2 | # Byte-compiled / optimized / DLL files 3 | __pycache__/ 4 | *.py[cod] 5 | *$py.class 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | cover/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | db.sqlite3-journal 64 | 65 | # Flask stuff: 66 | instance/ 67 | .webassets-cache 68 | 69 | # Scrapy stuff: 70 | .scrapy 71 | 72 | # Sphinx documentation 73 | docs/_build/ 74 | 75 | # PyBuilder 76 | .pybuilder/ 77 | target/ 78 | 79 | # Jupyter Notebook 80 | .ipynb_checkpoints 81 | 82 | # IPython 83 | profile_default/ 84 | ipython_config.py 85 | 86 | # pyenv 87 | # For a library or package, you might want to ignore these files since the code is 88 | # intended to run in multiple environments; otherwise, check them in: 89 | # .python-version 90 | 91 | # pipenv 92 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 93 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 94 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 95 | # install all needed dependencies. 96 | #Pipfile.lock 97 | 98 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 99 | __pypackages__/ 100 | 101 | # Celery stuff 102 | celerybeat-schedule 103 | celerybeat.pid 104 | 105 | # SageMath parsed files 106 | *.sage.py 107 | 108 | # Environments 109 | .env 110 | .venv 111 | env/ 112 | venv/ 113 | ENV/ 114 | env.bak/ 115 | venv.bak/ 116 | 117 | # Spyder project settings 118 | .spyderproject 119 | .spyproject 120 | 121 | # Rope project settings 122 | .ropeproject 123 | 124 | # mkdocs documentation 125 | /site 126 | 127 | # mypy 128 | .mypy_cache/ 129 | .dmypy.json 130 | dmypy.json 131 | 132 | # Pyre type checker 133 | .pyre/ 134 | 135 | # pytype static type analyzer 136 | .pytype/ 137 | 138 | # Cython debug symbols 139 | cython_debug/ 140 | 141 | ### macOS template 142 | # General 143 | .DS_Store 144 | .AppleDouble 145 | .LSOverride 146 | 147 | # Icon must end with two \r 148 | Icon 149 | 150 | # Thumbnails 151 | ._* 152 | 153 | # Files that might appear in the root of a volume 154 | .DocumentRevisions-V100 155 | .fseventsd 156 | .Spotlight-V100 157 | .TemporaryItems 158 | .Trashes 159 | .VolumeIcon.icns 160 | .com.apple.timemachine.donotpresent 161 | 162 | # Directories potentially created on remote AFP share 163 | .AppleDB 164 | .AppleDesktop 165 | Network Trash Folder 166 | Temporary Items 167 | .apdisk 168 | 169 | *.pyc 170 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /.idea/dataSources.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | sqlite.xerial 6 | true 7 | org.sqlite.JDBC 8 | jdbc:sqlite:$PROJECT_DIR$/rurusetto/db.sqlite3 9 | $ProjectFileDir$ 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/discord.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/rurusetto.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 26 | 28 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Rūrusetto 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /function/resize_image.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | import os 3 | from os import listdir 4 | from os.path import isfile, join 5 | import pathlib 6 | 7 | # Code to resize image to make the website performance better. Just out this file in image folder and run. 8 | 9 | # Get current path to the current folder 10 | current_path = pathlib.Path().resolve() 11 | print(f"Current path : {current_path}") 12 | 13 | # Get a list of file in the folder 14 | picture_file_list = [f for f in listdir(current_path) if isfile(join(current_path, f))] 15 | # Remove its own 16 | # If you have more file that is not image just add it here. 17 | picture_file_list.remove("resize_image.py") 18 | print(f"Picture list to resize : {picture_file_list}") 19 | 20 | print() 21 | 22 | converted = 0 # Count the image that converted 23 | 24 | # Resize image process 25 | for image in picture_file_list: 26 | print(f"Start resize {image}") 27 | file_path = os.path.abspath(image) 28 | img = Image.open(file_path) 29 | print(f"Full path : {os.path.abspath(image)}") 30 | if img.height > 1080 or img.width > 1920: 31 | img.thumbnail((1920, 1080)) 32 | img.save(file_path) 33 | print(f"Saved converted picture to {file_path}") 34 | converted += 1 35 | 36 | print() 37 | print(f"Converted {converted} images!") -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Django~=4.2.7 2 | pillow~=10.0.1 3 | django-crispy-forms~=2.1 4 | Markdown~=3.4.3 5 | Unidecode~=1.3.6 6 | Pygments~=2.17.2 7 | django-mdeditor~=0.1.20 8 | requests~=2.31.0 9 | djangorestframework~=3.14.0 10 | git+https://github.com/Rurusetto/rurusetto-django-allauth.git 11 | django-colorfield~=0.10.1 12 | django-admin-interface~=0.26.0 13 | python-decouple~=3.8 14 | python-dateutil~=2.8.2 15 | boto3~=1.34.137 16 | django-storages~=1.13 17 | gunicorn~=21.2.0 18 | psycopg2-binary~=2.9.5 19 | sentry-sdk~=1.44.0 20 | ddtrace~=2.9.2 21 | setproctitle~=1.3.2 -------------------------------------------------------------------------------- /rurusetto/api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/api/__init__.py -------------------------------------------------------------------------------- /rurusetto/api/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /rurusetto/api/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ApiConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'api' 7 | -------------------------------------------------------------------------------- /rurusetto/api/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/api/migrations/__init__.py -------------------------------------------------------------------------------- /rurusetto/api/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /rurusetto/api/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /rurusetto/api/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | urlpatterns = [ 5 | path('rulesets', views.listing), 6 | path('rulesets/', views.ruleset_detail), 7 | path('rulesets//beatmaps', views.recommend_beatmap), 8 | path('rulesets//beatmaps/creator', views.recommend_beatmap_only_creator), 9 | path('rulesets//beatmaps/players', views.recommend_beatmap_other_players), 10 | path('subpage/', views.all_ruleset_subpage), 11 | path('subpage//', views.subpage), 12 | path('profile/', views.user), 13 | ] 14 | -------------------------------------------------------------------------------- /rurusetto/custom_storages.py: -------------------------------------------------------------------------------- 1 | from storages.backends.s3boto3 import S3Boto3Storage 2 | from decouple import config 3 | 4 | 5 | class StaticStorage(S3Boto3Storage): 6 | bucket_name = config('AWS_STORAGE_BUCKET_NAME', default="your-storage-bucket-name") 7 | location = 'static' 8 | 9 | 10 | class MediaStorage(S3Boto3Storage): 11 | bucket_name = config('AWS_STORAGE_BUCKET_NAME', default="your-storage-bucket-name") 12 | location = 'media' 13 | -------------------------------------------------------------------------------- /rurusetto/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rurusetto.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /rurusetto/media/cover_pics/2768f90fe157d04d686eb6f81ef09794e0ec3f88f7bc42a9e6199cb788b20acc_8pyMWHH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/cover_pics/2768f90fe157d04d686eb6f81ef09794e0ec3f88f7bc42a9e6199cb788b20acc_8pyMWHH.png -------------------------------------------------------------------------------- /rurusetto/media/default.css: -------------------------------------------------------------------------------- 1 | /*Nothing here*/ -------------------------------------------------------------------------------- /rurusetto/media/default.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/default.jpeg -------------------------------------------------------------------------------- /rurusetto/media/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/default.png -------------------------------------------------------------------------------- /rurusetto/media/default_beatmap_cover.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/default_beatmap_cover.jpeg -------------------------------------------------------------------------------- /rurusetto/media/default_beatmap_thumbnail.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/default_beatmap_thumbnail.jpeg -------------------------------------------------------------------------------- /rurusetto/media/default_cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/default_cover.png -------------------------------------------------------------------------------- /rurusetto/media/default_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/default_icon.png -------------------------------------------------------------------------------- /rurusetto/media/default_logo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/default_logo.jpeg -------------------------------------------------------------------------------- /rurusetto/media/default_recommend_beatmap_cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/default_recommend_beatmap_cover.png -------------------------------------------------------------------------------- /rurusetto/media/default_wiki_cover.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/default_wiki_cover.jpeg -------------------------------------------------------------------------------- /rurusetto/media/editor/peppy_20210804185739840077.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/editor/peppy_20210804185739840077.jpeg -------------------------------------------------------------------------------- /rurusetto/media/profile_pics/1612258077_kDmnM9X.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/profile_pics/1612258077_kDmnM9X.jpeg -------------------------------------------------------------------------------- /rurusetto/media/profile_pics/deadinside.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/profile_pics/deadinside.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/alternate-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/alternate-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/autoplay-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/autoplay-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/autotouch-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/autotouch-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/barrel-roll-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/barrel-roll-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/challenge-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/challenge-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/default_logo_20211009112953862588.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/default_logo_20211009112953862588.jpeg -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/difficulty-adjust-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/difficulty-adjust-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/double-time-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/double-time-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/easy-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/easy-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/experimental-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/experimental-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/flashlight-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/flashlight-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/half-time-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/half-time-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/hard-rock-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/hard-rock-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/hidden-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/hidden-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/hold-tiles-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/hold-tiles-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/holds-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/holds-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/mirror-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/mirror-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/no-doubles-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/no-doubles-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/no-fail-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/no-fail-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/no-sliders-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/no-sliders-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/one-button-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/one-button-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/random-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/random-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/relax-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/relax-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/reverse-spin-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/reverse-spin-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/spin-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/spin-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/spin-tiles-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/spin-tiles-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/sudden-death-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/sudden-death-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/triplets-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/triplets-mod.png -------------------------------------------------------------------------------- /rurusetto/media/wiki_images/untangle-mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/media/wiki_images/untangle-mod.png -------------------------------------------------------------------------------- /rurusetto/rurusetto/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/rurusetto/__init__.py -------------------------------------------------------------------------------- /rurusetto/rurusetto/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for rurusetto project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rurusetto.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /rurusetto/rurusetto/urls.py: -------------------------------------------------------------------------------- 1 | """rurusetto URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/3.2/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.contrib.auth.models import User 18 | from django.contrib.auth import views as auth_views 19 | from django.contrib.sitemaps import Sitemap 20 | from django.contrib.sitemaps.views import sitemap 21 | from django.contrib.staticfiles.urls import staticfiles_urlpatterns 22 | from django.shortcuts import resolve_url 23 | from django.urls import path, include 24 | from users import views as user_views 25 | from django.conf import settings 26 | from django.conf.urls.static import static 27 | from wiki.models import Ruleset 28 | 29 | 30 | class WikiSitemap(Sitemap): 31 | changefreq = "daily" 32 | priority = 0.5 33 | 34 | def items(self): 35 | return Ruleset.objects.all() 36 | 37 | def location(self, obj): 38 | return resolve_url('wiki', slug=obj.slug) 39 | 40 | def lastmod(self, obj): 41 | return obj.last_edited_at 42 | 43 | 44 | class ProfileSitemap(Sitemap): 45 | changefreq = "daily" 46 | priority = 0.5 47 | 48 | def items(self): 49 | return User.objects.all() 50 | 51 | def location(self, obj): 52 | return resolve_url('profile', pk=obj.id) 53 | 54 | def lastmod(self, obj): 55 | return obj.date_joined 56 | 57 | 58 | class StaticSitemap(Sitemap): 59 | changefreq = "daily" 60 | priority = 0.5 61 | 62 | def items(self): 63 | return ['listing', 'home', 'changelog'] 64 | 65 | def location(self, obj): 66 | return resolve_url(obj) 67 | 68 | 69 | sitemaps = { 70 | 'wiki': WikiSitemap, 71 | 'profile': ProfileSitemap, 72 | 'static': StaticSitemap, 73 | } 74 | 75 | urlpatterns = [ 76 | path('admin/', admin.site.urls), 77 | path('', include('wiki.urls')), 78 | path('api/', include('api.urls')), 79 | path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='sitemap'), 80 | path('mdeditor/', include('mdeditor.urls')), 81 | path('accounts/', include('allauth.urls')), 82 | path('profile/', user_views.profile_detail, name='profile'), 83 | path('settings/', user_views.settings, name='settings'), 84 | path('settings/delete-account', user_views.delete_account, name='delete_account'), 85 | ] 86 | 87 | if settings.DEBUG: 88 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 89 | 90 | admin.site.site_header = 'Rūrusetto Administration' 91 | admin.site.site_title = 'rūrusetto' 92 | admin.site.index_title = 'Rūrusetto Site Administration' 93 | -------------------------------------------------------------------------------- /rurusetto/rurusetto/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for rurusetto project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rurusetto.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /rurusetto/templates/400.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 21 | 22 | 400 - rūrusetto 23 | 24 | 25 | 26 |
27 |

400 Bad Request

28 |

Something went wrong here!

29 | 30 | 31 |
32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /rurusetto/templates/403.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 21 | 22 | 403 - rūrusetto 23 | 24 | 25 | 26 |
27 |

403 Forbidden

28 |

You don't have permission to access this page.

29 | 30 | 31 |
32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /rurusetto/templates/404.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 21 | 404 - rūrusetto 22 | 23 | 24 | 25 |
26 |

404 Page not found!

27 |

Why are you here!

28 |

Something went wrong. Try heading over to our homepage.

29 | 30 | 31 |
32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /rurusetto/templates/500.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 21 | 22 | 500 - rūrusetto 23 | 24 | 25 | 26 |
27 |

500 Internal Server Error

28 |

Something went wrong in the server!

29 | 30 | 31 |
32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /rurusetto/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/__init__.py -------------------------------------------------------------------------------- /rurusetto/users/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Profile, Config, Tag 3 | 4 | # Register your models here. 5 | 6 | admin.site.register(Profile) 7 | admin.site.register(Config) 8 | admin.site.register(Tag) -------------------------------------------------------------------------------- /rurusetto/users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsersConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'users' 7 | 8 | def ready(self): 9 | import users.signals 10 | -------------------------------------------------------------------------------- /rurusetto/users/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.contrib.auth.models import User 3 | from .models import Profile, Config, THEME, SUBPAGE_INDEX, LANGUAGE 4 | 5 | 6 | class ProfileUpdateForm(forms.ModelForm): 7 | """Form in user settings page to update the user's Profile object.""" 8 | about_me = forms.CharField(required=False) 9 | osu_username = forms.CharField(max_length=20, required=False) 10 | 11 | class Meta: 12 | model = Profile 13 | fields = ['about_me', 'cover', 'cover_light', 'image', 'osu_username'] 14 | 15 | 16 | class UserUpdateForm(forms.ModelForm): 17 | """Form in user's settings page to update value in default Django User model.""" 18 | email = forms.EmailField(required=False) 19 | 20 | class Meta: 21 | model = User 22 | fields = ['username', 'email'] 23 | 24 | 25 | class UpdateProfileEveryLoginConfigForm(forms.ModelForm): 26 | """Form to update update_profile_every_login in user's config model specifically.""" 27 | update_profile_every_login = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': "form-check-input"})) 28 | 29 | class Meta: 30 | model = Config 31 | fields = ['update_profile_every_login'] 32 | 33 | 34 | class UserThemeConfigForm(forms.ModelForm): 35 | """Form to update website theme in user's config model.""" 36 | theme = forms.ChoiceField(label="", choices=THEME, required=False) 37 | 38 | class Meta: 39 | model = Config 40 | fields = ['theme'] 41 | 42 | 43 | class UserSubpageConfigForm(forms.ModelForm): 44 | """Form to update subpage index design in user's config model.""" 45 | subpage_index = forms.ChoiceField(label="", choices=SUBPAGE_INDEX, required=False) 46 | 47 | class Meta: 48 | model = Config 49 | fields = ['subpage_index'] 50 | 51 | 52 | class UserLanguageConfigForm(forms.ModelForm): 53 | """Form to update language setting for user in user's config model.""" 54 | language = forms.ChoiceField(label="", choices=LANGUAGE, required=False) 55 | 56 | class Meta: 57 | model = Config 58 | fields = ['language'] 59 | 60 | 61 | class UserHideEmailConfigForm(forms.ModelForm): 62 | """Form to update hide email on profile setting in user's config model.""" 63 | hide_email = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': "form-check-input"})) 64 | 65 | class Meta: 66 | model = Config 67 | fields = ['hide_email'] 68 | 69 | 70 | class UserDeleteAccountForm(forms.ModelForm): 71 | """Form that show in delete account page. Use to pass the value for verification in delete account views.""" 72 | confirm_username = forms.CharField() 73 | confirm_password = forms.CharField(widget=forms.PasswordInput) 74 | 75 | class Meta: 76 | model = User 77 | fields = ['confirm_username', 'confirm_password'] 78 | 79 | 80 | class UserSupportCreatorForm(forms.ModelForm): 81 | """Form to add support message and how to support the creator.""" 82 | 83 | class Meta: 84 | model = Profile 85 | fields = ['support_message', 'support_patreon', 'support_kofi', 'support_github_sponsors'] 86 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-07-25 19:53 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Profile', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('image', models.ImageField(default='default.png', upload_to='profile_pics')), 22 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 23 | ], 24 | ), 25 | migrations.CreateModel( 26 | name='Config', 27 | fields=[ 28 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 29 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 30 | ], 31 | ), 32 | ] 33 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0002_alter_profile_image.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-07-25 20:44 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='profile', 15 | name='image', 16 | field=models.ImageField(default='default.jpeg', upload_to='profile_pics'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0003_profile_about_me.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-07-25 21:26 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0002_alter_profile_image'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='profile', 15 | name='about_me', 16 | field=models.TextField(default='Hello there!', max_length=120), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0004_auto_20210728_2047.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-07-28 20:47 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('users', '0003_profile_about_me'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='profile', 16 | name='cover', 17 | field=models.ImageField(default='default.jpeg', upload_to='profile_pics', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg'])]), 18 | ), 19 | migrations.AlterField( 20 | model_name='profile', 21 | name='image', 22 | field=models.ImageField(default='default.jpeg', upload_to='profile_pics', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg'])]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0005_alter_profile_cover.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-07-28 20:48 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('users', '0004_auto_20210728_2047'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='profile', 16 | name='cover', 17 | field=models.ImageField(default='default.jpeg', upload_to='cover_pics', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0006_alter_profile_cover.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-07-28 20:50 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('users', '0005_alter_profile_cover'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='profile', 16 | name='cover', 17 | field=models.ImageField(default='default_cover.png', upload_to='cover_pics', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0007_auto_20210804_1904.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-04 19:04 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('users', '0006_alter_profile_cover'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='profile', 16 | name='cover', 17 | field=models.ImageField(default='default_cover.png', upload_to='cover_pics', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 18 | ), 19 | migrations.AlterField( 20 | model_name='profile', 21 | name='image', 22 | field=models.ImageField(default='default.jpeg', upload_to='profile_pics', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0008_profile_oauth_first_migrate.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-06 20:06 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0007_auto_20210804_1904'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='profile', 15 | name='oauth_first_migrate', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0009_auto_20210807_0855.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-07 08:55 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0008_profile_oauth_first_migrate'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='profile', 15 | name='discord', 16 | field=models.TextField(default='', max_length=20), 17 | ), 18 | migrations.AddField( 19 | model_name='profile', 20 | name='interests', 21 | field=models.TextField(default='', max_length=20), 22 | ), 23 | migrations.AddField( 24 | model_name='profile', 25 | name='location', 26 | field=models.TextField(default='', max_length=20), 27 | ), 28 | migrations.AddField( 29 | model_name='profile', 30 | name='occupation', 31 | field=models.TextField(default='', max_length=20), 32 | ), 33 | migrations.AddField( 34 | model_name='profile', 35 | name='twitter', 36 | field=models.TextField(default='', max_length=20), 37 | ), 38 | migrations.AddField( 39 | model_name='profile', 40 | name='website', 41 | field=models.URLField(default=''), 42 | ), 43 | ] 44 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0010_auto_20210807_0920.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-07 09:20 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0009_auto_20210807_0855'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='profile', 15 | name='discord', 16 | field=models.CharField(default='', max_length=20), 17 | ), 18 | migrations.AlterField( 19 | model_name='profile', 20 | name='interests', 21 | field=models.CharField(default='', max_length=20), 22 | ), 23 | migrations.AlterField( 24 | model_name='profile', 25 | name='location', 26 | field=models.CharField(default='', max_length=20), 27 | ), 28 | migrations.AlterField( 29 | model_name='profile', 30 | name='occupation', 31 | field=models.CharField(default='', max_length=20), 32 | ), 33 | migrations.AlterField( 34 | model_name='profile', 35 | name='twitter', 36 | field=models.CharField(default='', max_length=20), 37 | ), 38 | ] 39 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0011_profile_osu_username.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-07 09:51 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0010_auto_20210807_0920'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='profile', 15 | name='osu_username', 16 | field=models.CharField(default='', max_length=20), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0012_profile_osu_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-07 10:57 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0011_profile_osu_username'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='profile', 15 | name='osu_id', 16 | field=models.IntegerField(default=0), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0013_auto_20210807_1907.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-07 19:07 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0012_profile_osu_id'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='profile', 15 | name='social_account', 16 | field=models.BooleanField(default=False), 17 | ), 18 | migrations.AlterField( 19 | model_name='profile', 20 | name='osu_id', 21 | field=models.IntegerField(default=''), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0014_config_update_profile_every_login.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-07 19:12 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0013_auto_20210807_1907'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='config', 15 | name='update_profile_every_login', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0015_alter_profile_osu_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-10 17:43 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0014_config_update_profile_every_login'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='profile', 15 | name='osu_id', 16 | field=models.IntegerField(default=0), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0016_auto_20210811_0523.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-11 05:23 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0015_alter_profile_osu_id'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='profile', 15 | name='discord', 16 | field=models.CharField(default='', max_length=50), 17 | ), 18 | migrations.AlterField( 19 | model_name='profile', 20 | name='interests', 21 | field=models.CharField(default='', max_length=50), 22 | ), 23 | migrations.AlterField( 24 | model_name='profile', 25 | name='location', 26 | field=models.CharField(default='', max_length=50), 27 | ), 28 | migrations.AlterField( 29 | model_name='profile', 30 | name='occupation', 31 | field=models.CharField(default='', max_length=50), 32 | ), 33 | migrations.AlterField( 34 | model_name='profile', 35 | name='osu_username', 36 | field=models.CharField(default='', max_length=50), 37 | ), 38 | migrations.AlterField( 39 | model_name='profile', 40 | name='twitter', 41 | field=models.CharField(default='', max_length=50), 42 | ), 43 | ] 44 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0017_auto_20210811_1237.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-11 12:37 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0016_auto_20210811_0523'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='profile', 15 | name='about_me', 16 | field=models.TextField(blank=True, default='Hello there!', max_length=120), 17 | ), 18 | migrations.AlterField( 19 | model_name='profile', 20 | name='discord', 21 | field=models.CharField(blank=True, default='', max_length=50), 22 | ), 23 | migrations.AlterField( 24 | model_name='profile', 25 | name='interests', 26 | field=models.CharField(blank=True, default='', max_length=50), 27 | ), 28 | migrations.AlterField( 29 | model_name='profile', 30 | name='location', 31 | field=models.CharField(blank=True, default='', max_length=50), 32 | ), 33 | migrations.AlterField( 34 | model_name='profile', 35 | name='occupation', 36 | field=models.CharField(blank=True, default='', max_length=50), 37 | ), 38 | migrations.AlterField( 39 | model_name='profile', 40 | name='osu_id', 41 | field=models.IntegerField(blank=True, default=0), 42 | ), 43 | migrations.AlterField( 44 | model_name='profile', 45 | name='osu_username', 46 | field=models.CharField(blank=True, default='', max_length=50), 47 | ), 48 | migrations.AlterField( 49 | model_name='profile', 50 | name='twitter', 51 | field=models.CharField(blank=True, default='', max_length=50), 52 | ), 53 | migrations.AlterField( 54 | model_name='profile', 55 | name='website', 56 | field=models.URLField(blank=True, default=''), 57 | ), 58 | ] 59 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0018_auto_20210811_1802.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-11 18:02 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0017_auto_20210811_1237'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='profile', 15 | name='discord', 16 | ), 17 | migrations.RemoveField( 18 | model_name='profile', 19 | name='interests', 20 | ), 21 | migrations.RemoveField( 22 | model_name='profile', 23 | name='location', 24 | ), 25 | migrations.RemoveField( 26 | model_name='profile', 27 | name='occupation', 28 | ), 29 | migrations.RemoveField( 30 | model_name='profile', 31 | name='osu_id', 32 | ), 33 | migrations.RemoveField( 34 | model_name='profile', 35 | name='social_account', 36 | ), 37 | migrations.RemoveField( 38 | model_name='profile', 39 | name='twitter', 40 | ), 41 | migrations.RemoveField( 42 | model_name='profile', 43 | name='website', 44 | ), 45 | ] 46 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0019_config_theme.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-13 20:39 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0018_auto_20210811_1802'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='config', 15 | name='theme', 16 | field=models.TextField(choices=[('', 'Dark Mode (Default)'), ('light', 'Light Mode'), ('sync', 'Sync With System Settings')], default=''), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0020_alter_config_theme.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-19 18:17 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0019_config_theme'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='config', 15 | name='theme', 16 | field=models.TextField(choices=[('', 'Dark Mode (Default)'), ('light', 'Light Mode')], default=''), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0021_config_subpage_index.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-27 12:25 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0020_alter_config_theme'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='config', 15 | name='subpage_index', 16 | field=models.TextField(choices=[('list', 'List with expandable accordance'), ('button', 'Button')], default='button'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0022_alter_config_subpage_index.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-27 12:39 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0021_config_subpage_index'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='config', 15 | name='subpage_index', 16 | field=models.TextField(choices=[('button', 'Button (Default)'), ('list', 'List with expandable accordance')], default='button'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0023_tag.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-02 12:08 2 | 3 | import colorfield.fields 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('users', '0022_alter_config_subpage_index'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Tag', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('name', models.CharField(default='Default tag', max_length=25)), 19 | ('pills_color', colorfield.fields.ColorField(default='#FF66AA', max_length=18)), 20 | ('font_color', colorfield.fields.ColorField(default='#FFFFFF', max_length=18)), 21 | ('description', models.CharField(default='', max_length=200)), 22 | ], 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0024_profile_tag.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-02 12:11 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0023_tag'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='profile', 15 | name='tag', 16 | field=models.CharField(blank=True, default='', max_length=100), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0025_alter_tag_description.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-02 12:45 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0024_profile_tag'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='tag', 15 | name='description', 16 | field=models.CharField(default='', max_length=500), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0026_alter_tag_description.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-02 17:48 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0025_alter_tag_description'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='tag', 15 | name='description', 16 | field=models.CharField(default='', max_length=200), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0027_auto_20210909_0102.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-08 18:02 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0026_alter_tag_description'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='profile', 15 | name='support_github_sponsors', 16 | field=models.URLField(blank=True), 17 | ), 18 | migrations.AddField( 19 | model_name='profile', 20 | name='support_kofi', 21 | field=models.URLField(blank=True), 22 | ), 23 | migrations.AddField( 24 | model_name='profile', 25 | name='support_message', 26 | field=models.TextField(blank=True, default='', max_length=500), 27 | ), 28 | migrations.AddField( 29 | model_name='profile', 30 | name='support_patreon', 31 | field=models.URLField(blank=True), 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0028_alter_profile_support_message.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-08 18:06 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0027_auto_20210909_0102'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='profile', 15 | name='support_message', 16 | field=models.TextField(blank=True, default=''), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0029_config_hide_email.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-16 12:04 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0028_alter_profile_support_message'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='config', 15 | name='hide_email', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0030_profile_cover_light.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.8 on 2021-10-08 20:58 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('users', '0029_config_hide_email'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='profile', 16 | name='cover_light', 17 | field=models.ImageField(default='default_cover.png', upload_to='cover_pics_light', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0031_alter_profile_image.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.8 on 2021-10-08 21:26 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('users', '0030_profile_cover_light'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='profile', 16 | name='image', 17 | field=models.ImageField(default='default.png', upload_to='profile_pics', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0032_auto_20211011_0942.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.8 on 2021-10-11 09:42 2 | 3 | import colorfield.fields 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('users', '0031_alter_profile_image'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='tag', 16 | name='font_color', 17 | field=colorfield.fields.ColorField(blank=True, default='#FFFFFF', max_length=18), 18 | ), 19 | migrations.AlterField( 20 | model_name='tag', 21 | name='pills_color', 22 | field=colorfield.fields.ColorField(blank=True, default='#FF66AA', max_length=18), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0033_config_language.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.3 on 2022-04-08 22:31 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0032_auto_20211011_0942'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='config', 15 | name='language', 16 | field=models.TextField(choices=[('en-EN', 'English (Default)'), ('th', 'Thai')], default='en-EN'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0034_alter_config_language.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.3 on 2022-04-08 22:33 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0033_config_language'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='config', 15 | name='language', 16 | field=models.TextField(choices=[('en', 'English (Default)'), ('th', 'Thai')], default='en-EN'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0035_alter_config_theme.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.3 on 2022-04-08 22:43 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0034_alter_config_language'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='config', 15 | name='theme', 16 | field=models.TextField(choices=[('', 'Dark Mode (Default)'), ('light', 'Light Mode')], default='', null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0036_alter_config_theme.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.3 on 2022-04-08 22:44 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0035_alter_config_theme'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='config', 15 | name='theme', 16 | field=models.TextField(blank=True, choices=[('', 'Dark Mode (Default)'), ('light', 'Light Mode')], default=''), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0037_alter_config_language.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.4 on 2022-04-22 20:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0036_alter_config_theme'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='config', 15 | name='language', 16 | field=models.TextField(choices=[('en', 'English (Default)'), ('fr', 'French (Not complete)'), ('th', 'Thai')], default='en-EN'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/0038_alter_config_language.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.1.1 on 2023-02-07 02:32 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0037_alter_config_language'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='config', 15 | name='language', 16 | field=models.TextField(choices=[('en', 'English (Default)'), ('es', 'Spanish'), ('fr', 'French (Not complete)'), ('th', 'Thai')], default='en-EN'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/users/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/migrations/__init__.py -------------------------------------------------------------------------------- /rurusetto/users/signals.py: -------------------------------------------------------------------------------- 1 | import os 2 | import requests 3 | from django.db.models.signals import post_save 4 | from django.contrib.auth.models import User 5 | from .models import Profile, Config 6 | from django.core.files import File 7 | from django.core.files.temp import NamedTemporaryFile 8 | from django.dispatch.dispatcher import receiver 9 | from allauth.account.signals import user_logged_in 10 | from allauth.socialaccount.models import SocialAccount 11 | 12 | 13 | @receiver(post_save, sender=User) 14 | def create_profile(sender, instance, created, **kwargs): 15 | """When receive that has user signed up, it will create Profile and Config object that is bind with User object.""" 16 | if created: 17 | Profile.objects.create(user=instance) 18 | Config.objects.create(user=instance) 19 | 20 | 21 | @receiver(post_save, sender=User) 22 | def save_profile(sender, instance, **kwargs): 23 | """Signal when user change something in profile, it will save.""" 24 | instance.profile.save() 25 | 26 | 27 | @receiver(user_logged_in) 28 | def user_update_information_in_allauth(request, user, **kwargs): 29 | """Signal when user login using allauth (login with osu! account)""" 30 | profile = Profile.objects.get(user=request.user) 31 | # If user login by using osu! account and user login first time or user's config `Update Profile Every Login` 32 | # is True, start fetch data from extra_data that just get from login system and assign to user's profile 33 | if (SocialAccount.objects.filter(user=request.user).exists() and not request.user.profile.oauth_first_migrate) or request.user.config.update_profile_every_login: 34 | data = SocialAccount.objects.get(user=request.user).extra_data 35 | 36 | if data["avatar_url"] is not None: 37 | avatar_pic = requests.get(data["avatar_url"]) 38 | avatar_temp = NamedTemporaryFile(delete=True) 39 | avatar_temp.write(avatar_pic.content) 40 | avatar_temp.flush() 41 | profile.image.save(data["avatar_url"].split('?')[-1], File(avatar_temp), save=True) 42 | 43 | if data["cover_url"] is not None: 44 | cover_pic = requests.get(data["cover_url"]) 45 | cover_temp = NamedTemporaryFile(delete=True) 46 | cover_temp.write(cover_pic.content) 47 | cover_temp.flush() 48 | profile.cover.save(data["cover_url"].split('/')[-1], File(cover_temp), save=True) 49 | profile.cover_light.save(data["cover_url"].split('/')[-1], File(cover_temp), save=True) 50 | 51 | profile.osu_username = data["username"] 52 | profile.oauth_first_migrate = True 53 | profile.save() 54 | else: 55 | profile.oauth_first_migrate = True 56 | profile.save() 57 | -------------------------------------------------------------------------------- /rurusetto/users/static/css/login.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | height: 100%!important; 4 | } 5 | 6 | .right-bg { 7 | background-size: cover; 8 | } 9 | 10 | .form { 11 | line-height: 10; 12 | } 13 | 14 | .login-form { 15 | line-height: 1; 16 | } 17 | 18 | @media (max-width: 1009px) { 19 | .col-sm-4 { 20 | width: 100%; 21 | height: 100%; 22 | } 23 | 24 | .col-sm-8 { 25 | width: 0; 26 | height: 0; 27 | } 28 | 29 | .login-bottom-text { 30 | line-height: 2; 31 | } 32 | 33 | #signup-link { 34 | line-height: 2!important; 35 | } 36 | } -------------------------------------------------------------------------------- /rurusetto/users/static/img/159201.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/159201.jpeg -------------------------------------------------------------------------------- /rurusetto/users/static/img/243007.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/243007.jpeg -------------------------------------------------------------------------------- /rurusetto/users/static/img/243010.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/243010.jpeg -------------------------------------------------------------------------------- /rurusetto/users/static/img/243018.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/243018.jpeg -------------------------------------------------------------------------------- /rurusetto/users/static/img/685481.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/685481.jpeg -------------------------------------------------------------------------------- /rurusetto/users/static/img/701370.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/701370.png -------------------------------------------------------------------------------- /rurusetto/users/static/img/714226.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/714226.png -------------------------------------------------------------------------------- /rurusetto/users/static/img/748076.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/748076.png -------------------------------------------------------------------------------- /rurusetto/users/static/img/918716.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/918716.jpg -------------------------------------------------------------------------------- /rurusetto/users/static/img/guest-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/guest-profile.png -------------------------------------------------------------------------------- /rurusetto/users/static/img/settings-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/settings-cover-light.png -------------------------------------------------------------------------------- /rurusetto/users/static/img/settings-cover-night.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/img/settings-cover-night.jpeg -------------------------------------------------------------------------------- /rurusetto/users/static/logo/osu-logo-pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/osu-logo-pink.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/osu-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/osu-logo.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-1x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-2x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-3x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-black-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-black-1x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-black-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-black-2x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-black-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-black-3x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-white-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-white-1x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-white-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-white-2x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-white-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-white-3x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-with-name-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-with-name-1x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-with-name-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-with-name-2x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo-with-name-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/users/static/logo/rurusetto-logo-with-name-3x.png -------------------------------------------------------------------------------- /rurusetto/users/static/logo/rurusetto-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /rurusetto/users/templates/socialaccount/authentication_error.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | {% load i18n %} 3 | {% load crispy_forms_tags %} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | {% trans "login_failed" %} - rūrusetto 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
34 |
35 |
36 |
37 | 38 |

39 | {% if messages %} 40 | {% for message in messages %} 41 |
42 | {{ message }} 43 |
44 | {% endfor %} 45 | {% endif %} 46 |

{% trans "login_failed" %}

47 |

48 | {% url 'account_login' as login_url %} 49 |

{% trans "error_while_login_osu" %}

50 |

51 | {% trans "back_to_login" %} 52 |

53 | {% trans "return_to_homepage" %} 54 |
55 |
56 |
57 |
58 |
59 | 60 | -------------------------------------------------------------------------------- /rurusetto/users/templates/socialaccount/connections.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | {% load i18n %} 3 | {% load crispy_forms_tags %} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | {% trans "account_connection" %} - rūrusetto 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
34 |
35 |
36 |
37 | 38 |

39 | {% if messages %} 40 | {% for message in messages %} 41 |

{% trans "connection_status" %}

42 |

43 |

{{ message }}

44 | {% endfor %} 45 | {% else %} 46 |

{% trans "unknown_status" %}

47 |

48 |

{% trans "no_status_provided" %}

49 | {% endif %} 50 | {% trans "back_to_setting_page" %} 51 |

52 |
53 |
54 |
55 |
56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /rurusetto/users/templates/socialaccount/login_cancelled.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | {% load i18n %} 3 | {% load crispy_forms_tags %} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {% trans "login_cancelled" %} - rūrusetto 22 | 23 | 24 | 25 |
26 |
27 |
28 |
29 | 30 |

31 | {% if messages %} 32 | {% for message in messages %} 33 |
34 | {{ message }} 35 |
36 | {% endfor %} 37 | {% endif %} 38 |

{% trans "login_cancelled" %}

39 |

40 | {% url 'account_login' as login_url %} 41 |

{% blocktrans with login_url=login_url %}You decided to cancel logging in to rūrusetto using your osu! account. If this was a mistake, please sign in again.{% endblocktrans %}

42 |
43 |
44 |
45 |
46 |
47 | 48 | 49 | -------------------------------------------------------------------------------- /rurusetto/users/templates/socialaccount/snippets/provider_list.html: -------------------------------------------------------------------------------- 1 | {% load socialaccount %} 2 | {% load i18n %} 3 | {% load static %} 4 | 5 | {% get_providers as socialaccount_providers %} 6 | 7 | {% for provider in socialaccount_providers %} 8 | {% if provider.id == "openid" %} 9 | {% for brand in provider.get_brands %} 10 |
  • 11 | {{brand.name}} 15 |
  • 16 | {% endfor %} 17 | {% endif %} 18 |

    osu! logo {% trans "connect_to" %} {{provider.name}}

    20 | {% endfor %} 21 | -------------------------------------------------------------------------------- /rurusetto/users/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /rurusetto/wiki/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/__init__.py -------------------------------------------------------------------------------- /rurusetto/wiki/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Changelog, Ruleset, CustomWiki, Subpage, RecommendBeatmap, Action, RulesetStatus 3 | 4 | # Register your models here. 5 | 6 | admin.site.register(Changelog) 7 | admin.site.register(Ruleset) 8 | admin.site.register(CustomWiki) 9 | admin.site.register(Subpage) 10 | admin.site.register(RecommendBeatmap) 11 | admin.site.register(Action) 12 | admin.site.register(RulesetStatus) 13 | -------------------------------------------------------------------------------- /rurusetto/wiki/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class WikiConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'wiki' 7 | 8 | def ready(self): 9 | import wiki.signals 10 | -------------------------------------------------------------------------------- /rurusetto/wiki/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.contrib.auth.models import User 3 | from django.core.validators import FileExtensionValidator 4 | from mdeditor.fields import MDTextFormField 5 | 6 | from .models import Ruleset, Subpage, RecommendBeatmap, PLAYABLE, RulesetStatus 7 | 8 | 9 | class RulesetForm(forms.ModelForm): 10 | """Form on create and edit the Ruleset object.""" 11 | name = forms.CharField(required=True) 12 | description = forms.CharField(required=True, widget=forms.Textarea) 13 | content = MDTextFormField() 14 | source = forms.URLField(label="Source") 15 | hidden = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': "form-check-input"})) 16 | 17 | class Meta: 18 | model = Ruleset 19 | fields = ['name', 'description', 'icon', 'light_icon', 'logo', 'cover_image', 'cover_image_light', 20 | 'opengraph_image', 'recommend_beatmap_cover', 'custom_css', 'content', 'source', 'github_download_filename', 'hidden'] 21 | 22 | 23 | class RulesetStatusForm(forms.ModelForm): 24 | """Form for changing value in ruleset's status object""" 25 | playable = forms.ChoiceField(label="", choices=PLAYABLE, required=True, widget=forms.Select(attrs={'class': "form-select"})) 26 | pre_release = forms.BooleanField(required=False, label='Pre-Release', widget=forms.CheckboxInput(attrs={'class': "form-check-input"})) 27 | 28 | class Meta: 29 | model = RulesetStatus 30 | fields = ['playable', 'pre_release'] 31 | 32 | 33 | class SubpageForm(forms.ModelForm): 34 | """Form on create and edit the Subpage object.""" 35 | title = forms.CharField(required=True) 36 | content = MDTextFormField() 37 | hidden = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': "form-check-input"})) 38 | 39 | class Meta: 40 | model = Subpage 41 | fields = ['title', 'content', 'hidden'] 42 | 43 | 44 | class RecommendBeatmapForm(forms.ModelForm): 45 | """Form on create RecommendBeatmap object or adding a recommend beatmap.""" 46 | beatmap_id = forms.CharField(required=True) 47 | comment = forms.CharField(required=True) 48 | 49 | class Meta: 50 | model = RecommendBeatmap 51 | fields = ['beatmap_id', 'comment'] 52 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-07-29 12:38 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Changelog', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('version', models.TextField(default='', max_length=30)), 19 | ('time', models.DateTimeField(auto_now_add=True)), 20 | ('type', models.CharField(choices=[('pre-release', 'Pre-release'), ('stable', 'Stable')], default='stable', max_length=50)), 21 | ('note', models.TextField(default='Awesome release notes here!', max_length=5000)), 22 | ], 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0002_auto_20210802_1807.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-02 18:07 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='changelog', 15 | name='note', 16 | field=models.TextField(default='Awesome release notes here!'), 17 | ), 18 | migrations.AlterField( 19 | model_name='changelog', 20 | name='type', 21 | field=models.TextField(choices=[('pre-release', 'Pre-release'), ('stable', 'Stable')], default='stable'), 22 | ), 23 | migrations.AlterField( 24 | model_name='changelog', 25 | name='version', 26 | field=models.CharField(default='', max_length=30), 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0003_ruleset.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-02 18:36 2 | 3 | from django.conf import settings 4 | import django.core.validators 5 | from django.db import migrations, models 6 | import django.db.models.deletion 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 13 | ('wiki', '0002_auto_20210802_1807'), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Ruleset', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('name', models.CharField(default='Awesome rulesets', max_length=20)), 22 | ('description', models.CharField(default='With awesome description', max_length=150)), 23 | ('cover_image', models.ImageField(default='default.jpeg', upload_to='profile_pics', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg'])])), 24 | ('content', models.TextField(default='and awesome content!')), 25 | ('open_source', models.BooleanField(default=True)), 26 | ('last_edited_at', models.DateTimeField(auto_now_add=True)), 27 | ('creator', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='ruleset_page_creator', to=settings.AUTH_USER_MODEL)), 28 | ('last_edited_by', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='ruleset_last_edited_by', to=settings.AUTH_USER_MODEL)), 29 | ('owner', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='ruleset_ruleset_owner', to=settings.AUTH_USER_MODEL)), 30 | ], 31 | ), 32 | ] 33 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0004_alter_ruleset_cover_image.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-02 18:40 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0003_ruleset'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='ruleset', 16 | name='cover_image', 17 | field=models.ImageField(default='default_wiki_cover.jpeg', upload_to='wiki_cover', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0005_auto_20210802_1843.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-02 18:43 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0004_alter_ruleset_cover_image'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='github_link', 16 | field=models.URLField(default=''), 17 | ), 18 | migrations.AlterField( 19 | model_name='ruleset', 20 | name='description', 21 | field=models.CharField(default='', max_length=150), 22 | ), 23 | migrations.AlterField( 24 | model_name='ruleset', 25 | name='name', 26 | field=models.CharField(default='', max_length=20), 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0006_ruleset_icon.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-02 18:45 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0005_auto_20210802_1843'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='ruleset', 16 | name='icon', 17 | field=models.ImageField(default='default_icon.png', upload_to='rulesets_icon', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0007_alter_ruleset_last_edited_at.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-02 19:59 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0006_ruleset_icon'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='ruleset', 15 | name='last_edited_at', 16 | field=models.DateTimeField(auto_now=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0008_auto_20210802_2042.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-02 20:42 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('wiki', '0007_alter_ruleset_last_edited_at'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='ruleset', 18 | name='creator', 19 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ruleset_page_creator', to=settings.AUTH_USER_MODEL), 20 | ), 21 | migrations.AlterField( 22 | model_name='ruleset', 23 | name='last_edited_by', 24 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ruleset_last_edited_by', to=settings.AUTH_USER_MODEL), 25 | ), 26 | migrations.AlterField( 27 | model_name='ruleset', 28 | name='owner', 29 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ruleset_ruleset_owner', to=settings.AUTH_USER_MODEL), 30 | ), 31 | ] 32 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0009_auto_20210802_2053.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-02 20:53 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0008_auto_20210802_2042'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='ruleset', 15 | name='creator', 16 | field=models.CharField(default='0', max_length=10), 17 | ), 18 | migrations.AlterField( 19 | model_name='ruleset', 20 | name='last_edited_by', 21 | field=models.CharField(default='0', max_length=10), 22 | ), 23 | migrations.AlterField( 24 | model_name='ruleset', 25 | name='owner', 26 | field=models.CharField(default='0', max_length=10), 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0010_ruleset_verified.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-02 21:34 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0009_auto_20210802_2053'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='verified', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0011_ruleset_slug.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-02 22:26 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0010_ruleset_verified'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='slug', 16 | field=models.SlugField(default='', max_length=20), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0012_remove_ruleset_open_source.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-03 18:56 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0011_ruleset_slug'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='ruleset', 15 | name='open_source', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0013_ruleset_logo.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-03 20:04 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0012_remove_ruleset_open_source'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='ruleset', 16 | name='logo', 17 | field=models.ImageField(default='default_logo.png', upload_to='rulesets_logo', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0014_alter_ruleset_logo.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-03 20:07 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0013_ruleset_logo'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='ruleset', 16 | name='logo', 17 | field=models.ImageField(default='default_logo.jpeg', upload_to='rulesets_logo', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0015_alter_ruleset_content.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-04 18:43 2 | 3 | from django.db import migrations 4 | import mdeditor.fields 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0014_alter_ruleset_logo'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='ruleset', 16 | name='content', 17 | field=mdeditor.fields.MDTextField(), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0016_auto_20210804_1904.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-04 19:04 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0015_alter_ruleset_content'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='ruleset', 16 | name='cover_image', 17 | field=models.ImageField(default='default_wiki_cover.jpeg', upload_to='wiki_cover', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 18 | ), 19 | migrations.AlterField( 20 | model_name='ruleset', 21 | name='icon', 22 | field=models.ImageField(default='default_icon.png', upload_to='rulesets_icon', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 23 | ), 24 | migrations.AlterField( 25 | model_name='ruleset', 26 | name='logo', 27 | field=models.ImageField(default='default_logo.jpeg', upload_to='rulesets_logo', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0017_alter_changelog_note.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-04 21:22 2 | 3 | from django.db import migrations 4 | import mdeditor.fields 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0016_auto_20210804_1904'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='changelog', 16 | name='note', 17 | field=mdeditor.fields.MDTextField(), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0018_rename_github_link_ruleset_source.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-05 20:11 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0017_alter_changelog_note'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='ruleset', 15 | old_name='github_link', 16 | new_name='source', 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0019_ruleset_created_at.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-10 12:21 2 | 3 | from django.db import migrations, models 4 | import django.utils.timezone 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0018_rename_github_link_ruleset_source'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='ruleset', 16 | name='created_at', 17 | field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), 18 | preserve_default=False, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0020_ruleset_opengraph_image.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.5 on 2021-08-11 22:09 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0019_ruleset_created_at'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='ruleset', 16 | name='opengraph_image', 17 | field=models.ImageField(default='default_wiki_cover.jpeg', upload_to='rulesets_opengraph_image', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0021_customwiki.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-24 04:54 2 | 3 | from django.db import migrations, models 4 | import mdeditor.fields 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0020_ruleset_opengraph_image'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='CustomWiki', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('time', models.DateTimeField(auto_now_add=True)), 19 | ('last_edited_at', models.DateTimeField(auto_now=True)), 20 | ('creator', models.CharField(default='0', max_length=10)), 21 | ('last_edited_by', models.CharField(default='0', max_length=10)), 22 | ('content', mdeditor.fields.MDTextField()), 23 | ], 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0022_customwiki_title.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-24 04:57 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0021_customwiki'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='customwiki', 15 | name='title', 16 | field=models.CharField(default='', max_length=100), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0023_subpage.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-25 18:19 2 | 3 | from django.db import migrations, models 4 | import mdeditor.fields 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0022_customwiki_title'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Subpage', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('ruleset_id', models.CharField(default='', max_length=10)), 19 | ('title', models.CharField(default='', max_length=50)), 20 | ('slug', models.SlugField(default='', max_length=20)), 21 | ('content', mdeditor.fields.MDTextField()), 22 | ('last_edited_by', models.CharField(default='0', max_length=10)), 23 | ('last_edited_at', models.DateTimeField(auto_now=True)), 24 | ('created_at', models.DateTimeField(auto_now_add=True)), 25 | ], 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0024_alter_subpage_slug.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-25 18:25 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0023_subpage'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='subpage', 15 | name='slug', 16 | field=models.SlugField(default=''), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0025_alter_subpage_ruleset_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-25 18:26 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0024_alter_subpage_slug'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='subpage', 15 | name='ruleset_id', 16 | field=models.CharField(default='0', max_length=10), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0026_subpage_creator.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-25 18:46 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0025_alter_subpage_ruleset_id'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='subpage', 15 | name='creator', 16 | field=models.CharField(default='0', max_length=10), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0027_recommendbeatmap.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-28 12:30 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0026_subpage_creator'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='RecommendBeatmap', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('ruleset_id', models.CharField(default='0', max_length=10)), 19 | ('user_id', models.CharField(default='0', max_length=10)), 20 | ('beatmap_id', models.IntegerField(default=75)), 21 | ('title', models.CharField(default='DISCO PRINCE', max_length=100)), 22 | ('artist', models.CharField(default='Kenji Ninuma', max_length=100)), 23 | ('source', models.CharField(default='', max_length=100)), 24 | ('approved', models.CharField(default='1', max_length=10)), 25 | ('difficultyrating', models.CharField(default='2.39774', max_length=10)), 26 | ('bpm', models.CharField(default='119.999', max_length=10)), 27 | ('beatmap_cover', models.ImageField(default='default_cover.png', upload_to='beatmap_cover', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])])), 28 | ('created_at', models.DateTimeField(auto_now_add=True)), 29 | ], 30 | ), 31 | ] 32 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0028_recommendbeatmap_comment.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-28 14:48 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0027_recommendbeatmap'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='recommendbeatmap', 15 | name='comment', 16 | field=models.CharField(default=None, max_length=150), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0029_recommendbeatmap_version.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-28 19:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0028_recommendbeatmap_comment'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='recommendbeatmap', 15 | name='version', 16 | field=models.CharField(default='Normal', max_length=50), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0030_recommendbeatmap_beatmapset_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-28 19:36 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0029_recommendbeatmap_version'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='recommendbeatmap', 15 | name='beatmapset_id', 16 | field=models.IntegerField(default=1), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0031_recommendbeatmap_url.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-28 19:38 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0030_recommendbeatmap_beatmapset_id'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='recommendbeatmap', 15 | name='url', 16 | field=models.URLField(default='https://osu.ppy.sh/beatmapsets/1#osu/75'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0032_alter_recommendbeatmap_difficultyrating.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-28 21:04 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0031_recommendbeatmap_url'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='recommendbeatmap', 15 | name='difficultyrating', 16 | field=models.FloatField(default='2.39774'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0033_recommendbeatmap_beatmap_thumbnail.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-29 08:55 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0032_alter_recommendbeatmap_difficultyrating'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='recommendbeatmap', 16 | name='beatmap_thumbnail', 17 | field=models.ImageField(default='default_cover.png', upload_to='beatmap_thumbnail', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0034_auto_20210829_0904.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-29 09:04 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0033_recommendbeatmap_beatmap_thumbnail'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='recommendbeatmap', 16 | name='creator', 17 | field=models.CharField(default='peppy', max_length=100), 18 | ), 19 | migrations.AlterField( 20 | model_name='recommendbeatmap', 21 | name='beatmap_cover', 22 | field=models.ImageField(default='default_beatmap_cover.jpeg', upload_to='beatmap_cover', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 23 | ), 24 | migrations.AlterField( 25 | model_name='recommendbeatmap', 26 | name='beatmap_thumbnail', 27 | field=models.ImageField(default='default_beatmap_thumbnail.jpeg', upload_to='beatmap_thumbnail', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0035_ruleset_recommend_beatmap_cover.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-29 10:45 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0034_auto_20210829_0904'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='ruleset', 16 | name='recommend_beatmap_cover', 17 | field=models.ImageField(default='default_recommend_beatmap_cover.png', upload_to='recommend_beatmap_cover', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0036_recommendbeatmap_owner_approved.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-03 18:48 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0035_ruleset_recommend_beatmap_cover'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='recommendbeatmap', 15 | name='owner_approved', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0037_recommendbeatmap_owner_seen.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-03 19:55 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0036_recommendbeatmap_owner_approved'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='recommendbeatmap', 15 | name='owner_seen', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0038_auto_20210921_1230.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-21 12:30 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0037_recommendbeatmap_owner_seen'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='recommendbeatmap', 15 | name='source', 16 | field=models.CharField(blank=True, default='', max_length=100), 17 | ), 18 | migrations.AlterField( 19 | model_name='recommendbeatmap', 20 | name='version', 21 | field=models.CharField(blank=True, default='Normal', max_length=50), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0039_ruleset_github_download_filename.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-23 18:38 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0038_auto_20210921_1230'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='github_download_filename', 16 | field=models.CharField(blank=True, default='', max_length=100), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0040_action.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-10-03 18:01 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0039_ruleset_github_download_filename'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='Action', 15 | fields=[ 16 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('title', models.CharField(default='Rūrusetto action', max_length=200)), 18 | ('action_field', models.CharField(blank=True, default='', max_length=200)), 19 | ('status', models.IntegerField(default=0)), 20 | ('time_start', models.DateTimeField(auto_now_add=True)), 21 | ('time_finish', models.DateTimeField(blank=True)), 22 | ('start_user', models.IntegerField(default=0)), 23 | ('log_file', models.FileField(upload_to='action_log')), 24 | ], 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0040_ruleset_dark_icon.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-10-04 14:02 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0039_ruleset_github_download_filename'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='ruleset', 16 | name='dark_icon', 17 | field=models.ImageField(default='default_icon.png', upload_to='rulesets_icon_dark', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0041_auto_20211003_1906.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-10-03 19:06 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0040_action'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='action', 15 | name='log_file', 16 | ), 17 | migrations.AddField( 18 | model_name='action', 19 | name='running_text', 20 | field=models.TextField(blank=True), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0041_auto_20211004_2347.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-10-04 18:17 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0040_ruleset_dark_icon'), 11 | ] 12 | 13 | operations = [ 14 | migrations.RemoveField( 15 | model_name='ruleset', 16 | name='dark_icon', 17 | ), 18 | migrations.AddField( 19 | model_name='ruleset', 20 | name='light_icon', 21 | field=models.ImageField(default='default_icon.png', upload_to='rulesets_icon_light', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0042_alter_action_time_finish.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-10-03 20:00 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0041_auto_20211003_1906'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='action', 15 | name='time_finish', 16 | field=models.DateTimeField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0043_merge_20211005_1701.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-10-05 17:01 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0041_auto_20211004_2347'), 10 | ('wiki', '0042_alter_action_time_finish'), 11 | ] 12 | 13 | operations = [ 14 | ] 15 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0044_rulesetstatus.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-10-05 17:24 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0043_merge_20211005_1701'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='RulesetStatus', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('latest_version', models.CharField(blank=True, default='', max_length=200)), 19 | ('latest_update', models.DateTimeField(blank=True)), 20 | ('changelog', models.TextField(blank=True)), 21 | ('file_size', models.IntegerField(blank=True, default=0)), 22 | ('playable', models.TextField(choices=[('yes', 'Yes'), ('no', 'No'), ('unknown', 'Unknown')], default='unknown')), 23 | ('ruleset', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='wiki.ruleset')), 24 | ], 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0045_alter_rulesetstatus_latest_update.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-10-05 18:00 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0044_rulesetstatus'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='rulesetstatus', 15 | name='latest_update', 16 | field=models.DateTimeField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0046_auto_20211006_0457.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.8 on 2021-10-06 04:57 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0045_alter_rulesetstatus_latest_update'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='recommendbeatmap', 16 | name='beatmap_card', 17 | field=models.ImageField(default='default_beatmap_cover.jpeg', upload_to='beatmap_card', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 18 | ), 19 | migrations.AddField( 20 | model_name='recommendbeatmap', 21 | name='beatmap_list', 22 | field=models.ImageField(default='default_beatmap_thumbnail.jpeg', upload_to='beatmap_list', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0047_ruleset_cover_image_light.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.8 on 2021-10-08 19:08 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0046_auto_20211006_0457'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='ruleset', 16 | name='cover_image_light', 17 | field=models.ImageField(default='default_wiki_cover.jpeg', upload_to='wiki_cover_light', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['png', 'gif', 'jpg', 'jpeg', 'bmp', 'svg', 'webp'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0048_ruleset_custom_css.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.8 on 2021-10-08 20:12 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0047_ruleset_cover_image_light'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='ruleset', 16 | name='custom_css', 17 | field=models.ImageField(blank=True, default='default.css', upload_to='custom_css', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['css'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0049_alter_ruleset_custom_css.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.8 on 2021-10-08 20:26 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0048_ruleset_custom_css'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='ruleset', 16 | name='custom_css', 17 | field=models.ImageField(blank=True, default='default.css', upload_to='custom_css', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['css'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0050_alter_ruleset_custom_css.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.8 on 2021-10-08 20:29 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0049_alter_ruleset_custom_css'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='ruleset', 16 | name='custom_css', 17 | field=models.FileField(blank=True, default='default.css', upload_to='custom_css', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['css'])]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0051_auto_20211010_1416.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-10-10 14:16 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0050_alter_ruleset_custom_css'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='hidden', 16 | field=models.BooleanField(default=False), 17 | ), 18 | migrations.AddField( 19 | model_name='subpage', 20 | name='hidden', 21 | field=models.BooleanField(default=False), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0052_alter_recommendbeatmap_comment.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.8 on 2021-10-16 19:18 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0051_auto_20211010_1416'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='recommendbeatmap', 15 | name='comment', 16 | field=models.TextField(blank=True, default=None), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0053_rulesetstatus_pre_release.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.9 on 2021-11-15 19:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0052_alter_recommendbeatmap_comment'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='rulesetstatus', 15 | name='pre_release', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0054_ruleset_archive.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.9 on 2021-12-03 11:29 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0053_rulesetstatus_pre_release'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='archive', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0055_ruleset_direct_download_link.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.9 on 2021-12-27 18:13 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0054_ruleset_archive'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='direct_download_link', 16 | field=models.URLField(default=''), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0056_ruleset_can_download.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.9 on 2021-12-27 18:27 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0055_ruleset_direct_download_link'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='can_download', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0057_alter_ruleset_direct_download_link.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.9 on 2021-12-27 18:33 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0056_ruleset_can_download'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='ruleset', 15 | name='direct_download_link', 16 | field=models.URLField(blank=True, default=''), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0058_recommendbeatmap_approved_date_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.5 on 2022-06-13 05:57 2 | 3 | from django.db import migrations, models 4 | import django.utils.timezone 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('wiki', '0057_alter_ruleset_direct_download_link'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='recommendbeatmap', 16 | name='approved_date', 17 | field=models.DateTimeField(default=django.utils.timezone.now), 18 | ), 19 | migrations.AddField( 20 | model_name='recommendbeatmap', 21 | name='creator_id', 22 | field=models.IntegerField(default=0), 23 | ), 24 | migrations.AddField( 25 | model_name='recommendbeatmap', 26 | name='favourite_count', 27 | field=models.IntegerField(default=0), 28 | ), 29 | migrations.AddField( 30 | model_name='recommendbeatmap', 31 | name='genre_id', 32 | field=models.IntegerField(default=0), 33 | ), 34 | migrations.AddField( 35 | model_name='recommendbeatmap', 36 | name='language_id', 37 | field=models.IntegerField(default=0), 38 | ), 39 | migrations.AddField( 40 | model_name='recommendbeatmap', 41 | name='last_update', 42 | field=models.DateTimeField(default=django.utils.timezone.now), 43 | ), 44 | migrations.AddField( 45 | model_name='recommendbeatmap', 46 | name='playcount', 47 | field=models.IntegerField(default=0), 48 | ), 49 | migrations.AddField( 50 | model_name='recommendbeatmap', 51 | name='submit_date', 52 | field=models.DateTimeField(default=django.utils.timezone.now), 53 | ), 54 | migrations.AddField( 55 | model_name='recommendbeatmap', 56 | name='tags', 57 | field=models.CharField(blank=True, max_length=5000), 58 | ), 59 | migrations.AddField( 60 | model_name='recommendbeatmap', 61 | name='total_length', 62 | field=models.IntegerField(default=0), 63 | ), 64 | ] 65 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/0059_ruleset_github_localisation_filename_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.1.1 on 2022-09-05 17:45 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('wiki', '0058_recommendbeatmap_approved_date_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='github_localisation_filename', 16 | field=models.CharField(blank=True, default='', max_length=100), 17 | ), 18 | migrations.AddField( 19 | model_name='ruleset', 20 | name='localisation_support', 21 | field=models.BooleanField(default=False), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /rurusetto/wiki/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/migrations/__init__.py -------------------------------------------------------------------------------- /rurusetto/wiki/signals.py: -------------------------------------------------------------------------------- 1 | import os 2 | import requests 3 | from django.db.models.signals import post_save 4 | from django.contrib.auth.models import User 5 | from django.dispatch import receiver 6 | from .models import Ruleset, RulesetStatus 7 | 8 | 9 | @receiver(post_save, sender=Ruleset) 10 | def create_ruleset(sender, instance, created, **kwargs): 11 | """When receive that has user signed up, it will create Profile and Config object that is bind with User object.""" 12 | if created: 13 | RulesetStatus.objects.create(ruleset=instance) 14 | -------------------------------------------------------------------------------- /rurusetto/wiki/static/css/progres-bar.css: -------------------------------------------------------------------------------- 1 | 2 | *, 3 | *:after, 4 | *:before { 5 | box-sizing : border-box; 6 | -webkit-box-sizing : border-box; 7 | -moz-box-sizing : border-box; 8 | -webkit-font-smoothing : antialiased; 9 | -moz-font-smoothing : antialiased; 10 | -o-font-smoothing : antialiased; 11 | font-smoothing : antialiased; 12 | text-rendering : optimizeLegibility; 13 | 14 | } 15 | 16 | .mediPlayer .control { 17 | opacity : 0; /* transition: opacity .2s linear; */ 18 | pointer-events : none; 19 | cursor : pointer; 20 | } 21 | 22 | .mediPlayer .not-started .play, .mediPlayer .paused .play { 23 | opacity : 1; 24 | 25 | } 26 | 27 | .mediPlayer .playing .pause { 28 | opacity : 1; 29 | 30 | } 31 | 32 | .mediPlayer .playing .play { 33 | opacity : 0; 34 | } 35 | 36 | .mediPlayer .ended .stop { 37 | opacity : 1; 38 | pointer-events : none; 39 | } 40 | 41 | .mediPlayer .precache-bar .done { 42 | opacity : 0; 43 | } 44 | 45 | .mediPlayer .not-started .progress-bar, .mediPlayer .ended .progress-bar { 46 | display : none; 47 | } 48 | 49 | .mediPlayer .ended .progress-track { 50 | stroke-opacity : 1; 51 | } 52 | 53 | .mediPlayer .progress-bar, 54 | .mediPlayer .precache-bar { 55 | transition : stroke-dashoffset 500ms; 56 | 57 | stroke-dasharray : 298.1371428256714; 58 | stroke-dashoffset : 298.1371428256714; 59 | } -------------------------------------------------------------------------------- /rurusetto/wiki/static/css/wiki-page.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Raleway:wght@500&display=swap'); 2 | 3 | .info-box { 4 | background-color: #4a4a4a; 5 | } 6 | 7 | body.light .info-box { 8 | background-color: #fadce5; 9 | } 10 | 11 | #wiki a { 12 | text-decoration: unset; 13 | } 14 | 15 | #wiki a:hover { 16 | letter-spacing: 2px; 17 | } 18 | 19 | #wiki img { 20 | max-width: 100%; 21 | } 22 | 23 | #wiki span { 24 | font-family: 'JetBrains Mono', monospace; 25 | } 26 | 27 | body.light #wiki li, 28 | body.light #wiki th, 29 | body.light #wiki td, 30 | body.light #wiki hr { 31 | color: black; 32 | } 33 | 34 | #wiki li, th, td, hr { 35 | color: white; 36 | } 37 | 38 | .info-box-head { 39 | color: white 40 | } 41 | 42 | body.light .info-box-head { 43 | color: black; 44 | } 45 | 46 | table { 47 | border-collapse: collapse; 48 | } 49 | th,td { 50 | border: solid 1px; 51 | padding: 10px; 52 | } 53 | th { 54 | font-family: all-round-gothic, sans-serif; 55 | font-weight: 600; 56 | font-style: normal; 57 | } -------------------------------------------------------------------------------- /rurusetto/wiki/static/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/favicon/favicon.ico -------------------------------------------------------------------------------- /rurusetto/wiki/static/favicon/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/123252.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/123252.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/684477.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/684477.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/701370.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/701370.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/737403.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/737403.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/743487.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/743487.jpeg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/add-recommend-beatmap-cover-light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/add-recommend-beatmap-cover-light.jpg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/add-recommend-beatmap-cover-night.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/add-recommend-beatmap-cover-night.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/add-subpage-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/add-subpage-cover-light.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/add-subpage-cover-night.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/add-subpage-cover-night.jpeg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/archived-rulesets-cover-light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/archived-rulesets-cover-light.jpg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/archived-rulesets-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/archived-rulesets-cover-light.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/archived-rulesets-cover-night.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/archived-rulesets-cover-night.jpg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/changelog-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/changelog-cover-light.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/changelog-cover-light2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/changelog-cover-light2.jpeg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/changelog-cover-light3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/changelog-cover-light3.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/changelog-cover-night.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/changelog-cover-night.jpeg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/changelog-cover-night2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/changelog-cover-night2.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/create-rulesets-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/create-rulesets-cover-light.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/create-rulesets-cover-night.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/create-rulesets-cover-night.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/default-beatmap-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/default-beatmap-background.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/default.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/default.jpeg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/default.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/download-localization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/download-localization.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/download-rulesets-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/download-rulesets-update.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/download-rulesets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/download-rulesets.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/edit-subpage-cover-light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/edit-subpage-cover-light.jpg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/edit-subpage-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/edit-subpage-cover-light.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/edit-subpage-cover-night.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/edit-subpage-cover-night.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/edit-wiki-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/edit-wiki-cover-light.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/edit-wiki-cover-night.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/edit-wiki-cover-night.jpeg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/get-beatmap-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/get-beatmap-id.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/home-cover-light.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/home-cover-light.jpeg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/home-cover-light2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/home-cover-light2.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/home-cover-night.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/home-cover-night.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/install-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/install-cover-light.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/install-cover-night.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/install-cover-night.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/install-localization-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/install-localization-cover-light.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/install-localization-cover-night.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/install-localization-cover-night.jpg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/installing-localization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/installing-localization.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/installing-rulesets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/installing-rulesets.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/listing-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/listing-cover-light.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/listing-cover-night.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/listing-cover-night.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/localization-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/localization-complete.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/maintainer-cover-light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/maintainer-cover-light.jpg -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/maintainer-cover-night.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/maintainer-cover-night.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/maintainer-cover-night2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/maintainer-cover-night2.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/open-osu-folder-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/open-osu-folder-update.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/open-osu-folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/open-osu-folder.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/rulesets-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/rulesets-complete.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/status-cover-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/status-cover-light.png -------------------------------------------------------------------------------- /rurusetto/wiki/static/img/status-cover-night.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/static/img/status-cover-night.jpg -------------------------------------------------------------------------------- /rurusetto/wiki/static/js/wiki.js: -------------------------------------------------------------------------------- 1 | window.onload = function() {arrangeWIki()}; 2 | 3 | function arrangeWIki() { 4 | if (document.documentElement.clientWidth <= 991) { 5 | document.getElementById("infobox").classList.remove('col-sm-3'); 6 | document.getElementById("wiki").classList.remove('col-sm-9'); 7 | } else { 8 | document.getElementById("infobox").classList.add('col-sm-3'); 9 | document.getElementById("wiki").classList.add('col-sm-9'); 10 | } 11 | } -------------------------------------------------------------------------------- /rurusetto/wiki/templates/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/templates/__init__.py -------------------------------------------------------------------------------- /rurusetto/wiki/templates/wiki/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/templates/wiki/__init__.py -------------------------------------------------------------------------------- /rurusetto/wiki/templates/wiki/add_recommend_beatmap.html: -------------------------------------------------------------------------------- 1 | {% extends "wiki/base.html" %} 2 | {% load static %} 3 | {% load i18n %} 4 | {% block content %} 5 | 6 |
    7 |
    8 |
    9 |

    10 |

    {% trans "add_recommend_beatmap_header" %}

    11 |

    {% blocktrans with ruleset_name=ruleset.name %}You are currently add a new recommend beatmap for {{ruleset_name}}.{% endblocktrans %}

    12 |
    13 |
    14 |
    15 | 16 |
    17 |
    18 | {% if messages %} 19 | {% for message in messages %} 20 | {% if message.tags == "success"%} 21 |
    22 | {{ message }} 23 |
    24 | {% endif %} 25 | {% if message.tags == "error"%} 26 |
    27 | {{ message }} 28 |
    29 | {% endif %} 30 | {% endfor %} 31 | {% endif %} 32 |
    33 |
    34 |
    35 | {% csrf_token %} 36 |
    37 |
    38 | 39 |
    40 | 41 |

    {{ form.beatmap_id.errors }}

    42 |

    {% trans "put_beatmap_id_note" %}

    43 |

    {% trans "put_beatmap_id_note2" %}

    44 |

    {% trans "put_beatmap_id_example" %}

    45 | {% trans 'put_beatmap_id_example_pic_alt' %} 46 |
    47 |
    48 |
    49 |
    50 |
    51 | 52 |
    53 | 54 |

    {{ form.comment.errors }}

    55 |

    {% trans "comment_note" %}

    56 |
    57 |
    58 |
    59 | 60 |
    61 |
    62 |
    63 | 64 |

    65 | 66 |
    67 | {% endblock content %} 68 | -------------------------------------------------------------------------------- /rurusetto/wiki/templates/wiki/add_subpage.html: -------------------------------------------------------------------------------- 1 | {% extends "wiki/base.html" %} 2 | {% load static %} 3 | {% load i18n %} 4 | {% block content %} 5 | 6 |
    7 |
    8 |
    9 |

    10 |

    {% trans "add_subpage_header" %}

    11 |

    {{ opengraph_description }}

    12 |
    13 |
    14 |
    15 | 16 |
    17 |
    18 | {% if messages %} 19 | {% for message in messages %} 20 | {% if message.tags == "success"%} 21 |
    22 | {{ message }} 23 |
    24 | {% endif %} 25 | {% if message.tags == "error"%} 26 |
    27 | {{ message }} 28 |
    29 | {% endif %} 30 | {% endfor %} 31 | {% endif %} 32 |
    33 |
    34 |
    35 | {% csrf_token %} 36 |
    37 |
    38 | 39 |
    40 | 41 |

    {{ form.title.errors }}

    42 |

    {% trans "title_description" %}

    43 |
    44 |
    45 |
    46 |

    {% trans "subpage_content" %}

    47 | {{ form.media }} 48 | {{ form.content }} 49 |

    {% trans "publication" %}

    50 |
    51 |
    52 | 53 |
    54 |
    55 | {{ form.hidden }} 56 |
    57 |

    {{ form.hidden.errors }}

    58 |

    {% trans "subpage_hidden_note" %}

    59 |
    60 |
    61 |
    62 | 63 |
    64 |
    65 |
    66 | 67 |

    68 | 69 |
    70 | {% endblock content %} -------------------------------------------------------------------------------- /rurusetto/wiki/templates/wiki/changelog.html: -------------------------------------------------------------------------------- 1 | {% extends "wiki/base.html" %} 2 | {% load static %} 3 | {% load markdown_converter %} 4 | {% load i18n %} 5 | {% block content %} 6 | 7 | 8 | 9 |
    10 |
    11 |
    12 |

    13 |

    14 |

    {% trans "changelog" %}

    15 |

    {% trans "changelog_description" %}

    16 |
    17 |
    18 |
    19 | 20 |
    21 | 22 |

    23 | 24 | {# TODO: Add 'add changelog' button#} 25 | 26 |
    27 | {% for changelog in changelog_list %} 28 |
    29 | {% if changelog.type == "pre-release" %} 30 |

    {{ changelog.version }} {% trans "pre_release" %}

    31 | {% endif %} 32 | {% if changelog.type == "stable" %} 33 |

    {{ changelog.version }} {% trans "stable" %}

    34 | {% endif %} 35 |

    {% trans "release_at" %} {{ changelog.time|date:"F j, Y h:i A" }} UTC

    36 | 37 |
    38 | {{ changelog.note | convert_markdown | safe }} 39 |
    40 | 41 |
    42 | {% endfor %} 43 |
    44 | 45 | 46 |
    47 | 48 |
    49 | {% endblock content %} -------------------------------------------------------------------------------- /rurusetto/wiki/templates/wiki/recommend_beatmap_approval.html: -------------------------------------------------------------------------------- 1 | {% extends "wiki/base.html" %} 2 | {% load static %} 3 | {% load i18n %} 4 | {% load convert_star_rating %} 5 | {% block content %} 6 | 7 | 8 | 9 |
    10 |
    11 |
    12 |

    13 |

    {% blocktrans with ruleset_name=ruleset.name %}{{ ruleset_name }} recommended beatmaps approval{% endblocktrans %}

    14 |

    {% trans "recommend_beatmaps_approval_description" %}

    15 |
    16 |
    17 |
    18 | 19 |
    20 |
    21 | {% if user.is_authenticated %} 22 | 25 | {% else %} 26 |

    27 | {% endif %} 28 |
    29 |
    30 | 31 |
    32 |
    33 | {% if messages %} 34 | {% for message in messages %} 35 | {% if message.tags == "success"%} 36 |
    37 | {{ message }} 38 |
    39 | {% endif %} 40 | {% if message.tags == "error"%} 41 |
    42 | {{ message }} 43 |
    44 | {% endif %} 45 | {% endfor %} 46 | {% endif %} 47 |
    48 | 49 | {% if beatmap_list %} 50 |
    51 | {% for beatmap in beatmap_list %} 52 | {% include "wiki/snippets/beatmap_approval_card.html" %} 53 | {% endfor %} 54 |
    55 | {% endif %} 56 | 57 | {% if no_beatmap %} 58 |
    59 |

    \ (•◡•) /

    60 |

    {% trans "already_approve_all_beatmaps" %}

    61 |

    {% trans "congrats" %}

    62 |
    63 | {% endif %} 64 |
    65 | 66 |

    67 | 68 | {% endblock content %} 69 | 70 | {% block js %} 71 | 72 | 73 | 78 | {% endblock %} 79 | 80 | -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rurusetto/rurusetto/6576bb98f065662a90d7adec2f473ce0a07e301c/rurusetto/wiki/templatetags/__init__.py -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/constants.py: -------------------------------------------------------------------------------- 1 | """Constants of osu! api. 2 | 3 | It is not really constant because osu! API may change. 4 | """ 5 | 6 | languages = { 7 | 0: "Any", 8 | 1: "Unspecified", 9 | 2: "English", 10 | 3: "Japanese", 11 | 4: "Chinese", 12 | 5: "Instrumental", 13 | 6: "Korean", 14 | 7: "French", 15 | 8: "German", 16 | 9: "Swedish", 17 | 10: "Spanish", 18 | 11: "Italian", 19 | 12: "Russian", 20 | 13: "Polish", 21 | 14: "Other" 22 | # Default value is Unknown. 23 | } 24 | 25 | genres = { 26 | 0: "Any", 27 | 1: "Unspecified", 28 | 2: "Video Game", 29 | 3: "Anime", 30 | 4: "Rock", 31 | 5: "Pop", 32 | 6: "Other", 33 | 7: "Novelty", 34 | # 8 is missing. 35 | 9: "Hip-hop", 36 | 10: "Electronic", 37 | 11: "Metal", 38 | 12: "Classical", 39 | 13: "Folk", 40 | 14: "Jazz", 41 | # Default is unknown. 42 | } -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/convert_file_size.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | register = template.Library() 4 | 5 | 6 | def convert_file_size(value, suffix="B"): 7 | for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]: 8 | if abs(value) < 1024.0: 9 | return f"{value:3.1f} {unit}{suffix}" 10 | value /= 1024.0 11 | return f"{value:.1f} Yi{suffix}" 12 | 13 | 14 | register.filter('convert_file_size', convert_file_size) 15 | -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/convert_star_rating.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | register = template.Library() 4 | 5 | 6 | def convert_star_rating(value): 7 | try: 8 | return round(float(value), 2) 9 | except ValueError: 10 | return None 11 | 12 | 13 | register.filter('convert_star_rating', convert_star_rating) 14 | -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/get_genre_name.py: -------------------------------------------------------------------------------- 1 | from typing import Union 2 | from django import template 3 | from . import constants 4 | 5 | register = template.Library() 6 | 7 | 8 | def get_genre_name(genre_id: Union[str, int]): 9 | """Get genre name from osu! genre id.""" 10 | genre_id = int(genre_id) 11 | return constants.genres.get(genre_id, "Unknown") 12 | 13 | register.filter('get_genre_name', get_genre_name) -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/get_language_name.py: -------------------------------------------------------------------------------- 1 | from typing import Union 2 | from django import template 3 | from . import constants 4 | 5 | register = template.Library() 6 | 7 | 8 | def get_language_name(language_id: Union[str, int]): 9 | """Get language from osu! language id.""" 10 | language_id = int(language_id) 11 | return constants.languages.get(language_id, "Unknown") 12 | 13 | register.filter('get_language_name', get_language_name) -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/length_format.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from time import strftime, gmtime 3 | 4 | register = template.Library() 5 | 6 | 7 | def length_format(length): 8 | """Convert second to minutes and second. Mainly use in beatmap time length. 9 | Args: 10 | length (int): Length of the beatmap in second. 11 | Returns: 12 | str: Formatted length of the beatmap. 13 | """ 14 | if type(length) is not int: 15 | try: 16 | length = int(length) 17 | except ValueError: 18 | return "0:00" 19 | if length >= 3600: 20 | return strftime("%H:%M:%S", gmtime(length)) 21 | return strftime("%M:%S", gmtime(int(length))) 22 | 23 | 24 | register.filter('length_format', length_format) -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/markdown_converter.py: -------------------------------------------------------------------------------- 1 | import markdown 2 | from django import template 3 | 4 | register = template.Library() 5 | 6 | 7 | def convert_markdown(value): 8 | return markdown.markdown(value, extensions=['fenced_code', 'codehilite', 'tables', 'nl2br', 'toc', 9 | 'attr_list']) 10 | 11 | 12 | register.filter('convert_markdown', convert_markdown) 13 | -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/round_up.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | import math 3 | 4 | register = template.Library() 5 | 6 | 7 | def round_up(value): 8 | """ 9 | Rounds up a value to the nearest integer. 10 | Arguments: 11 | value (float): The value to round up. 12 | Returns: 13 | int: The rounded up value. 14 | """ 15 | try: 16 | return int(math.ceil(float(value))) 17 | except ValueError: 18 | return value 19 | 20 | 21 | register.filter('round_up', round_up) -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/settings_value.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.conf import settings 3 | 4 | register = template.Library() 5 | 6 | 7 | # settings value 8 | @register.simple_tag 9 | def settings_value(name): 10 | return getattr(settings, name, "") -------------------------------------------------------------------------------- /rurusetto/wiki/templatetags/thousand_seperator.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | register = template.Library() 4 | 5 | 6 | def thousand_seperator(value): 7 | """ 8 | Get an integer value and return string value with thousand seperator. 9 | Args: 10 | value (float): The integer value that you want to add thousand seperator. 11 | Returns: 12 | str: The string that is the number with thousand seperator. 13 | """ 14 | try: 15 | return str(f'{int(value):,}') 16 | except ValueError: 17 | return str(value) 18 | 19 | 20 | register.filter('thousand_seperator', thousand_seperator) -------------------------------------------------------------------------------- /rurusetto/wiki/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | urlpatterns = [ 5 | path('', views.home, name='home'), 6 | path('rulesets', views.listing, name='listing'), 7 | path('archived', views.archived_rulesets, name='archived_rulesets'), 8 | path('new', views.create_ruleset, name='create_ruleset'), 9 | path('changelog', views.changelog, name='changelog'), 10 | path('rulesets/', views.wiki_page, name='wiki'), 11 | path('rulesets//beatmaps', views.recommend_beatmap, name='recommend_beatmap'), 12 | path('rulesets//edit', views.edit_ruleset_wiki, name='edit_wiki'), 13 | path('rulesets//new/subpage', views.add_subpage, name='add_subpage'), 14 | path('rulesets//', views.subpage, name='subpage'), 15 | path('rulesets///edit', views.edit_subpage, name='edit_subpage'), 16 | path('rulesets///delete', views.delete_subpage, name='delete_subpage'), 17 | path('rulesets//new/beatmaps', views.add_recommend_beatmap, name='add_recommend_beatmap'), 18 | path('rulesets//manage/beatmaps', views.recommend_beatmap_approval, name='recommend_beatmap_approval'), 19 | path('rulesets//manage/beatmaps/approve/', views.approve_recommend_beatmap, name='approve_recommend_beatmap'), 20 | path('rulesets//manage/beatmaps/deny/', views.deny_recommend_beatmap, name='deny_recommend_beatmap'), 21 | path('install/rulesets', views.install, name='install'), 22 | path('install/localization', views.install_localization_page, name='install_localization_page'), 23 | path('status', views.status, name='status'), 24 | path('maintainer', views.maintainer_menu, name='maintainer'), 25 | path('action/maintainer/update-beatmap', views.update_beatmap_action, name='update_beatmap_action'), 26 | path('action/maintainer/update-ruleset-version', views.update_ruleset_status_action, name='update_ruleset_version'), 27 | path('action/maintainer/update-ruleset-version-once', views.update_ruleset_status_once_action, name='update_ruleset_version_once_action'), 28 | path('action/update/action_log/', views.check_action_log, name='check_action_log'), 29 | # Fallback URL path for redirect user who use old website link to the new website path 30 | path('pages/', views.redirect_from_old_link, name='redirect_from_old_link'), 31 | path('posts/', views.redirect_from_old_link, name='redirect_from_old_link_posts') 32 | ] 33 | --------------------------------------------------------------------------------