├── files
└── .gitkeep
├── scpdev
├── __init__.py
└── asgi.py
├── web
├── __init__.py
├── views
│ ├── __init__.py
│ └── sus_users.py
├── controllers
│ └── __init__.py
├── management
│ ├── __init__.py
│ └── commands
│ │ └── __init__.py
├── migrations
│ ├── __init__.py
│ ├── 0025_merge_20220906_1945.py
│ ├── 0035_current_users_are_editors.py
│ ├── 0064_remove_article_author.py
│ ├── 0009_assign_author_to_articles.py
│ ├── 0016_lower_article_ids.py
│ ├── 0066_actionlogentry_user_origin_ip_idx.py
│ ├── 0033_vote_date.py
│ ├── 0007_alter_articleversion_ast.py
│ ├── 0020_forumthread_is_pinned.py
│ └── 0049_category_is_indexed.py
├── templatetags
│ ├── __init__.py
│ └── filters.py
├── templates
│ ├── seeds
│ │ ├── main.ftml
│ │ ├── forum
│ │ │ ├── thread.ftml
│ │ │ ├── category.ftml
│ │ │ ├── new-thread.ftml
│ │ │ ├── recent-posts.ftml
│ │ │ └── start.ftml
│ │ └── nav
│ │ │ ├── side.ftml
│ │ │ └── top.ftml
│ ├── page_403.html
│ ├── page_404.html
│ ├── admin
│ │ └── web
│ │ │ ├── role
│ │ │ ├── change_list.html
│ │ │ └── change_form.html
│ │ │ ├── user
│ │ │ ├── change_list.html
│ │ │ ├── submit_line.html
│ │ │ └── sus.html
│ │ │ └── category
│ │ │ └── change_form.html
│ ├── no_site.html
│ ├── mails
│ │ └── invite_email.txt
│ ├── login
│ │ ├── password_reset_complete.html
│ │ └── password_reset_done.html
│ └── profile
│ │ └── change.html
├── js
│ ├── reactive
│ │ ├── pages
│ │ │ ├── profile
│ │ │ │ └── index.ts
│ │ │ ├── search
│ │ │ │ └── index.ts
│ │ │ └── notifications
│ │ │ │ └── index.ts
│ │ ├── containers
│ │ │ └── page
│ │ │ │ ├── index.ts
│ │ │ │ └── Navigation.tsx
│ │ ├── config
│ │ │ ├── index.ts
│ │ │ ├── ConfigContext.types.ts
│ │ │ ├── ConfigContext.hooks.ts
│ │ │ ├── ConfigContext.context.ts
│ │ │ └── ConfigContext.provider.tsx
│ │ ├── theme
│ │ │ ├── Theme.d.ts
│ │ │ └── Theme.types.ts
│ │ └── paths.ts
│ ├── util
│ │ ├── async-sleep.ts
│ │ ├── const-callback.ts
│ │ └── react-render-into.ts
│ ├── .prettierrc
│ ├── articles
│ │ ├── codeblock.tsx
│ │ └── auto-resize-iframe.ts
│ └── api
│ │ ├── preview.ts
│ │ ├── modules.ts
│ │ └── tags.ts
├── fields
│ └── __init__.py
├── signals.py
├── apps.py
├── models
│ └── __init__.py
├── util
│ ├── http.py
│ └── css.py
└── dynamic_preferences_registry.py
├── shared_data
└── __init__.py
├── ftml
├── docs
│ └── README.md
├── .editorconfig
├── scripts
│ ├── check_conf-requirements.txt
│ ├── validate_json.sh
│ ├── ast_stub.sh
│ └── ast_diff.sh
├── .rustfmt.toml
├── .gitignore
├── .tarpaulin.toml
└── build.rs
├── .github
└── FUNDING.yml
├── static
├── .gitignore
├── rat
│ ├── rat.mp3
│ ├── vertical-rat.gif
│ └── horizontal-rat.gif
├── images
│ ├── logo20.png
│ ├── scp-bg.png
│ ├── scp-logo.png
│ ├── anon_avatar.png
│ ├── progressbar.gif
│ ├── yui
│ │ └── sprite.png
│ ├── default_avatar.png
│ ├── editor
│ │ ├── icons1.png
│ │ ├── icons2.png
│ │ └── icons3.png
│ ├── progresscircle.gif
│ ├── scp-bg-reverse.png
│ ├── wikidot_avatar.png
│ ├── indicator_medium.gif
│ └── background
│ │ ├── opacity2.png
│ │ └── shade2_n.png
├── fonts
│ ├── Sans-Normalcy.woff2
│ ├── Inter-roman.var.woff2
│ ├── Inter-italic.var.woff2
│ ├── NanumGothic-Bold.woff2
│ └── NanumGothic-Regular.woff2
└── fontawesome
│ ├── webfonts
│ ├── fa-solid-900.eot
│ ├── fa-solid-900.ttf
│ ├── fa-brands-400.eot
│ ├── fa-brands-400.ttf
│ ├── fa-brands-400.woff
│ ├── fa-brands-400.woff2
│ ├── fa-regular-400.eot
│ ├── fa-regular-400.ttf
│ ├── fa-regular-400.woff
│ ├── fa-solid-900.woff
│ ├── fa-solid-900.woff2
│ └── fa-regular-400.woff2
│ ├── less
│ ├── _screen-reader.less
│ ├── _fixed-width.less
│ ├── v4-shims.less
│ ├── _core.less
│ ├── _animated.less
│ ├── _list.less
│ └── _bordered-pulled.less
│ ├── scss
│ ├── _fixed-width.scss
│ ├── _screen-reader.scss
│ ├── v4-shims.scss
│ ├── _animated.scss
│ ├── _list.scss
│ ├── _core.scss
│ ├── _larger.scss
│ ├── fontawesome.scss
│ └── _bordered-pulled.scss
│ ├── attribution.js
│ └── svgs
│ ├── solid
│ ├── square-full.svg
│ ├── egg.svg
│ ├── circle.svg
│ ├── bookmark.svg
│ ├── sort-down.svg
│ ├── sort-up.svg
│ ├── stop.svg
│ ├── square.svg
│ ├── play.svg
│ ├── minus.svg
│ ├── window-minimize.svg
│ ├── caret-down.svg
│ ├── volume-off.svg
│ ├── cheese.svg
│ ├── folder.svg
│ ├── ice-cream.svg
│ ├── mouse.svg
│ ├── comment-alt.svg
│ ├── star-half.svg
│ ├── sd-card.svg
│ ├── caret-right.svg
│ ├── genderless.svg
│ ├── hockey-puck.svg
│ ├── adjust.svg
│ ├── caret-up.svg
│ ├── columns.svg
│ ├── bread-slice.svg
│ ├── caret-left.svg
│ ├── location-arrow.svg
│ ├── map-marker.svg
│ ├── border-all.svg
│ ├── dot-circle.svg
│ ├── minus-circle.svg
│ ├── mobile.svg
│ ├── stop-circle.svg
│ ├── tablet.svg
│ ├── voicemail.svg
│ ├── window-maximize.svg
│ ├── paragraph.svg
│ ├── play-circle.svg
│ ├── file.svg
│ ├── glass-whiskey.svg
│ ├── angle-left.svg
│ ├── angle-up.svg
│ ├── dice-one.svg
│ ├── slash.svg
│ ├── step-backward.svg
│ ├── step-forward.svg
│ ├── sticky-note.svg
│ ├── toggle-on.svg
│ ├── angle-down.svg
│ ├── angle-right.svg
│ ├── sort.svg
│ ├── grip-lines.svg
│ ├── table.svg
│ ├── bolt.svg
│ ├── burn.svg
│ ├── chalkboard.svg
│ ├── filter.svg
│ ├── heart.svg
│ ├── italic.svg
│ ├── glass-martini.svg
│ ├── grip-lines-vertical.svg
│ ├── lock.svg
│ ├── minus-square.svg
│ ├── pause.svg
│ ├── seedling.svg
│ ├── tv.svg
│ ├── ellipsis-v.svg
│ ├── meh-blank.svg
│ ├── paper-plane.svg
│ ├── battery-empty.svg
│ ├── box.svg
│ ├── clock.svg
│ ├── comment.svg
│ ├── ellipsis-h.svg
│ ├── forward.svg
│ ├── qrcode.svg
│ ├── record-vinyl.svg
│ ├── suitcase.svg
│ ├── caret-square-down.svg
│ ├── neuter.svg
│ ├── sign.svg
│ ├── utensil-spoon.svg
│ ├── backward.svg
│ ├── desktop.svg
│ ├── equals.svg
│ ├── trash.svg
│ ├── coffee.svg
│ ├── cross.svg
│ ├── long-arrow-alt-up.svg
│ ├── map.svg
│ ├── plug.svg
│ ├── plus.svg
│ ├── video.svg
│ ├── battery-full.svg
│ ├── battery-half.svg
│ ├── chart-area.svg
│ ├── clone.svg
│ ├── folder-minus.svg
│ ├── heart-broken.svg
│ ├── icicles.svg
│ ├── long-arrow-alt-down.svg
│ ├── long-arrow-alt-left.svg
│ ├── long-arrow-alt-right.svg
│ ├── music.svg
│ ├── pen.svg
│ ├── arrow-alt-circle-up.svg
│ ├── battery-quarter.svg
│ ├── chevron-left.svg
│ ├── hard-hat.svg
│ ├── industry.svg
│ ├── tenge.svg
│ ├── user-alt.svg
│ ├── arrow-alt-circle-right.svg
│ ├── arrow-down.svg
│ ├── arrow-left.svg
│ ├── arrow-up.svg
│ ├── battery-three-quarters.svg
│ ├── cloud.svg
│ ├── map-marker-alt.svg
│ ├── user-tie.svg
│ ├── wave-square.svg
│ ├── arrow-alt-circle-down.svg
│ ├── arrow-alt-circle-left.svg
│ ├── arrow-right.svg
│ ├── glass-martini-alt.svg
│ ├── star.svg
│ ├── user.svg
│ ├── laptop.svg
│ ├── mountain.svg
│ ├── shield-alt.svg
│ ├── archive.svg
│ ├── chevron-circle-up.svg
│ ├── ethernet.svg
│ ├── mitten.svg
│ ├── phone-alt.svg
│ ├── briefcase.svg
│ ├── brush.svg
│ ├── check.svg
│ ├── chevron-circle-right.svg
│ ├── compact-disc.svg
│ ├── dice-two.svg
│ ├── divide.svg
│ ├── exclamation.svg
│ ├── fast-backward.svg
│ ├── fire.svg
│ ├── gem.svg
│ ├── hospital-symbol.svg
│ ├── meh.svg
│ ├── chevron-circle-down.svg
│ ├── chevron-circle-left.svg
│ ├── door-closed.svg
│ ├── fast-forward.svg
│ ├── pause-circle.svg
│ ├── unlock.svg
│ ├── lock-open.svg
│ ├── mobile-alt.svg
│ ├── parking.svg
│ ├── phone.svg
│ ├── plus-circle.svg
│ ├── tablet-alt.svg
│ ├── tape.svg
│ ├── wine-glass.svg
│ ├── caret-square-up.svg
│ ├── chevron-down.svg
│ ├── chevron-right.svg
│ ├── chevron-up.svg
│ ├── eject.svg
│ ├── surprise.svg
│ ├── tag.svg
│ ├── bowling-ball.svg
│ ├── caret-square-left.svg
│ ├── caret-square-right.svg
│ ├── cube.svg
│ ├── less-than.svg
│ ├── level-down-alt.svg
│ ├── level-up-alt.svg
│ └── mouse-pointer.svg
│ ├── brands
│ ├── houzz.svg
│ ├── flipboard.svg
│ ├── unsplash.svg
│ ├── yandex-international.svg
│ ├── ethereum.svg
│ ├── bandcamp.svg
│ ├── black-tie.svg
│ ├── strava.svg
│ ├── microsoft.svg
│ ├── gitter.svg
│ ├── vuejs.svg
│ ├── css3.svg
│ ├── think-peaks.svg
│ ├── windows.svg
│ ├── y-combinator.svg
│ ├── mix.svg
│ ├── google-drive.svg
│ ├── uikit.svg
│ ├── viacoin.svg
│ ├── angular.svg
│ ├── patreon.svg
│ ├── modx.svg
│ ├── npm.svg
│ ├── deviantart.svg
│ ├── facebook-f.svg
│ ├── servicestack.svg
│ ├── dyalog.svg
│ ├── instalod.svg
│ ├── adn.svg
│ ├── dochub.svg
│ ├── hacker-news.svg
│ ├── firstdraft.svg
│ ├── artstation.svg
│ ├── html5.svg
│ ├── magento.svg
│ ├── twitch.svg
│ ├── yahoo.svg
│ ├── yandex.svg
│ ├── autoprefixer.svg
│ ├── jira.svg
│ ├── monero.svg
│ ├── buysellads.svg
│ ├── cloudsmith.svg
│ ├── maxcdn.svg
│ ├── tiktok.svg
│ ├── stack-overflow.svg
│ ├── bitbucket.svg
│ ├── dropbox.svg
│ ├── stack-exchange.svg
│ ├── css3-alt.svg
│ ├── dashcube.svg
│ ├── kaggle.svg
│ ├── google.svg
│ ├── elementor.svg
│ ├── google-play.svg
│ ├── korvue.svg
│ ├── telegram-plane.svg
│ ├── cuttlefish.svg
│ ├── gg.svg
│ ├── gratipay.svg
│ ├── openid.svg
│ ├── product-hunt.svg
│ ├── fulcrum.svg
│ ├── sourcetree.svg
│ ├── discourse.svg
│ ├── facebook-square.svg
│ ├── facebook.svg
│ ├── rockrms.svg
│ ├── unity.svg
│ ├── hotjar.svg
│ ├── deezer.svg
│ ├── gitlab.svg
│ ├── hacker-news-square.svg
│ ├── markdown.svg
│ ├── sistrix.svg
│ ├── envira.svg
│ └── atlassian.svg
│ └── regular
│ ├── window-minimize.svg
│ ├── bookmark.svg
│ ├── circle.svg
│ ├── window-maximize.svg
│ ├── square.svg
│ ├── star-half.svg
│ ├── file.svg
│ ├── folder.svg
│ ├── window-restore.svg
│ ├── stop-circle.svg
│ ├── calendar.svg
│ ├── play-circle.svg
│ ├── sticky-note.svg
│ └── comment-alt.svg
├── modules
├── _csrf_protection.py
├── pagedescription.py
├── pageimage.py
└── redirect.py
├── entrypoint.sh
├── .gitignore
├── .dockerignore
└── requirements.txt
/files/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/scpdev/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/shared_data/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/views/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/controllers/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/management/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/templatetags/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ftml/docs/README.md:
--------------------------------------------------------------------------------
1 | ../README.md
--------------------------------------------------------------------------------
/web/management/commands/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ftml/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.json]
2 | indent_size = 4
3 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | custom: ['https://boosty.to/scpfanpage']
--------------------------------------------------------------------------------
/static/.gitignore:
--------------------------------------------------------------------------------
1 | app.js
2 | app.js.map
3 | highlight.js.css
--------------------------------------------------------------------------------
/web/templates/seeds/main.ftml:
--------------------------------------------------------------------------------
1 | + Everything seems to be working properly!
--------------------------------------------------------------------------------
/web/js/reactive/pages/profile/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from './Profile'
2 |
--------------------------------------------------------------------------------
/web/js/reactive/pages/search/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from './Search'
2 |
--------------------------------------------------------------------------------
/ftml/scripts/check_conf-requirements.txt:
--------------------------------------------------------------------------------
1 | inflection>=0.5.0
2 | toml>=0.10.0
3 |
--------------------------------------------------------------------------------
/static/rat/rat.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/rat/rat.mp3
--------------------------------------------------------------------------------
/web/js/reactive/pages/notifications/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from './Notifications'
2 |
--------------------------------------------------------------------------------
/static/images/logo20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/logo20.png
--------------------------------------------------------------------------------
/static/images/scp-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/scp-bg.png
--------------------------------------------------------------------------------
/web/fields/__init__.py:
--------------------------------------------------------------------------------
1 | from .models import *
2 | from .fields import *
3 | from .widgets import *
4 |
--------------------------------------------------------------------------------
/static/images/scp-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/scp-logo.png
--------------------------------------------------------------------------------
/static/rat/vertical-rat.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/rat/vertical-rat.gif
--------------------------------------------------------------------------------
/ftml/scripts/validate_json.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -eu
3 |
4 | exec cargo run --example validate_json -- "$@"
5 |
--------------------------------------------------------------------------------
/static/images/anon_avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/anon_avatar.png
--------------------------------------------------------------------------------
/static/images/progressbar.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/progressbar.gif
--------------------------------------------------------------------------------
/static/images/yui/sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/yui/sprite.png
--------------------------------------------------------------------------------
/static/rat/horizontal-rat.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/rat/horizontal-rat.gif
--------------------------------------------------------------------------------
/static/fonts/Sans-Normalcy.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fonts/Sans-Normalcy.woff2
--------------------------------------------------------------------------------
/static/images/default_avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/default_avatar.png
--------------------------------------------------------------------------------
/static/images/editor/icons1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/editor/icons1.png
--------------------------------------------------------------------------------
/static/images/editor/icons2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/editor/icons2.png
--------------------------------------------------------------------------------
/static/images/editor/icons3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/editor/icons3.png
--------------------------------------------------------------------------------
/static/images/progresscircle.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/progresscircle.gif
--------------------------------------------------------------------------------
/static/images/scp-bg-reverse.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/scp-bg-reverse.png
--------------------------------------------------------------------------------
/static/images/wikidot_avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/wikidot_avatar.png
--------------------------------------------------------------------------------
/web/templates/page_403.html:
--------------------------------------------------------------------------------
1 |
Недостаточно прав для просмотра страницы {{ page_id }} .
2 |
--------------------------------------------------------------------------------
/modules/_csrf_protection.py:
--------------------------------------------------------------------------------
1 | def csrf_safe_method(func):
2 | setattr(func, 'is_csrf_safe', True)
3 | return func
--------------------------------------------------------------------------------
/static/fonts/Inter-roman.var.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fonts/Inter-roman.var.woff2
--------------------------------------------------------------------------------
/static/images/indicator_medium.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/indicator_medium.gif
--------------------------------------------------------------------------------
/web/signals.py:
--------------------------------------------------------------------------------
1 | from django.dispatch import Signal
2 |
3 |
4 | just_after_migration = Signal(['migration', 'action'])
5 |
--------------------------------------------------------------------------------
/static/fonts/Inter-italic.var.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fonts/Inter-italic.var.woff2
--------------------------------------------------------------------------------
/static/fonts/NanumGothic-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fonts/NanumGothic-Bold.woff2
--------------------------------------------------------------------------------
/static/images/background/opacity2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/background/opacity2.png
--------------------------------------------------------------------------------
/static/images/background/shade2_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/images/background/shade2_n.png
--------------------------------------------------------------------------------
/web/js/reactive/containers/page/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from './Page'
2 | export { ProfilePage } from './ProfilePage'
3 |
--------------------------------------------------------------------------------
/static/fonts/NanumGothic-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fonts/NanumGothic-Regular.woff2
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-solid-900.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-solid-900.eot
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-solid-900.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-solid-900.ttf
--------------------------------------------------------------------------------
/ftml/.rustfmt.toml:
--------------------------------------------------------------------------------
1 | # What rust edition to use
2 | edition = "2021"
3 |
4 | # Formatting options
5 | max_width = 90
6 | reorder_imports = true
7 |
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-brands-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-brands-400.eot
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-brands-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-brands-400.ttf
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-brands-400.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-brands-400.woff
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-brands-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-brands-400.woff2
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-regular-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-regular-400.eot
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-regular-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-regular-400.ttf
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-regular-400.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-regular-400.woff
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-solid-900.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-solid-900.woff
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-solid-900.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-solid-900.woff2
--------------------------------------------------------------------------------
/web/js/reactive/config/index.ts:
--------------------------------------------------------------------------------
1 | export { useConfigContext } from './ConfigContext.hooks'
2 | export { default } from './ConfigContext.provider'
3 |
--------------------------------------------------------------------------------
/web/templates/seeds/forum/thread.ftml:
--------------------------------------------------------------------------------
1 | [[module ForumThread]]
2 |
3 | [!-- please do not alter this page if you want to keep your forum working --]
--------------------------------------------------------------------------------
/static/fontawesome/webfonts/fa-regular-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SCPru/RuFoundation/HEAD/static/fontawesome/webfonts/fa-regular-400.woff2
--------------------------------------------------------------------------------
/web/templates/seeds/forum/category.ftml:
--------------------------------------------------------------------------------
1 | [[module ForumCategory]]
2 |
3 | [!-- please do not alter this page if you want to keep your forum working --]
--------------------------------------------------------------------------------
/web/templates/seeds/forum/new-thread.ftml:
--------------------------------------------------------------------------------
1 | [[module ForumNewThread]]
2 |
3 | [!-- please do not alter this page if you want to keep your forum working --]
--------------------------------------------------------------------------------
/web/templates/seeds/forum/recent-posts.ftml:
--------------------------------------------------------------------------------
1 | [[module RecentPosts]]
2 |
3 | [!-- please do not alter this page if you want to keep your forum working --]
--------------------------------------------------------------------------------
/web/js/reactive/config/ConfigContext.types.ts:
--------------------------------------------------------------------------------
1 | import { UserData } from '~api/user'
2 |
3 | export interface IConfigContext {
4 | user: UserData
5 | }
6 |
--------------------------------------------------------------------------------
/web/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class WebConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'web'
7 |
--------------------------------------------------------------------------------
/web/js/util/async-sleep.ts:
--------------------------------------------------------------------------------
1 | export default function sleep(amt: number): Promise {
2 | return new Promise(resolve => {
3 | setTimeout(resolve, amt)
4 | })
5 | }
6 |
--------------------------------------------------------------------------------
/static/fontawesome/less/_screen-reader.less:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { .sr-only(); }
5 | .sr-only-focusable { .sr-only-focusable(); }
6 |
--------------------------------------------------------------------------------
/static/fontawesome/less/_fixed-width.less:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .@{fa-css-prefix}-fw {
4 | text-align: center;
5 | width: (20em / 16);
6 | }
7 |
--------------------------------------------------------------------------------
/static/fontawesome/scss/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .#{$fa-css-prefix}-fw {
4 | text-align: center;
5 | width: $fa-fw-width;
6 | }
7 |
--------------------------------------------------------------------------------
/entrypoint.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | echo Starting migrations...
4 | python manage.py migrate
5 |
6 | echo Starting server...
7 | exec gunicorn scpdev.wsgi -w 32 -t 300 -b 0.0.0.0:8000 --preload
--------------------------------------------------------------------------------
/static/fontawesome/scss/_screen-reader.scss:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { @include sr-only; }
5 | .sr-only-focusable { @include sr-only-focusable; }
6 |
--------------------------------------------------------------------------------
/ftml/.gitignore:
--------------------------------------------------------------------------------
1 | # Artifacts
2 | target/
3 | pkg/
4 |
5 | # Logging
6 | ftml.log
7 |
8 | # Artifacts related to RUFoundation
9 | ftml.pyd
10 | ftml.pyd.old
11 | ftml.so
12 | ftml.so.old
13 |
--------------------------------------------------------------------------------
/web/js/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "tabWidth": 2,
3 | "semi": false,
4 | "singleQuote": true,
5 | "printWidth": 150,
6 | "arrowParens": "avoid",
7 | "plugins": ["prettier-plugin-organize-imports"]
8 | }
9 |
--------------------------------------------------------------------------------
/web/templates/seeds/nav/side.ftml:
--------------------------------------------------------------------------------
1 | ++ Existing pages:
2 |
3 | [[module listpages category="*" separate="False" prependLine="|| **Title** || **Fullname** ||"]]
4 | || %%title_linked%% || %%fullname%% ||
5 | [[/module]]
--------------------------------------------------------------------------------
/static/fontawesome/attribution.js:
--------------------------------------------------------------------------------
1 | console.log(`Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
2 | License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
3 | `)
--------------------------------------------------------------------------------
/web/js/reactive/theme/Theme.d.ts:
--------------------------------------------------------------------------------
1 | import 'styled-components'
2 |
3 | import { ReactTheme } from './Theme.types'
4 |
5 | declare module 'styled-components' {
6 | export interface DefaultTheme extends ReactTheme {}
7 | }
8 |
--------------------------------------------------------------------------------
/web/js/reactive/config/ConfigContext.hooks.ts:
--------------------------------------------------------------------------------
1 | import { useContext } from 'react'
2 | import ConfigContext from './ConfigContext.context'
3 |
4 | export function useConfigContext() {
5 | return useContext(ConfigContext)
6 | }
7 |
--------------------------------------------------------------------------------
/web/templates/page_404.html:
--------------------------------------------------------------------------------
1 | {% if allow_create %}
2 |
3 | {% else %}
4 | Запрашиваемая вами страница {{ page_id }} не существует.
5 | {% endif %}
--------------------------------------------------------------------------------
/web/templates/seeds/forum/start.ftml:
--------------------------------------------------------------------------------
1 | [[div class="new-post"]]
2 | [[[forum:recent-posts|Новые сообщения форума]]]
3 | [[/div]]
4 |
5 | [[module ForumStart]]
6 |
7 | [!-- please do not alter this page if you want to keep your forum working --]
--------------------------------------------------------------------------------
/web/js/reactive/paths.ts:
--------------------------------------------------------------------------------
1 | export const Paths = {
2 | notifications: '/notifications',
3 | notificationsAll: '/notifications/all',
4 | notificationsUnread: '/notifications/unread',
5 | profile: '/profile',
6 | search: '/search',
7 | }
8 |
--------------------------------------------------------------------------------
/web/templates/seeds/nav/top.ftml:
--------------------------------------------------------------------------------
1 | [[div class="top-bar"]]
2 | [[include nav:top-impl]]
3 | [[/div]]
4 |
5 | [[div class="mobile-top-bar"]]
6 | [[div class="open-menu"]]
7 | [#side-bar ≡]
8 | [[/div]]
9 | [[include nav:top-impl]]
10 | [[/div]]
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | db.sqlite3
2 | .idea
3 | *.pyc
4 | files/*
5 | !files/.gitkeep
6 | static_dist
7 | static/app.css.map
8 | static/system.css.map
9 | node_modules
10 | *.log
11 | .env
12 | postgresql
13 | archive
14 | *.env
15 | venv
16 | .DS_Store
17 | TODOtions.txt
--------------------------------------------------------------------------------
/web/templates/admin/web/role/change_list.html:
--------------------------------------------------------------------------------
1 | {% extends "adminsortable2/change_list.html" %}
2 | {% block extrastyle %}
3 | {{ block.super }}
4 |
9 | {% endblock %}
--------------------------------------------------------------------------------
/static/fontawesome/scss/v4-shims.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 | @import 'shims';
7 |
--------------------------------------------------------------------------------
/web/js/reactive/config/ConfigContext.context.ts:
--------------------------------------------------------------------------------
1 | import { createContext } from 'react'
2 | import { IConfigContext } from '~reactive/config/ConfigContext.types'
3 |
4 | const ConfigContext = createContext({} as IConfigContext)
5 |
6 | export default ConfigContext
7 |
--------------------------------------------------------------------------------
/modules/pagedescription.py:
--------------------------------------------------------------------------------
1 | def has_content():
2 | return True
3 |
4 |
5 | def render(context, _params, content=''):
6 | content = content.replace('\u00a0', ' ').replace('<', '\\u003c')
7 | if content:
8 | context.og_description = content
9 | return ''
10 |
--------------------------------------------------------------------------------
/modules/pageimage.py:
--------------------------------------------------------------------------------
1 | from renderer.utils import get_resource
2 |
3 |
4 | def has_content():
5 | return False
6 |
7 |
8 | def render(context, _params):
9 | if 'src' in _params:
10 | context.og_image = get_resource(_params['src'], context, True)
11 | return ''
12 |
--------------------------------------------------------------------------------
/static/fontawesome/less/v4-shims.less:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import '_variables.less';
6 | @import '_shims.less';
7 |
--------------------------------------------------------------------------------
/web/models/__init__.py:
--------------------------------------------------------------------------------
1 | from .users import *
2 | from .articles import *
3 | from .files import *
4 | from .forum import *
5 | from .logs import *
6 | from .settings import *
7 | from .site import *
8 | from .users import *
9 | from .search import *
10 | from .roles import *
11 |
--------------------------------------------------------------------------------
/ftml/.tarpaulin.toml:
--------------------------------------------------------------------------------
1 | [all]
2 |
3 | all-features = true
4 |
5 | workspace = true
6 | exclude-files = [
7 | "src/log.rs",
8 | "src/test.rs",
9 | "src/ffi/*",
10 | "src/wasm/*",
11 | ]
12 |
13 | [report]
14 |
15 | out = ["Html", "Xml"]
16 | output-dir = "target/coverage"
17 |
--------------------------------------------------------------------------------
/web/templatetags/filters.py:
--------------------------------------------------------------------------------
1 | from django import template
2 |
3 | register = template.Library()
4 |
5 | @register.filter(name='list_to_string')
6 | def list_to_string(value, separator=''):
7 | if isinstance(value, list):
8 | return separator.join(str(item) for item in value)
9 | return value
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/square-full.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/js/util/const-callback.ts:
--------------------------------------------------------------------------------
1 | import { useCallback, useRef } from 'react'
2 |
3 | export default function useConstCallback any>(callback: T) {
4 | const ref = useRef(callback)
5 | ref.current = callback
6 | return useCallback((...args: Parameters) => ref.current(...args), [])
7 | }
8 |
--------------------------------------------------------------------------------
/ftml/build.rs:
--------------------------------------------------------------------------------
1 | extern crate built;
2 |
3 | use std::env;
4 |
5 | fn main() {
6 | // Generate build information
7 | if let Ok(profile) = env::var("PROFILE") {
8 | println!("cargo:rustc-cfg=build={:?}", &profile);
9 | }
10 |
11 | built::write_built_file().expect("Failed to compile build information!");
12 | }
13 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/houzz.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/egg.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/js/articles/codeblock.tsx:
--------------------------------------------------------------------------------
1 | import hljs from 'highlight.js'
2 |
3 | export function makeCodeBlock(node: HTMLElement) {
4 | // hack: mark node as already processed because it was
5 | if ((node as any)._blockcode) {
6 | return
7 | }
8 | ;(node as any)._blockcode = true
9 | // end hack
10 |
11 | hljs.highlightElement(node)
12 | }
13 |
--------------------------------------------------------------------------------
/modules/redirect.py:
--------------------------------------------------------------------------------
1 | from renderer.utils import validate_url, get_boolean_param
2 |
3 |
4 | def render(context, params):
5 | params = {**(context.path_params if context else {}), **params}
6 | if get_boolean_param(params, 'noredirect'):
7 | return ''
8 | context.redirect_to = validate_url(params['destination'])
9 | return ''
10 |
--------------------------------------------------------------------------------
/web/util/http.py:
--------------------------------------------------------------------------------
1 | def validate_mime(mime1: str, mime2: str):
2 | type1, subtype1 = mime1.split('/')
3 | type2, subtype2 = mime2.split('/')
4 |
5 | if type1 == subtype1 == '*' or \
6 | type1 == type2 and \
7 | (subtype1 in ('*', subtype2) or subtype2 in ('*', subtype1)):
8 | return True
9 |
10 | return False
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/bookmark.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/flipboard.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/templates/admin/web/user/change_list.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/change_list.html" %}
2 | {% block object-tools-items %}
3 | {{ block.super }}
4 | Создать бота
5 | Пригласить
6 | {% endblock %}
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | **/node_modules
2 | static_dist
3 | .env
4 | .idea
5 | .git
6 | files
7 | db.sqlite3
8 | postgresql
9 | archive
10 | *.env
11 | *.sh
12 | *.cmd
13 | *.bat
14 | static/app.js
15 | static/app.js.map
16 | static/system.js
17 | static/system.js.map
18 | static/highlight.js.css
19 | ftml/target
20 | ftml/pkg
21 | ftml/*.pyd
22 | ftml/*.so
23 | venv
24 | !entrypoint.sh
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/unsplash.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/less/_core.less:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}, .fas, .far, .fal, .fad, .fab {
5 | -moz-osx-font-smoothing: grayscale;
6 | -webkit-font-smoothing: antialiased;
7 | display: inline-block;
8 | font-style: normal;
9 | font-variant: normal;
10 | text-rendering: auto;
11 | line-height: 1;
12 | }
13 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/yandex-international.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/ethereum.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/templates/admin/web/role/change_form.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/change_form.html" %}
2 |
3 | {% block extrastyle %}
4 | {{ block.super }}
5 |
14 | {% endblock %}
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/bandcamp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/black-tie.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/window-minimize.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/sort-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/sort-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/stop.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/strava.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/square.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/microsoft.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/play.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/gitter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/minus.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/window-minimize.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/vuejs.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/caret-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/volume-off.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/templates/admin/web/category/change_form.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/change_form.html" %}
2 |
3 | {% block extrastyle %}
4 | {{ block.super }}
5 |
14 | {% endblock %}
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/css3.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/cheese.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/folder.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/migrations/0025_merge_20220906_1945.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.0.6 on 2022-09-06 16:45
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('web', '0018_alter_category_options_alter_articleversion_article_and_more'),
10 | ('web', '0024_forumpostversion_author'),
11 | ]
12 |
13 | operations = [
14 | ]
15 |
--------------------------------------------------------------------------------
/web/migrations/0035_current_users_are_editors.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.0.6 on 2023-05-14 19:47
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('web', '0034_category_readers_can_comment_and_more'),
10 | ]
11 |
12 | operations = [
13 | migrations.RunSQL('UPDATE "web_user" SET is_editor=TRUE'),
14 | ]
15 |
--------------------------------------------------------------------------------
/web/templates/no_site.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | There is no website here
7 |
8 |
9 | There is no website here!
10 | Please create it using createsite management command.
11 |
12 |
--------------------------------------------------------------------------------
/static/fontawesome/less/_animated.less:
--------------------------------------------------------------------------------
1 | // Animated Icons
2 | // --------------------------
3 |
4 | .@{fa-css-prefix}-spin {
5 | animation: fa-spin 2s infinite linear;
6 | }
7 |
8 | .@{fa-css-prefix}-pulse {
9 | animation: fa-spin 1s infinite steps(8);
10 | }
11 |
12 | @keyframes fa-spin {
13 | 0% {
14 | transform: rotate(0deg);
15 | }
16 | 100% {
17 | transform: rotate(360deg);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/ice-cream.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/think-peaks.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/windows.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/y-combinator.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/scss/_animated.scss:
--------------------------------------------------------------------------------
1 | // Animated Icons
2 | // --------------------------
3 |
4 | .#{$fa-css-prefix}-spin {
5 | animation: fa-spin 2s infinite linear;
6 | }
7 |
8 | .#{$fa-css-prefix}-pulse {
9 | animation: fa-spin 1s infinite steps(8);
10 | }
11 |
12 | @keyframes fa-spin {
13 | 0% {
14 | transform: rotate(0deg);
15 | }
16 |
17 | 100% {
18 | transform: rotate(360deg);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/mix.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/mouse.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/less/_list.less:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-ul {
5 | list-style-type: none;
6 | margin-left: (@fa-li-width * 5/4);
7 | padding-left: 0;
8 |
9 | > li { position: relative; }
10 | }
11 |
12 | .@{fa-css-prefix}-li {
13 | left: -@fa-li-width;
14 | position: absolute;
15 | text-align: center;
16 | width: @fa-li-width;
17 | line-height: inherit;
18 | }
19 |
--------------------------------------------------------------------------------
/static/fontawesome/scss/_list.scss:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | list-style-type: none;
6 | margin-left: $fa-li-width * 5/4;
7 | padding-left: 0;
8 |
9 | > li { position: relative; }
10 | }
11 |
12 | .#{$fa-css-prefix}-li {
13 | left: -$fa-li-width;
14 | position: absolute;
15 | text-align: center;
16 | width: $fa-li-width;
17 | line-height: inherit;
18 | }
19 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/google-drive.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/comment-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/star-half.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/sd-card.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/views/sus_users.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from django.views.generic import TemplateView
3 |
4 | class AdminSusActivityView(TemplateView):
5 | template_name = 'admin/web/user/sus.html'
6 |
7 | def get_context_data(self, **kwargs):
8 | ctx = super().get_context_data(**kwargs)
9 | admin_ctx = admin.site.each_context(self.request)
10 | ctx.update(admin_ctx)
11 | return ctx
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/uikit.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/viacoin.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/bookmark.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/caret-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/genderless.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/hockey-puck.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/angular.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/patreon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/adjust.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/caret-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/columns.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/modx.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/bread-slice.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/caret-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/location-arrow.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/map-marker.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/templates/mails/invite_email.txt:
--------------------------------------------------------------------------------
1 | {% autoescape off %}
2 | Здравствуйте,
3 |
4 | Вы были приглашены на {{ protocol }}://{{ domain }} в качестве участника. Принять запрос вы можете перейдя по ссылке ниже
5 |
6 | {{ protocol }}://{{ domain }}{% url 'accept' uidb64=uid token=token %}
7 |
8 | Если вы не хотите принимать приглашение, то можете просто проигнорировать это письмо.
9 |
10 | С уважением,
11 | {{ site_name }}
12 |
13 | {% endautoescape %}
--------------------------------------------------------------------------------
/static/fontawesome/scss/_core.scss:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix},
5 | .fas,
6 | .far,
7 | .fal,
8 | .fad,
9 | .fab {
10 | -moz-osx-font-smoothing: grayscale;
11 | -webkit-font-smoothing: antialiased;
12 | display: inline-block;
13 | font-style: normal;
14 | font-variant: normal;
15 | text-rendering: auto;
16 | line-height: 1;
17 | }
18 |
19 | %fa-icon {
20 | @include fa-icon;
21 | }
22 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/npm.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/window-maximize.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/border-all.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/migrations/0064_remove_article_author.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.1.4 on 2025-11-14 23:14
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('web', '0063_author_to_authors'),
10 | ]
11 |
12 | operations = [
13 | migrations.RemoveField(
14 | model_name='article',
15 | name='author',
16 | ),
17 | ]
18 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/deviantart.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/facebook-f.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/servicestack.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/dot-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/minus-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/mobile.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/stop-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/tablet.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/voicemail.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/window-maximize.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/templates/login/password_reset_complete.html:
--------------------------------------------------------------------------------
1 | {% extends "system_base.html" %}
2 |
3 | {% block h1 %}{% block title %}Пароль сброшен{% endblock %}{% endblock %}
4 |
5 | {% block content %}
6 |
10 | {% endblock %}
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/dyalog.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/instalod.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/paragraph.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/play-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/dynamic_preferences_registry.py:
--------------------------------------------------------------------------------
1 | from dynamic_preferences.types import BooleanPreference
2 | from dynamic_preferences.preferences import Section
3 | from dynamic_preferences.users.registries import user_preferences_registry
4 |
5 |
6 | articles = Section('qol')
7 |
8 | @user_preferences_registry.register
9 | class AdvancedSourceEditorEnabled(BooleanPreference):
10 | section = articles
11 | name = 'advanced_source_editor_enabled'
12 | default = False
--------------------------------------------------------------------------------
/scpdev/asgi.py:
--------------------------------------------------------------------------------
1 | """
2 | ASGI config for scpdev 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/4.0/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', 'scpdev.settings')
15 |
16 | application = get_asgi_application()
17 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/adn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/dochub.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/hacker-news.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/file.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/glass-whiskey.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | Django==5.2.8
2 | py7zr==0.21.0
3 | whitenoise==6.6.0
4 | django-jazzmin==3.0.1
5 | Pillow==12.0.0
6 | python-dotenv==1.0.1
7 | psycopg2-binary==2.9.11
8 | watchdog==4.0.1
9 | beautifulsoup4==4.12.3
10 | django-admin-sortable2==2.2.8
11 | django-auto-prefetch==1.11.0
12 | django-debug-toolbar==6.0.0
13 | django-dynamic-preferences==1.17.0
14 | pydantic==2.12.5
15 | langcodes==3.4.0
16 | requests==2.32.4
17 | django-solo==2.4.0
18 | tqdm==4.67
19 | rcssmin==1.2.2
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/firstdraft.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/angle-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/angle-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/dice-one.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/slash.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/step-backward.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/step-forward.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/sticky-note.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/toggle-on.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/artstation.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/square.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/angle-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/angle-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/sort.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ftml/scripts/ast_stub.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/bash
2 | set -eu
3 |
4 | #
5 | # Create stubs for AST tests.
6 | #
7 |
8 | cd "${0%/*}/.."
9 |
10 | for name in "$@"; do
11 | if [[ -f test/$name.json ]] || [[ -f test/$name.txt ]] || [[ -f test/$name.html ]]; then
12 | echo "Already exists: $name..."
13 | continue
14 | fi
15 |
16 | echo "Creating $name..."
17 |
18 | cp misc/ast-test-template.json "test/$name.json"
19 | echo > "test/$name.txt"
20 | echo > "test/$name.html"
21 | done
22 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/html5.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/magento.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/twitch.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/yahoo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/yandex.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/grip-lines.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/table.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/js/reactive/containers/page/Navigation.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Paths } from '~reactive/paths'
3 | import * as Styled from './Navigation.styles'
4 |
5 | const Navigation: React.FC = () => {
6 | return (
7 |
8 | Редактировать профиль
9 | Уведомления
10 |
11 | )
12 | }
13 |
14 | export default Navigation
15 |
--------------------------------------------------------------------------------
/web/templates/admin/web/user/submit_line.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/submit_line.html" %}
2 |
3 | {% block extra-actions %}
4 | {% if original.type == "wikidot" and not original.is_active %}
5 |
8 | {% endif %}
9 |
12 | {% endblock %}
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/autoprefixer.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/star-half.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/bolt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/burn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/chalkboard.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/filter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/heart.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/italic.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/glass-martini.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/grip-lines-vertical.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/lock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/minus-square.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/pause.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/seedling.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/tv.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/jira.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/monero.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/ellipsis-v.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/meh-blank.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/paper-plane.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/js/api/preview.ts:
--------------------------------------------------------------------------------
1 | import { wFetch } from '../util/fetch-util'
2 |
3 | export interface PreviewData {
4 | pageId: string
5 | title: string
6 | source: string
7 | pathParams?: { [key: string]: string }
8 | }
9 |
10 | export interface PreviewResponse {
11 | title: string
12 | content: string
13 | style: string
14 | }
15 |
16 | export function makePreview(data: PreviewData) {
17 | return wFetch(`/api/preview`, { method: 'POST', sendJson: true, body: data })
18 | }
19 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/buysellads.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/cloudsmith.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/maxcdn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/tiktok.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/battery-empty.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/box.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/clock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/comment.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/ellipsis-h.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/forward.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/qrcode.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/record-vinyl.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/suitcase.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/migrations/0009_assign_author_to_articles.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.0.6 on 2022-08-12 20:24
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('web', '0008_alter_article_options_alter_category_options_and_more'),
10 | ]
11 |
12 | operations = [
13 | migrations.RunSQL('UPDATE web_article a SET author_id=v.user_id FROM web_articlelogentry v WHERE v.article_id=a.id AND v.rev_number=0')
14 | ]
15 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/stack-overflow.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/file.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/caret-square-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/neuter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/sign.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/utensil-spoon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/js/reactive/config/ConfigContext.provider.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ConfigContext from './ConfigContext.context'
3 | import { IConfigContext } from './ConfigContext.types'
4 |
5 | interface Props {
6 | config: IConfigContext
7 | children?: React.ReactNode
8 | }
9 |
10 | const ConfigContextProvider: React.FC = ({ config, children }) => {
11 | return {children}
12 | }
13 |
14 | export default ConfigContextProvider
15 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/bitbucket.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/dropbox.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/stack-exchange.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/folder.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/backward.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/desktop.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/equals.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/trash.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/templates/login/password_reset_done.html:
--------------------------------------------------------------------------------
1 | {% extends "system_base.html" %}
2 |
3 | {% block h1 %}{% block title %}Письмо отправлено{% endblock %}{% endblock %}
4 |
5 | {% block content %}
6 |
10 | {% endblock %}
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/coffee.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/cross.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/long-arrow-alt-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/map.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/plug.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/plus.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/video.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/css3-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/dashcube.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/kaggle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/battery-full.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/battery-half.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/chart-area.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/clone.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/folder-minus.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/heart-broken.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/icicles.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/long-arrow-alt-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/long-arrow-alt-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/long-arrow-alt-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/music.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/pen.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/less/_bordered-pulled.less:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-border {
5 | border-radius: .1em;
6 | border: solid .08em @fa-border-color;
7 | padding: .2em .25em .15em;
8 | }
9 |
10 | .@{fa-css-prefix}-pull-left { float: left; }
11 | .@{fa-css-prefix}-pull-right { float: right; }
12 |
13 | .@{fa-css-prefix}, .fas, .far, .fal, .fab {
14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; }
15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; }
16 | }
17 |
--------------------------------------------------------------------------------
/static/fontawesome/scss/_larger.scss:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | // makes the font 33% larger relative to the icon container
5 | .#{$fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -.0667em;
9 | }
10 |
11 | .#{$fa-css-prefix}-xs {
12 | font-size: .75em;
13 | }
14 |
15 | .#{$fa-css-prefix}-sm {
16 | font-size: .875em;
17 | }
18 |
19 | @for $i from 1 through 10 {
20 | .#{$fa-css-prefix}-#{$i}x {
21 | font-size: $i * 1em;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/google.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/window-restore.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/arrow-alt-circle-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/battery-quarter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/chevron-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/hard-hat.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/industry.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/tenge.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/user-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/js/api/modules.ts:
--------------------------------------------------------------------------------
1 | import { wFetch } from '../util/fetch-util'
2 |
3 | export interface ModuleRequest {
4 | module: string
5 | pageId?: string
6 | method: string
7 | pathParams?: Record
8 | params?: Record
9 | content?: string
10 | }
11 |
12 | export interface ModuleRenderResponse {
13 | result: string
14 | }
15 |
16 | export async function callModule(request: ModuleRequest) {
17 | return await wFetch(`/api/modules`, { method: 'POST', sendJson: true, body: request })
18 | }
19 |
--------------------------------------------------------------------------------
/web/js/reactive/theme/Theme.types.ts:
--------------------------------------------------------------------------------
1 | export interface ReactTheme {
2 | primary: string
3 | primaryForeground: string
4 | pagePadding: string
5 | windowPadding: string
6 | windowStrong: string
7 | windowBackground: string
8 | foreground: string
9 | headingStart: string
10 | headingEnd: string
11 | uiBackground: string
12 | uiForeground: string
13 | uiSelection: string
14 | uiSelectionHighlight: string
15 | uiSelectionForeground: string
16 | uiBorder: string
17 | higlightBackground: string
18 | }
19 |
--------------------------------------------------------------------------------
/web/migrations/0016_lower_article_ids.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.0.6 on 2022-08-16 13:58
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('web', '0015_delete_external_links'),
10 | ]
11 |
12 | operations = [
13 | migrations.RunSQL('update web_article set name=lower(name), category=lower(category)'),
14 | migrations.RunSQL('update web_externallink set link_from=lower(link_from), link_to=lower(link_to)')
15 | ]
16 |
--------------------------------------------------------------------------------
/web/templates/admin/web/user/sus.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/base_site.html" %}
2 |
3 | {% load md5url %}
4 |
5 | {% block branding %}
6 |
7 | {% endblock %}
8 |
9 | {% block content_title %}
10 | Подозрительная активность
11 | {% endblock %}
12 |
13 | {% block content %}
14 |
15 |
16 | {% endblock %}
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/elementor.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/google-play.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/korvue.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/telegram-plane.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/arrow-alt-circle-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/arrow-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/arrow-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/arrow-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/battery-three-quarters.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/cloud.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/map-marker-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/user-tie.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/wave-square.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/js/api/tags.ts:
--------------------------------------------------------------------------------
1 | import { callModule } from './modules'
2 |
3 | export interface Category {
4 | id: number
5 | name: string
6 | description: string
7 | slug: string
8 | }
9 |
10 | export interface Tag {
11 | categoryId: number
12 | name: string
13 | }
14 |
15 | export interface FetchAllTagsResponse {
16 | categories: Array
17 | tags: Array
18 | }
19 |
20 | export async function fetchAllTags() {
21 | return await callModule({ module: 'tagcloud', method: 'list_tags' })
22 | }
23 |
--------------------------------------------------------------------------------
/web/js/articles/auto-resize-iframe.ts:
--------------------------------------------------------------------------------
1 | window.addEventListener('message', event => {
2 | if (event.data && event.data.type === 'iframe-change-height') {
3 | const {
4 | payload: { height, id },
5 | } = event.data
6 | const frame = document.getElementById(id)
7 | if (!frame || frame.tagName.toLowerCase() !== 'iframe') {
8 | return
9 | }
10 | const heightProp = `${height}px`
11 | if (frame.style.minHeight !== heightProp) {
12 | frame.style.minHeight = heightProp
13 | }
14 | }
15 | })
16 |
--------------------------------------------------------------------------------
/web/migrations/0066_actionlogentry_user_origin_ip_idx.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.1.4 on 2025-11-16 13:50
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('web', '0065_alter_articlelogentry_type'),
10 | ]
11 |
12 | operations = [
13 | migrations.AddIndex(
14 | model_name='actionlogentry',
15 | index=models.Index(fields=['user', 'origin_ip'], name='user_origin_ip_idx'),
16 | ),
17 | ]
18 |
--------------------------------------------------------------------------------
/static/fontawesome/scss/fontawesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 | */
5 | @import 'variables';
6 | @import 'mixins';
7 | @import 'core';
8 | @import 'larger';
9 | @import 'fixed-width';
10 | @import 'list';
11 | @import 'bordered-pulled';
12 | @import 'animated';
13 | @import 'rotated-flipped';
14 | @import 'stacked';
15 | @import 'icons';
16 | @import 'screen-reader';
17 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/cuttlefish.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/gg.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/gratipay.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/openid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/product-hunt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/arrow-alt-circle-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/arrow-alt-circle-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/arrow-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/glass-martini-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/star.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/user.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/migrations/0033_vote_date.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.0.6 on 2023-03-22 06:50
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('web', '0032_settings_can_user_create_tags'),
10 | ]
11 |
12 | operations = [
13 | migrations.AddField(
14 | model_name='vote',
15 | name='date',
16 | field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='Дата голоса'),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/fulcrum.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/sourcetree.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/laptop.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/mountain.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/shield-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/templates/profile/change.html:
--------------------------------------------------------------------------------
1 | {% extends "system_base.html" %}
2 |
3 | {% block h1 %}{% block title %}Изменение профиля{% endblock %}{% endblock %}
4 |
5 | {% block back_link %} Назад к публичному профилю {% endblock %}
6 |
7 | {% block content %}
8 |
13 | {% endblock %}
--------------------------------------------------------------------------------
/web/util/css.py:
--------------------------------------------------------------------------------
1 | import re
2 |
3 |
4 | def normalize_computed_style(css: str) -> str:
5 | import_pattern = r'(@import\s*(?:(?:url\s*\(\s*)?(["\']?)([^"\'\)]*?)\2\s*\)?\s*)(?:[^;]*);?)'
6 | imports = re.findall(import_pattern, css, re.IGNORECASE | re.DOTALL)
7 |
8 | if not imports:
9 | return css
10 |
11 | for import_rule in imports:
12 | css = css.replace(import_rule[0], '', 1)
13 |
14 | result = '\n'.join([imp[0] for imp in imports]) + '\n' + css.strip()
15 |
16 | return result
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/discourse.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/facebook-square.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/facebook.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/rockrms.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/unity.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/stop-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/archive.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/chevron-circle-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/ethernet.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/mitten.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/phone-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/migrations/0007_alter_articleversion_ast.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.0.6 on 2022-07-30 15:57
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('web', '0006_articleversion_ast'),
10 | ]
11 |
12 | operations = [
13 | migrations.AlterField(
14 | model_name='articleversion',
15 | name='ast',
16 | field=models.JSONField(blank=True, null=True, verbose_name='AST-дерево статьи'),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/hotjar.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/calendar.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/play-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/sticky-note.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/briefcase.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/brush.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/check.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/chevron-circle-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/compact-disc.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/dice-two.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/divide.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/exclamation.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/fast-backward.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/fire.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/gem.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/hospital-symbol.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/meh.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/scss/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | border: solid .08em $fa-border-color;
6 | border-radius: .1em;
7 | padding: .2em .25em .15em;
8 | }
9 |
10 | .#{$fa-css-prefix}-pull-left { float: left; }
11 | .#{$fa-css-prefix}-pull-right { float: right; }
12 |
13 | .#{$fa-css-prefix},
14 | .fas,
15 | .far,
16 | .fal,
17 | .fab {
18 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
19 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
20 | }
21 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/deezer.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/gitlab.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/chevron-circle-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/chevron-circle-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/door-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/fast-forward.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/pause-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/unlock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/js/util/react-render-into.ts:
--------------------------------------------------------------------------------
1 | import ReactDOM, { Root } from 'react-dom/client'
2 |
3 | type ElementWithReactRoot = Element & { __root?: Root }
4 |
5 | export function renderTo(container: ElementWithReactRoot, what: React.ReactNode) {
6 | const root = container.__root || ReactDOM.createRoot(container)
7 | container.__root = root
8 | root.render(what)
9 | }
10 |
11 | export function unmountFromRoot(container: ElementWithReactRoot) {
12 | if (container.__root) {
13 | container.__root.unmount()
14 | }
15 | delete container.__root
16 | }
17 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/hacker-news-square.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/markdown.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/sistrix.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/lock-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/mobile-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/parking.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/phone.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/plus-circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/tablet-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/tape.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/wine-glass.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ftml/scripts/ast_diff.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/bash
2 | set -eu
3 |
4 | #
5 | # Help with comparing outputs form AST tests.
6 | #
7 |
8 | readonly newline=$'\n'
9 |
10 | expected=''
11 | actual=''
12 |
13 | current='expected'
14 |
15 | while IFS= read -r line; do
16 | if [[ $line == Actual:* ]]; then
17 | current='actual'
18 | fi
19 |
20 | case "$current" in
21 | expected)
22 | expected+="${line}${newline}"
23 | ;;
24 | actual)
25 | actual+="${line}${newline}"
26 | ;;
27 | esac
28 | done
29 |
30 | diff --color <(echo "$expected") <(echo "$actual")
31 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/envira.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/caret-square-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/chevron-down.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/chevron-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/chevron-up.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/eject.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/surprise.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/tag.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/migrations/0020_forumthread_is_pinned.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.0.6 on 2022-08-28 01:00
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('web', '0019_category_users_can_comment_forumpost_thread_and_more'),
10 | ]
11 |
12 | operations = [
13 | migrations.AddField(
14 | model_name='forumthread',
15 | name='is_pinned',
16 | field=models.BooleanField(default=False, verbose_name='Пришпилено'),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/web/migrations/0049_category_is_indexed.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.1.4 on 2025-04-23 21:12
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('web', '0048_delete_usernotificationtemplate_and_more'),
10 | ]
11 |
12 | operations = [
13 | migrations.AddField(
14 | model_name='category',
15 | name='is_indexed',
16 | field=models.BooleanField(default=True, verbose_name='Индексируется поисковиками'),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/brands/atlassian.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/regular/comment-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/bowling-ball.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/caret-square-left.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/caret-square-right.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/cube.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/less-than.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/level-down-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/level-up-alt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/fontawesome/svgs/solid/mouse-pointer.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------