Skip to content

Revamp merge base #82

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 35 commits into from
Jan 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
f134ccc
Add compatibility for Django 4.2; fixes #2322
kiritofeng Dec 25, 2024
14352f5
Revert "Revert "Completely remove Pagedown" and "Switch all Pagedown …
quantum5 Dec 25, 2024
4120625
Fix botched merge of martor in comments
quantum5 Dec 25, 2024
ea88af2
Quick fix to make Martor usable in dark mode
quantum5 Dec 25, 2024
e48a445
Explicitly install `lxml_html_clean`
kiritofeng Dec 25, 2024
1a0c83d
Pass site theme as data-theme on <body>
quantum5 Dec 25, 2024
0ce1e8f
Fix site_theme on anonymous users
quantum5 Dec 25, 2024
97eb1ad
Remove useless martor styling hack
quantum5 Dec 25, 2024
4a34ad3
Fix martor dark style
int-y1 Dec 25, 2024
8111d43
Migrate all Martor CSS to martor-description
Ninjaclasher Dec 25, 2024
30ca35c
Merge Martor repo into main repo
Ninjaclasher Dec 25, 2024
8731878
Fix martor flake8 errors
Ninjaclasher Dec 25, 2024
c82e540
Add separator line for martor dark mode between tooltip and editor
Ninjaclasher Dec 25, 2024
361b5ad
Trim in-repo copy of Martor
Ninjaclasher Dec 26, 2024
29c122f
Clean up martor extension ignores in .flake8
Ninjaclasher Dec 26, 2024
f9fc134
Remove martor spellcheck
int-y1 Dec 26, 2024
18d0380
Remove martor locale
int-y1 Dec 26, 2024
7225d49
Fix martor guide
int-y1 Dec 27, 2024
4b67c42
Migrate away from deprecated sass @import; fixes #2380
Ninjaclasher Dec 27, 2024
2a15b48
Remove martor jquery
int-y1 Dec 27, 2024
e150610
Update links
int-y1 Dec 27, 2024
6273ec4
Autoformat martor js
int-y1 Dec 27, 2024
8a8152a
Make django-ace (toolbar) support dark mode better
Ninjaclasher Dec 27, 2024
577b4b8
Make blockquotes lighter in dark mode
Ninjaclasher Dec 27, 2024
3b3ecec
Prettify Ace editor scrollbar
Ninjaclasher Dec 27, 2024
22e519a
Migrate martor guide to featherlight
int-y1 Dec 28, 2024
027cb52
Fix dark mode for reply comment
int-y1 Dec 28, 2024
1ec090d
Fix bug with adding in admin site
int-y1 Dec 29, 2024
d4ccd8d
Change class for martor help icon
int-y1 Dec 29, 2024
8cef2ca
Increase select2 width on admin site
int-y1 Dec 29, 2024
2cbacc7
Fix editor theme if user changes color scheme
int-y1 Jan 2, 2025
dc522af
Dark mode support for alert boxes
int-y1 Dec 30, 2024
7d8b78d
Remove admin select2 custom css
int-y1 Jan 5, 2025
25f4798
Improve i18n for formatting memory size
int-y1 Jan 5, 2025
4c6a985
Merge remote-tracking branch 'origin/revamp' into revamp-merge-base
JasonLovesDoggo Jan 10, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions .flake8
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[flake8]
max-line-length = 120
application-import-names = dmoj,judge,django_ace
application-import-names = dmoj,judge,django_ace,martor
import-order-style = pycharm
enable-extensions = G
ignore =
Expand All @@ -18,9 +18,6 @@ per-file-ignores =
./judge/management/commands/runmoss.py:F403,F405
# E501: line too long, ignore in migrations
./judge/migrations/*.py:E501
# E303: too many blank lines
# PyCharm likes to have double lines between class/def in an if statement.
./judge/widgets/pagedown.py:E303
exclude =
# belongs to the user
./dmoj/local_settings.py,
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
*~
*.swp
dmoj/local_settings.py
resources/ace-dmoj.css
resources/dark
resources/featherlight.css
resources/martor-description.css
resources/select2-dmoj.css
resources/style.css
Expand Down
4 changes: 0 additions & 4 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
[submodule "resources/pagedown"]
path = resources/pagedown
url = https://github.com/DMOJ/dmoj-pagedown.git
branch = master
[submodule "resources/libs"]
path = resources/libs
url = https://github.com/DMOJ/site-assets.git
Expand Down
2 changes: 1 addition & 1 deletion django_ace/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""
Django-ace originally from https://github.com/bradleyayers/django-ace.
Django-ace originally from https://github.com/django-ace/django-ace.
"""

from .widgets import AceWidget
58 changes: 0 additions & 58 deletions django_ace/static/django_ace/widget.css

This file was deleted.

10 changes: 4 additions & 6 deletions django_ace/widgets.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""
Django-ace originally from https://github.com/bradleyayers/django-ace.
Django-ace originally from https://github.com/django-ace/django-ace.
"""

from urllib.parse import urljoin
Expand All @@ -25,10 +25,7 @@ def __init__(self, mode=None, theme=None, wordwrap=False, width='100%', height='
def media(self):
js = [urljoin(settings.ACE_URL, 'ace.js')] if self.ace_media else []
js.append('django_ace/widget.js')
css = {
'screen': ['django_ace/widget.css'],
}
return forms.Media(js=js, css=css)
return forms.Media(js=js)

def render(self, name, value, attrs=None, renderer=None):
attrs = attrs or {}
Expand All @@ -53,7 +50,8 @@ def render(self, name, value, attrs=None, renderer=None):
html = '<div%s><div></div></div>%s' % (flatatt(ace_attrs), textarea)

# add toolbar
html = ('<div class="django-ace-editor"><div style="width: 100%%" class="django-ace-toolbar">'
html = ('<div style="width: 100%%" class="django-ace-editor">'
'<div style="width: 100%%" class="django-ace-toolbar">'
'<a href="./" class="django-ace-max_min"></a></div>%s</div>') % html

return mark_safe(html)
15 changes: 6 additions & 9 deletions dmoj/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
Django settings for dmoj project.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/
https://docs.djangoproject.com/en/4.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
https://docs.djangoproject.com/en/4.2/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
Expand All @@ -19,7 +19,7 @@
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '5*9f5q57mqmlz2#f$x1h76&jxy#yortjl1v+l*6hd18$d*yx#0'
Expand Down Expand Up @@ -272,7 +272,6 @@
'social_django',
'compressor',
'django_ace',
'pagedown',
'sortedm2m',
'statici18n',
'impersonate',
Expand Down Expand Up @@ -496,9 +495,7 @@
MARTOR_ENABLE_CONFIGS = {
'imgur': 'true',
'mention': 'true',
'jquery': 'false',
'living': 'false',
'spellcheck': 'false',
'hljs': 'false',
}
MARTOR_MARKDOWNIFY_URL = '/widgets/preview/default'
Expand All @@ -511,7 +508,7 @@
MARTOR_UPLOAD_SAFE_EXTS = {'.jpg', '.png', '.gif'}

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases

DATABASES = {
'default': {
Expand All @@ -538,7 +535,7 @@
EVENT_DAEMON_SUBMISSION_KEY = '6Sdmkx^%pk@GsifDfXcwX*Y7LRF%RGT8vmFpSxFBT$fwS7trc8raWfN#CSfQuKApx&$B#Gh2L7p%W!Ww'

# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/
# https://docs.djangoproject.com/en/4.2/topics/i18n/

# Whatever you do, this better be one of the entries in `LANGUAGES`.
LANGUAGE_CODE = 'en'
Expand All @@ -552,7 +549,7 @@
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
# https://docs.djangoproject.com/en/4.2/howto/static-files/

DMOJ_RESOURCES = os.path.join(BASE_DIR, 'resources')
STATICFILES_FINDERS = (
Expand Down
2 changes: 1 addition & 1 deletion dmoj/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from django.utils.functional import lazy
from django.utils.translation import gettext_lazy as _
from django.views.generic import RedirectView
from martor.views import markdown_search_user

from judge.feed import AtomBlogFeed, AtomCommentFeed, AtomProblemFeed, BlogFeed, CommentFeed, ProblemFeed
from judge.sitemap import sitemaps
Expand All @@ -25,6 +24,7 @@
ContestUserSearchSelect2View, OrganizationSelect2View, ProblemSelect2View, TicketUserSelect2View, \
UserSearchSelect2View, UserSelect2View
from judge.views.widgets import martor_image_uploader
from martor.views import markdown_search_user

admin.autodiscover()

Expand Down
2 changes: 1 addition & 1 deletion dmoj_install_pymysql.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import pymysql

pymysql.install_as_MySQLdb()
pymysql.version_info = (1, 4, 0, 'final', 0)
pymysql.version_info = (1, 4, 3, 'final', 0)
1 change: 0 additions & 1 deletion judge/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@
default_app_config = 'judge.apps.JudgeAppConfig'
25 changes: 10 additions & 15 deletions judge/admin/contest.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from adminsortable2.admin import SortableInlineAdminMixin
from adminsortable2.admin import SortableAdminBase, SortableInlineAdminMixin
from django.contrib import admin
from django.core.exceptions import PermissionDenied
from django.db import connection, transaction
Expand All @@ -14,12 +14,11 @@
from django.views.decorators.http import require_POST
from reversion.admin import VersionAdmin

from django_ace import AceWidget
from judge.models import Class, Contest, ContestProblem, ContestSubmission, Profile, Rating, Submission
from judge.ratings import rate_contest
from judge.utils.views import NoBatchDeleteMixin
from judge.widgets import AdminHeavySelect2MultipleWidget, AdminHeavySelect2Widget, AdminMartorWidget, \
AdminSelect2MultipleWidget, AdminSelect2Widget
from judge.widgets import AdminAceWidget, AdminHeavySelect2MultipleWidget, AdminHeavySelect2Widget, \
AdminMartorWidget, AdminSelect2MultipleWidget, AdminSelect2Widget


class AdminHeavySelect2Widget(AdminHeavySelect2Widget):
Expand Down Expand Up @@ -101,23 +100,19 @@ class Meta:
'curators': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'testers': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'spectators': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'private_contestants': AdminHeavySelect2MultipleWidget(data_view='profile_select2',
attrs={'style': 'width: 100%'}),
'private_contestants': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'organizations': AdminHeavySelect2MultipleWidget(data_view='organization_select2'),
'classes': AdminHeavySelect2MultipleWidget(data_view='class_select2'),
'join_organizations': AdminHeavySelect2MultipleWidget(data_view='organization_select2'),
'tags': AdminSelect2MultipleWidget,
'banned_users': AdminHeavySelect2MultipleWidget(data_view='profile_select2',
attrs={'style': 'width: 100%'}),
'view_contest_scoreboard': AdminHeavySelect2MultipleWidget(data_view='profile_select2',
attrs={'style': 'width: 100%'}),
'view_contest_submissions': AdminHeavySelect2MultipleWidget(data_view='profile_select2',
attrs={'style': 'width: 100%'}),
'banned_users': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'view_contest_scoreboard': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'view_contest_submissions': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'description': AdminMartorWidget(attrs={'data-markdownfy-url': reverse_lazy('contest_preview')}),
}


class ContestAdmin(NoBatchDeleteMixin, VersionAdmin):
class ContestAdmin(NoBatchDeleteMixin, SortableAdminBase, VersionAdmin):
fieldsets = (
(None, {'fields': ('key', 'name', 'authors', 'curators', 'testers', 'tester_see_submissions',
'tester_see_scoreboard', 'spectators')}),
Expand Down Expand Up @@ -309,14 +304,14 @@ def rate_view(self, request, id):
raise Http404()
with transaction.atomic():
contest.rate()
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('admin:judge_contest_changelist')))
return HttpResponseRedirect(request.headers.get('referer', reverse('admin:judge_contest_changelist')))

def get_form(self, request, obj=None, **kwargs):
form = super(ContestAdmin, self).get_form(request, obj, **kwargs)
if 'problem_label_script' in form.base_fields:
# form.base_fields['problem_label_script'] does not exist when the user has only view permission
# on the model.
form.base_fields['problem_label_script'].widget = AceWidget(
form.base_fields['problem_label_script'].widget = AdminAceWidget(
mode='lua', theme=request.profile.resolved_ace_theme,
)

Expand Down
6 changes: 3 additions & 3 deletions judge/admin/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def __init__(self, *args, **kwargs):

class Meta:
widgets = {
'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}),
'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'content': AdminMartorWidget(attrs={'data-markdownfy-url': reverse_lazy('blog_preview')}),
'summary': AdminMartorWidget(attrs={'data-markdownfy-url': reverse_lazy('blog_preview')}),
}
Expand Down Expand Up @@ -104,8 +104,8 @@ def __init__(self, *args, **kwargs):

class Meta:
widgets = {
'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}),
'problem': AdminHeavySelect2Widget(data_view='problem_select2', attrs={'style': 'width: 250px'}),
'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'problem': AdminHeavySelect2Widget(data_view='problem_select2'),
'content': AdminMartorWidget(attrs={'data-markdownfy-url': reverse_lazy('solution_preview')}),
}

Expand Down
14 changes: 6 additions & 8 deletions judge/admin/problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,11 @@ def __init__(self, *args, **kwargs):

class Meta:
widgets = {
'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}),
'curators': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}),
'testers': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}),
'banned_users': AdminHeavySelect2MultipleWidget(data_view='profile_select2',
attrs={'style': 'width: 100%'}),
'organizations': AdminHeavySelect2MultipleWidget(data_view='organization_select2',
attrs={'style': 'width: 100%'}),
'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'curators': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'testers': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'banned_users': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'organizations': AdminHeavySelect2MultipleWidget(data_view='organization_select2'),
'types': AdminSelect2MultipleWidget,
'group': AdminSelect2Widget,
'description': AdminMartorWidget(attrs={'data-markdownfy-url': reverse_lazy('problem_preview')}),
Expand Down Expand Up @@ -89,7 +87,7 @@ def __init__(self, *args, **kwargs):

class Meta:
widgets = {
'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}),
'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2'),
'content': AdminMartorWidget(attrs={'data-markdownfy-url': reverse_lazy('solution_preview')}),
}

Expand Down
5 changes: 2 additions & 3 deletions judge/admin/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@
from django.utils.translation import gettext, gettext_lazy as _, ngettext
from reversion.admin import VersionAdmin

from django_ace import AceWidget
from judge.models import Profile, WebAuthnCredential
from judge.utils.views import NoBatchDeleteMixin
from judge.widgets import AdminMartorWidget, AdminSelect2Widget
from judge.widgets import AdminAceWidget, AdminMartorWidget, AdminSelect2Widget


class ProfileForm(ModelForm):
Expand Down Expand Up @@ -134,7 +133,7 @@ def get_form(self, request, obj=None, **kwargs):
form = super(ProfileAdmin, self).get_form(request, obj, **kwargs)
if 'user_script' in form.base_fields:
# form.base_fields['user_script'] does not exist when the user has only view permission on the model.
form.base_fields['user_script'].widget = AceWidget(
form.base_fields['user_script'].widget = AdminAceWidget(
mode='javascript', theme=request.profile.resolved_ace_theme,
)
return form
Expand Down
5 changes: 2 additions & 3 deletions judge/admin/runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@
from django.views.decorators.http import require_POST
from reversion.admin import VersionAdmin

from django_ace import AceWidget
from judge.models import Judge
from judge.widgets import AdminMartorWidget
from judge.widgets import AdminAceWidget, AdminMartorWidget


class LanguageForm(ModelForm):
Expand All @@ -30,7 +29,7 @@ class LanguageAdmin(VersionAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super(LanguageAdmin, self).get_form(request, obj, **kwargs)
if obj is not None:
form.base_fields['template'].widget = AceWidget(
form.base_fields['template'].widget = AdminAceWidget(
mode=obj.ace, theme=request.profile.resolved_ace_theme,
)
return form
Expand Down
Loading
Loading