├── 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 |
7 |

Ваш пароль был успешно изменён. Вы можете продолжить и войти в аккаунт прямо сейчас.

8 | 9 |
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 |
6 | Активировать 7 |
8 | {% endif %} 9 |
10 | Сбросить голоса 11 |
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 |

{{ site_header|default:_('Django administration') }}

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 |
9 | {% csrf_token %} 10 | {{ form.as_p }} 11 | 12 |
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 | --------------------------------------------------------------------------------