This release is meant to be used with the DMOJ Judge v4.0.0 release or newer.
Thanks to @Ninjaclasher, @int-y1, @WallE256, @kiritofeng, @Carson-Tang, and @Riolku for contributing major changes in this release.
Features
- Added support for contest curator and tester roles.
- Added support for safe Markdown rendering. By default, problems, blogs, etc. will now disallow unsafe HTML tags.
- Added an option for users to download their data.
- Added support for locking submissions from being rejudged.
- Added support for voting on problem point values.
- Added scratch code support for 2-factor authentication.
- Added language and judge endpoints to API v2.
- Added support for classes within organizations.
- Added the ability to disable a judge without terminating its connection.
- ...more.
UI changes
- The logo is now symmetrical. 🎉
- Many CSS fixups as we work towards supporting dark mode in a future release.
- Numerous improvements to site internationalization.
- Use a different color for the first letter of target-rated users.
- Added a submission activity graph to user pages.
- Added a column on the problems list showing whether an editorial is available.
- Highlighted partial AC testcases differently.
- Added participation start time tooltip to contest rankings.
- Made the submissions list more mobile-friendly.
- Made the contest list page sortable.
- Submissions list now uses infinite pagination.
- Surface maximum runtime on a single test case for AC submissions.
- Removed "share to Google+" buttons on content.
- Limit height of ongoing contest display on the home page.
- Added a confirmation dialog when rejudging submissions.
- Improved formatting of the password reset and account activation emails.
- ...more.
Miscellaneous
- Judge scheduling improvements for submission prioritization: in-contest > regular > rejudge > batch rejudge.
- Various site performance improvements.
- Contest ranking sorting now uses decimal precision.
- Disallow rating contests which haven't finished yet.
- Deleted orphaned editorials, and prevented them from being generated in the future
- ...more.
Security
- Patched XSS vulnerabilities around select2 (#1398).
- Prevent users from voting on hidden comments.
- Prevent muted users from voting on comments.
- ...more.
Full changelog
The full changelog is available here as well as below.
Changelog
- Make code lint correctly with new flake8 by @quantum5 in #1388
- Fix 500 error on unathenticated user in ticket ajax views by @fluix-dev in #1387
- Move login requirement check out of TicketMixin by @fluix-dev in #1389
- Correctly reject invalid IDs in ajax ticket views by @quantum5 in #1390
- Add option for user to download their data; #40 by @Ninjaclasher in #1351
- Implement submission locks by @WallE256 in #1391
- Make TOTP login the default form action by @quantum5 in #1395
- Add admin action to set problem publish date to now by @Ninjaclasher in #1392
- Organization improvements by @Carson-Tang in #1393
- Do not write empty
init.yml
by @kiritofeng in #1397 - Remove XSS vulnerabilities through poor select2 usage by @quantum5 in #1398
- Remove widget if no open organizations available by @kevinjycui in #1399
- Run unit tests on GitHub actions by @quantum5 in #1404
- Unset
Contest.is_locked
when cloning a contest by @Ninjaclasher in #1405 - Add IOI format with new rules from 2016 by @adambenali in #1401
- Remove contest editorial column if empty by @kevinjycui in #1406
- Defer Problem.summary on ProblemList by @quantum5 in #1407
- Coalesce i18n_name in python by @quantum5 in #1408
- Mark all strings in models as translation strings by @Ninjaclasher in #1409
- Correctly cache comment titles on home page by @quantum5 in #1412
- Compute judge runtime versions in a single query by @quantum5 in #1413
- Switch CI test database to MySQL by @quantum5 in #1417
- Remove secondary ID sort on user list by @quantum5 in #1414
- Generate test coverage and upload to codecov by @quantum5 in #1418
- Add caching to pip install when running tests by @quantum5 in #1419
- Improve submission lock UI by @WallE256 in #1402
- Fix
Submission.can_see_detail
erroring when user is not authenticated by @Ninjaclasher in #1423 - Remove superuser optimizations for most recent comments by @quantum5 in #1421
- Make
Problem.is_accessible_by
consistent withProblem.get_visible_problems
by @Ninjaclasher in #1420 - Fix contest ranking scroll on medium width screens for some browsers by @Ninjaclasher in #1396
- Unconditionally deny access when a comment's related object doesn't exist by @Ninjaclasher in #1426
- Add controls for full HTML markup access in problems by @quantum5 in #1424
- Fix lxml adding extra tags by @quantum5 in #1428
- Remove random 'k' in contest template by @fluix-dev in #1429
- Exclude locked submissions from celery task filter by @Ninjaclasher in #1432
- Hide
locked
word on submissions list for small-width screens by @Ninjaclasher in #1430 - Fix problem solution access check; fixes #1371 by @Ninjaclasher in #1425
- Update robots.txt with new URL endpoints; #504 by @Ninjaclasher in #1427
- Exempt flatpages from the HTML restrictions by @Ninjaclasher in #1431
- Allow most sane HTML tags and attributes by @quantum5 in #1434
- Properly redirect when the organization slug is wrong by @Ninjaclasher in #1436
- Fix org kick by @Carson-Tang in #1437
- Add keyboard shortcut for triggering abort action; #1191 by @Ninjaclasher in #1435
- Update problem stats on submission delete by @Ninjaclasher in #1438
- Don't show rejudge link on submission source view when locked by @Ninjaclasher in #1441
- Fix comment body not breaking text on some browsers; #1443 by @Ninjaclasher in #1444
- Use
has_other_pages()
to check if the pagination bar should be shown by @Ninjaclasher in #1446 - Add unittests for models by @Ninjaclasher in #1416
- Hide vertical scrollbar for
wmd-button-row
; #1447 by @Ninjaclasher in #1449 - Break usernames and problem names in submission row instead of overflow by @Ninjaclasher in #1450
- Show comment post time as a readonly field on admin page by @Ninjaclasher in #1451
- Fix broken HTML tags by @Ninjaclasher in #1454
- Use Python for getting the contest problem label in contest formats by @Ninjaclasher in #1453
- Add scratch code support for 2FA; fixes #784 by @Carson-Tang in #1334
- Remove hidden word for non generated scratch codes by @Carson-Tang in #1458
- Check none type scratch codes by @Carson-Tang in #1459
- Correctly handle string prefix in lxml tree creation by @quantum5 in #1463
- Add (slightly better) mobile support for comments by @Ninjaclasher in #1455
- Make problems list ordering consistent by @kevinjycui in #1452
- Mark submissions with wrong acknowledgements as IE by @quantum5 in #1467
- Fix race condition between freeing judge and judge selection by @quantum5 in #1468
- Add Language and Judge endpoints to API v2 by @Ninjaclasher in #1471
- Vertically align checkbox input type by @fluix-dev in #1465
- Clear MiscConfig cache properly when saving/deleting the object; #1339 by @Ninjaclasher in #1340
- Revert "Replace join text with spectate if user is finished contest; fixes #544" by @Ninjaclasher in #1473
- Make comment votes icon use pointer cursor by @fluix-dev in #1469
- Add unittests for solutions by @Ninjaclasher in #1475
- Make submission list more mobile friendly by @Ninjaclasher in #1478
- Add past contests anchor for the pagination bar pages by @Ninjaclasher in #1477
- Fix problem breakdown table CSS after dccf6af by @Ninjaclasher in #1479
- Fix contest lock permission typo in admin site by @Ninjaclasher in #1488
- Fix CSS in case where only extended feedback is displayed by @kiritofeng in #1466
- Fix style.css not updating when it exists under resources/ by @quantum5 in #1491
- Log dispatch message only after submission has been dispatched by @Xyene in #1497
- Update README to reflect new repository names by @kiritofeng in #1498
- Fix abort any submission permission typo by @Ninjaclasher in #1499
- Prevent users from voting on hidden comments by @zecookiez in #1503
- Make removing a submission from list symmetric with adding by @quantum5 in #1502
- Use input and output file fields for PDFs by @fluix-dev in #1500
- Add participation start time tooltip to contest rankings by @Ninjaclasher in #1482
- Add Sorting to Contest Page 2 by @slightlyskepticalpotat in #1481
- Add page to view all user submissions in given contest by @kiritofeng in #1492
- Allow org admins to see all org problems by @kiritofeng in #1464
- Add CSS for #1481 by @kiritofeng in #1505
- Annotate ContestParticipations with
key
before sorting by @kiritofeng in #1506 - Fix ternary operator order for batch rejudges by @Xyene in #1507
- Stop updating user stats on grading end for private problems by @quantum5 in #1510
- Add missed semicolon by @kiritofeng in #1513
- Update translations from Crowdin by @dmoj-build in #1256
- Add Catalan language option by @malbareda in #1518
- Fix language fixture parameters by @zecookiez in #1508
- Add zero default for contest-output-prefix-length; Fixes #1515 by @Carson-Tang in #1516
- Allow hyphens in usernames by @quantum5 in #1520
- Add unittests for organization-private problems by @Ninjaclasher in #1504
- Explicitly set
case_points
andcase_total
to 0 by @kiritofeng in #1537 - Do bounds checks when fetching comment history; fixes #1542 by @kiritofeng in #1551
- Clone organizations for org-private problems; fixes #1530 by @xiaowuc1 in #1531
- Allow blank assignees when editing ticket by @zecookiez in #1534
- Correct pluralization of contest count; fixes #1550 by @kiritofeng in #1554
- Correctly pluralize assignees on ticket page by @zecookiez in #1555
- Fix font colour on rating tooltip by @kiritofeng in #1552
- Link user ranking graph to user-specific ranking by @Ninjaclasher in #1557
- Add file extension field to Language by @Ninjaclasher in #1553
- Set points to 0 upon aborting a submission by @quantum5 in #1528
- Fix markdown preview not working when replying to comments by @Ninjaclasher in #1558
- Disable codecov status by @quantum5 in #1562
- Fix contest ranking start time tooltip by @quantum5 in #1565
- Use a more precise filter for participation start tooltip by @quantum5 in #1566
- Do not run user scripts on the Edit Profile page by @WallE256 in #1561
- Add is_public to APIProblemDetail by @jtyliu in #1564
- Use infinite pagination on all submissions API page by @quantum5 in #1519
- Implement basic user migration command by @quantum5 in #1489
- Prevent muted people from voting. by @ehhthing in #1563
- Surface maximum runtime on single test case for AC submissions by @xiaowuc1 in #1525
- Use sentence case headings consistently by @Xyene in #1567
- Add submission activity graph to users page; #236 by @Ninjaclasher in #1480
- Decimal precision for user points in contest; Fixes #675 by @Carson-Tang in #1223
- Make admin notes into a codeblock by @ehhthing in #1571
- Make problem breakdown rows have relative dates; #1574 by @Ninjaclasher in #1575
- Add missing translation strings by @Carson-Tang in #1568
- Fix minor submission activity graph issues by @Ninjaclasher in #1573
- Fix ticket author indenting on front page sidebar by @Ninjaclasher in #1577
- Fix error in
trans
block by @kiritofeng in #1578 - Prioritize contest problem access checks by @quantum5 in #1579
- Better queries for Problem.author/editor/tester_ids by @quantum5 in #1580
- Remove share to Google Plus on Contests and Blogs by @kevinjycui in #1583
- Update format of Git requirements by @WallE256 in #1585
- Add support for C++20 by @Ninjaclasher in #1588
- Remove CSS For Google+ Features by @slightlyskepticalpotat in #1593
- Don't wrap testdata case type column in select2 by @Xyene in #1596
- Don't rate contests which have not finished yet by @Ninjaclasher in #1591
- Switch from pyotp to secrets for generating backup 2FA tokens by @fluix-dev in #1594
- Use the correct permissions for showing contest admin tab by @Ninjaclasher in #1601
- Remove rate button for ongoing contests; #1592 by @Carson-Tang in #1599
- Added option DMOJ_PRIVATE_SUBMISSION to hide source code by @munhyunsu in #1582
- Show admin tabs on own profile page by @Ninjaclasher in #1603
- Expose participation start and end times through API; fixes #1586 by @WallE256 in #1587
- Ensure
0
instead ofNone
in home page submission count by @Ninjaclasher in #1611 - Fix styling error with admin tabs by @kiritofeng in #1613
- Make cache versioned so we can purge manually by @quantum5 in #1619
- Make updatemessages use peter-evans/create-pull-request@v3 by @quantum5 in #1618
- Make updatemessages workflow run daily by @quantum5 in #1620
- Do not increase volatility for DQed users by @xiaowuc1 in #1608
- Consolidate pagination bar spacings by @Ninjaclasher in #1589
- Exclude unlisted user submissions from total submissions by @quantum5 in #1625
- Limit height of ongoing contest box on home page by @quantum5 in #1629
- Add CI test to build CSS by @quantum5 in #1632
- Require a solved problem to update profile about by @quantum5 in #1633
- Use Profile.has_any_solves in CommentedDetailView.get_context_data by @quantum5 in #1634
- Remove organization registrant field by @kiritofeng in #1637
- Filter submissions by language before generating rankings by @quantum5 in #1628
- Always show top border line on submission table by @quantum5 in #1630
- Support django-recaptcha2>=1.4.0 by @quantum5 in #1631
- Properly centre forms on login and 2fa pages by @Ninjaclasher in #1622
- Limit width of registration form for mobile by @leduythuccs in #1638
- Require a solved problem to create a new ticket out of contest by @Ninjaclasher in #1639
- Correctly implement lazy static URL resolution by @quantum5 in #1640
- Added scoreboard_visibility by @jtyliu in #1627
- Use gettext_lazy to translate title by @leduythuccs in #1644
- Add is_organization_private to automatic problem rescore check by @Ninjaclasher in #1643
- Fix ranked submissions on empty language filter by @quantum5 in #1646
- Don't set negative margin followed by padding on ticket messages by @Ninjaclasher in #1647
- Set updatemessages PR author to dmoj-build by @quantum5 in #1650
- Set caniuse PR author to dmoj-build by @quantum5 in #1651
- Add validation on problem statement for disallowed characters; fixes … by @Carson-Tang in #1623
- Add copy button on loading comment history by @quantum5 in #1653
- Faster filtering on submission API v2 endpoint by @quantum5 in #1654
- Improve balancing between judges with same load by @quantum5 in #1652
- Fix impossible to translate strings by @quantum5 in #1656
- Update translations from Crowdin by @dmoj-build in #1521
- Import latest Can I use... data by @dmoj-build in #1302
- Add minor improvements to user data downloads by @Ninjaclasher in #1655
- Reduce time complexity for chain of * in problem filter by @quantum5 in #1658
- Update English source .po files in updatemessages by @quantum5 in #1657
- Add problem visibility to APIProblemList by @jtyliu in #1661
- Make caniuse PR use reviewers instead of assignees by @quantum5 in #1665
- Pretty format caniuse.json by @quantum5 in #1664
- Make translations PR use reviewers instead of assignees by @quantum5 in #1666
- Add comment for non-trivial submission saving logic by @kiritofeng in #1669
- Ignore Vim's backups by @kiritofeng in #1671
- Add contest curator and testers by @kiritofeng in #1668
- Add
is_locked
tosubmission_related
by @kiritofeng in #1673 - Compute user_tester_ids without an inner join by @quantum5 in #1674
- Allow contest curators and authors to see submissions made in contest by @kiritofeng in #1672
- Fix missing
distinct()
by @kiritofeng in #1675 - Set submission contest object to None on contest submission delete by @Ninjaclasher in #1676
- Remove unneeded
profile.update_contest()
call inProblemSubmit
by @Ninjaclasher in #1677 - Fix
SubmissionMixin
access_check()
method by @kiritofeng in #1678 - Remove unused PrivateMessage model by @kiritofeng in #1680
- Create initial revision on contest/problem clone by @Ninjaclasher in #1679
- Convert submission lock, rejudged date, and contest lock to timestamps by @Ninjaclasher in #1660
- Refactor atomic revisions by @kiritofeng in #1682
- Consistently cache global submission stats by @quantum5 in #1681
- Fix attempt to fetch all submissions by @quantum5 in #1683
- Allow unlisted users to see contest rank; fixes #1607 by @kiritofeng in #1609
- Refactor implementation of contest rating by @quantum5 in #1685
- Use correct spacing for rating column in contest rankings by @quantum5 in #1686
- ratings: correctly handle unrated users in SQL by @quantum5 in #1687
- Pass request as context in default flatpage template by @quantum5 in #1689
- Recompute rating for all users that participated by @quantum5 in #1697
- Remove unused
valid_id
injudge/views/register.py
by @Ninjaclasher in #1703 - Expose
is_rated
andrate_all
in API v2 contest list by @Ninjaclasher in #1694 - Remove unneeded rating object delete operation in
rate_contest
by @Ninjaclasher in #1699 - Atomically rate multiple contests by @quantum5 in #1702
- Filter contest submissions properly in live updates by @Ninjaclasher in #1701
- Refactor TOTPEnableView in preparation for #1693 by @quantum5 in #1708
- Display better message on editorial 404 by @quantum5 in #1711
- Implement TOTP key refreshing by @quantum5 in #1710
- Allow TOTP to be disabled when WebAuthn is enabled by @quantum5 in #1712
- Allow WebAuthn devices to be managed in admin by @quantum5 in #1713
- Use html.unescape instead of deprecated HTMLParser.unescape by @quantum5 in #1715
- Allow scratch codes with only WebAuthn by @quantum5 in #1716
- Refactor TOTP code checking to its own function by @quantum5 in #1719
- Make TOTP enable/disable views mobile friendly by @Ninjaclasher in #1714
- Use django-admin-sortable2 for contest problem ordering by @quantum5 in #1717
- Add option to hide problem authors while in contest by @Ninjaclasher in #1718
- Add word wrap to case feedback on submission status by @quantum5 in #1726
- Prevent the reuse of TOTP authentication codes by @quantum5 in #1720
- Store rounded participation score in database by @Ninjaclasher in #1725
- Implement per-problem submission access control by @quantum5 in #1727
- Check correct variable on submission detail pages by @quantum5 in #1728
- Reorder fields in problem admin by @kiritofeng in #1730
- Remove unused
malformed_packet
method by @Ninjaclasher in #1729 - Remove unused ticket CSS "messages" class by @Ninjaclasher in #1734
- Remove duplicated and unused
manifest.json
by @Ninjaclasher in #1735 - fix: font-size unit correction by @subramanian0 in #1736
- fix: security - window.opener property should not be available for third party sites. by @subramanian0 in #1737
- Cap new rating before computing new volatility by @Ninjaclasher in #1738
- Update translations from Crowdin by @dmoj-build in #1659
- Add rate limit to password reset view by @quantum5 in #1741
- Return to first page of paginator after changing filter options by @quantum5 in #1739
- Implement user display name override by @quantum5 in #1747
- Migrate rating system from Topcoder to Elo-MMR by @int-y1 in #1751
- For DQ'ed contest participations, set cumtime to zero unconditionally. by @xiaowuc1 in #1752
- For DQ'ed contest participations, set tiebreaker to zero unconditionally. by @xiaowuc1 in #1753
- Do not render MathJax math in description editor by @int-y1 in #1754
- Implement contest settings short display by @Ninjaclasher in #1732
- Fix
li
tag in contest short form display by @Ninjaclasher in #1755 - Use CSPRNG for judge keys by @int-y1 in #1757
- Update translations from Crowdin by @dmoj-build in #1740
- Implement hardcore 2FA mode by @quantum5 in #1762
- Ensure
edit_own_problem
is a prerequisite foredit_all_problem
by @Ninjaclasher in #1722 - Add flake8-quotes to the linter by @Riolku in #1763
- Return a plaintext 404 response for comment vote view by @Ninjaclasher in #1769
- Prevent multiple pending join requests from same user by @quantum5 in #1770
- Fix linter mistake by @int-y1 in #1771
- Implement dumb full text search for CJK by @quantum5 in #1772
- Add styling for spoilers with HTML
- Allow
- Allow joining a new contest while a participation is already active by @Ninjaclasher in #1778
- Add disallowed character validation for other Problem-related fields by @Ninjaclasher in #1779
- Remove CachedContestCalendar view by @quantum5 in #1781
- Replace force_text with force_str by @quantum5 in #1784
- Remove dependency on django.utils.six by @quantum5 in #1783
- Remove unused
rated_users
context on profile page by @Ninjaclasher in #1786 - Surface problem links for authors/curators on contest page; fixes #1746 by @kiritofeng in #1787
- Fix ticket message styling, add relative dates and admin button by @Ninjaclasher in #1780
- Preventing duplicate form submissions by @leduythuccs in #1777
- Fix join/spectate button in contest listing by @int-y1 in #1765
- Change style of unrated username by @int-y1 in #1795
- Add checkmark to hide closed tickets by @int-y1 in #1793
- Copy supported languages from judge-server to README by @int-y1 in #1792
- Avoid marking graded submissions as aborted by @WallE256 in #1798
- Move to MathJax 3.2.0 by @int-y1 in #1797
- Explicitly exclude current user from rank by point query by @Ninjaclasher in #1785
- Remove raw problem view by @kiritofeng in #1801
- Remove deprecated @abstractproperty by @quantum5 in #1788
- Display rating level names as hover text by @quantum5 in #1790
- Remove uses of Django 3.0 deprecations by @quantum5 in #1789
- Avoid PyPI webauthn 1.x for now by @quantum5 in #1803
- Remove PO-Revision-Date-only translation PRs by @quantum5 in #1805
- Implement basic contest iCalendar output by @quantum5 in #1782
- Remove POT-Creation-Date-only translation PRs by @quantum5 in #1807
- Allow PDF footers to be disabled by @quantum5 in #1808
- Fix race condition in PDF math rendering by @int-y1 in #1810
- Properly prevent multiple form submissions by @leduythuccs in #1809
- Prevent editing of comment score from admin panel by @kiritofeng in #1812
- Typo fix by @int-y1 in #1818
- Fix mistune by @UnknowName01 in #1825
- Pass ticket to TicketMessageDataAjax view by @quantum5 in #1826
- Add space in rating chart by @int-y1 in #1817
- Add support for classes by @quantum5 in #1828
- Leave a spare judge when rejudging if possible by @quantum5 in #1842
- Distinguish virtual participations in contest submission inline by @quantum5 in #1841
- Fix contest editorial display for future editorials by @Riolku in #1845
- Infer private booleans; fixes #1829 by @kiritofeng in #1830
- Don't write empty dict to init.yml by @leduythuccs in #1794
- Full hidden scoreboard & Post-window own scoreboard by @Riolku in #1843
- Use different colour for the first letter of target by @quantum5 in #1814
- Correctly redirect organization user page with wrong slug by @quantum5 in #1813
- Set
u+x
onmanage.py
by @kiritofeng in #1848 - Add editorial column and filtering by @Riolku in #1844
- Auto-submit search form when has editorial is clicked by @Riolku in #1849
- Convert django.conf.urls.url to django.conf.urls.(re_)path by @jisoochoi7561 in #1823
- fix submission visibility in contests by @Riolku in #1850
- Fix errors in #1830 by @kiritofeng in #1852
- Fix problem name sort for untranslated problems by @quantum5 in #1853
- Fix statistics tab; fixes #1756 by @kiritofeng in #1851
- add submission 403 page by @Riolku in #1858
- add editorial book and sort by @Riolku in #1857
- cmd+enter to submit by @y0105w49 in #1868
- fix visibility check on contest saving by @Riolku in #1865
- add toggle for testers to see scoreboard by @Riolku in #1871
- Save submission state before rejudging by @quantum5 in #1867
- Change wording of "Maximum runtime on single test case" by @slightlyskepticalpotat in #1569
- add editorial tooltip by @Riolku in #1866
- shrink editorial column by @Riolku in #1863
- Can join organizations by @Riolku in #1854
- add
view_contest_submissions
field by @Riolku in #1860 - Fix Contest model fields without translation by @quantum5 in #1873
- add change visibility blog post perm by @Riolku in #1870
- Make massive Q chains look less silly by @quantum5 in #1874
- Add spectator to contests by @Riolku in #1869
- add
tester_see_scoreboard
to ContestAdmin by @Riolku in #1875 - fix contest join buttons by @Riolku in #1877
- Fix problems list not showing all problems a user has access to by @Ninjaclasher in #1820
- warn on joining, not spectating on list by @Riolku in #1880
- Avoid passing models to celery tasks by @quantum5 in #1878
- Compare i18n changes with correct branch by @int-y1 in #1884
- Fetch all branches in GitHub action by @int-y1 in #1885
- Avoid closing the translations PR when there is no change by @quantum5 in #1889
- Log context switch information into JSON logger by @quantum5 in #1882
- Switch custom requirements from unencrypted git to https by @Ninjaclasher in #1896
- Fix i18n messages for pwned passwords by @int-y1 in #1894
- Update Ruby key in language fixture by @Ninjaclasher in #1892
- Fix i18n in fields by @int-y1 in #1897
- Allow rejudging when there is only a single judge by @Ninjaclasher in #1902
- Add judge.utils.iterator.chunk by @quantum5 in #1903
- Use new safe translation module for Jinja2 by @quantum5 in #1899
- Remove unsafe translations in Python code by @quantum5 in #1900
- Add i18n to a line of text by @int-y1 in #1898
- Import Markup from MarkupSafe instead of jinja2 by @Ninjaclasher in #1909
- Make submission history chart timezone aware by @Ninjaclasher in #1904
- Localize date in user rating chart tooltip by @Ninjaclasher in #1908
- Fix i18n issues in models by @int-y1 in #1910
- Link editorial on problem list by @Riolku in #1906
- Fix translations unparsable by Django's extractor by @quantum5 in #1905
- updatemessages: checkout from $i18n_head when no material change by @quantum5 in #1912
- Fix dependency versions by @int-y1 in #1918
- Typo fix by @int-y1 in #1922
- Fix i18n on content titles by @int-y1 in #1920
- Fix countdown space by @int-y1 in #1928
- Remove useless "set title" by @int-y1 in #1924
- Clean up i18n in str by @int-y1 in #1932
- Disallow voting on own comments by @int-y1 in #1927
- Remove dead templates by @int-y1 in #1923
- Fix TypeError with new version of Pygments by @Ninjaclasher in #1936
- Upgrade to actions/checkout@v2 by @int-y1 in #1930
- Fix i18n issues with relative_time by @int-y1 in #1934
- Fix comment editor's buttons on narrow screens by @int-y1 in #1907
- Clean up css for content columns by @int-y1 in #1926
- Fix preview when editing comment twice by @int-y1 in #1925
- Remove html tags in i18n translations by @int-y1 in #1921
- Remove py2 syntax in fixture by @int-y1 in #1957
- Fix bugs on class page by @int-y1 in #1963
- Update translations from Crowdin by @dmoj-build in #1891
- Updated the memory limit help text shown in the problem editor from 64mb to 256mb by @wesley-a-leung in #1950
- Better timezone detection in registration forms by @int-y1 in #1944
- Fix 500 error on /contest/<code>/leave by @int-y1 in #1956
- Improve license link by @int-y1 in #1959
- Ban pointless Unicode characters from problem statements by @int-y1 in #1960
- Remove py2 unicode syntax by @int-y1 in #1947
- Translate the problem types in a dropdown by @int-y1 in #1948
- Improve password reset email by @int-y1 in #1945
- Improve submission status's i18n strings by @int-y1 in #1946
- Fix filters that break i18n by @int-y1 in #1939
- Minor i18n message fixes by @int-y1 in #1937
- Make DMOJ logo symmetrical by @int-y1 in #1931
- Added Greek language option in UI by @ptheoch in #1972
- Fix regression caused by 42ee283; fixes #1970 by @kiritofeng in #1976
- Fix rare bug on copying text by @int-y1 in #1979
- Use full sentences in help_text by @int-y1 in #1988
- Fix scratch code's copy button by @int-y1 in #1982
- Fix code comments by @int-y1 in #1978
- Fix pwned passwords throwing
ValueError
by @Ninjaclasher in #1991 - bridge: make blocked judges less noisy by @Xyene in #1998
- Fix broken celery dependency by @quantum5 in #2000
- Update admin sidebar by @kiritofeng in #1999
- Only display editorials for public problems; fixes #1961 by @kiritofeng in #2001
- Fix period in sentences by @int-y1 in #1992
- Avoid waiting when only one judge can handle a submission by @quantum5 in #2002
- Show more comment info in admin page by @int-y1 in #2012
- Check for organization join limit at registration by @int-y1 in #2003
- Fix i18n messages by @int-y1 in #1984
- Add i18n plurals in templates by @int-y1 in #1983
- Add i18n to js messages by @int-y1 in #1985
- Change how username is displayed in tickets by @int-y1 in #2008
- Allow sorting of organization's user list by @int-y1 in #1977
- Confirm rejudging on submission page by @Riolku in #2010
- Increase precision on relative time offsets by @int-y1 in #1990
- Add i18n to server-side messages by @int-y1 in #1980
- Fixup active tab having a pixel border drawn by @Xyene in #2014
- Upgrade to Django 3.2 by @quantum5 in #1811
- Make comments work again on Django 3.2 by @quantum5 in #2016
- Add related_model to FakeJoinField for join_sql_subquery by @quantum5 in #2017
- Fix rating graph regression from cd167f8 by @Xyene in #2018
- Partially revert fd8f8fc to fix #2013 by @Xyene in #2019
- ci: update actions by @Xyene in #2015
- Remove dead settings by @int-y1 in #1952
- Migrate to bleach 5.0.0 by @int-y1 in #1915
- Remove useless locale files by @int-y1 in #1940
- i18n plurals in error messages by @int-y1 in #1953
- Remove reply button on old comments by @int-y1 in #2009
- Refactor user submission table's js by @int-y1 in #1954
- Highlight partial AC testcases differently by @Xyene in #2021
- Make contest list header casing match the rest of the site by @Xyene in #2022
- Improve styling of password reset email by @int-y1 in #1993
- Replace unique_together_left_join with FilteredRelation by @quantum5 in #2023
- Remove RawSQLColumn now that it's unused by @quantum5 in #2024
- Fix submission table for 0 submissions by @int-y1 in #2030
- Remove i18n for coding error messages by @int-y1 in #2029
- Modernize activation email by @int-y1 in #2028
- Make
pretest_test_cases
andtest_cases
disjoint by @Xyene in #2025 - Remove dead function by @int-y1 in #2034
- Clean up table css by @int-y1 in #2037
- Clean up page tab's css by @int-y1 in #2038
- Clean up ContestCalendar css by @int-y1 in #2036
- Don't allow for infinite and nan values in
safe_float_or_none
by @kiritofeng in #2039 - Remove textWidth by @int-y1 in #2042
- Introduce primary color in scss by @int-y1 in #2041
- Standardize SCSS gray colors by @int-y1 in #2043
- Remove dead AdminPagedownWidget by @int-y1 in #2045
- Clean up widget scss by @int-y1 in #2044
- Migrate text editor css to scss by @int-y1 in #2048
- Add scss variables for link colors by @int-y1 in #2049
- Fix editor buttons when replying to comment by @int-y1 in #2050
- Add link to post when using blog summary by @int-y1 in #2052
- Add querystring option to enable dark mode by @int-y1 in #2053
- Add querystring option to enable dark mode (attempt 2) by @int-y1 in #2056
- Improve l10n in solved problems table by @int-y1 in #2063
- Update Django links to 3.2 by @int-y1 in #2062
- Correctly set contest.is_organization_private when using classes by @quantum5 in #2065
- Make it possible to change class members in admin by @quantum5 in #2064
- Create dark mode for Featherlight by @int-y1 in #2068
- fix page titles on dark mode by @slightlyskepticalpotat in #2067
- Make ?dark activate dark mode by @quantum5 in #2069
- Clean up comment CSS by @Ninjaclasher in #2070
- Use striped tables by @int-y1 in #2071
- Remove IE8 code by @int-y1 in #2072
- Allow unicode and nobigmath hints to be used with site data by @FherStk in #2055
- Add problem points vote functionality by @lakshy-gupta in #1645
- Fix small error in pp calculation by @int-y1 in #2074
- Fix flake8 configuration by @Ninjaclasher in #2077
- Fix bridge database connection leaks by @quantum5 in #2080
- Minor fix to judge table by @int-y1 in #2078
- Use DMOJ's own
django-fernet-fields
by @kiritofeng in #2081 - Explicitly set DEFAULT_AUTO_FIELD by @quantum5 in #2082
- Dark mode images by @int-y1 in #2084
- Fix blank submission activity colour by @Ninjaclasher in #2086
- Fix CSS for rating circles by @int-y1 in #2083
- Fix math_setting crash when reporting errors by @quantum5 in #2087
- Change style for bad user mentions by @int-y1 in #2079
- Remove dead variables for rating chart by @int-y1 in #2090
- Remove recently_attempted_problems by @int-y1 in #2088
- Fix the check for has_any_solves by @int-y1 in #2089
- Standardize labels in edit profile page by @int-y1 in #2073
- Fix SVG/PNG math in dark mode by @int-y1 in #2093
- Move ticket CSS into SCSS file by @int-y1 in #2094
- Use more reasonable values in sitemap by @int-y1 in #2092
- Make problem search more sane by @int-y1 in #2051
- Update translations from Crowdin by @dmoj-build in #1971
- Fix ticket form's width by @int-y1 in #2096
- Improve padding and margin of comment section by @int-y1 in #2098
- Clean up user icon in top-right corner by @int-y1 in #2100
- Implement disabling a judge by @WallE256 in #2005
- Improve the judge and runtime admin pages by @WallE256 in #2102
- Replace deprecated
django.conf.url
withdjango.urls.path
by @kiritofeng in #2085 - Delete & Prevent zombie editorials (Closes #1958) by @jdabtieu in #2004
- Remove negative margins in comments by @int-y1 in #2101
- Remove dead css on comments by @int-y1 in #2105
- Clean up css for users by @int-y1 in #2106
- Clean up css on contest list page by @int-y1 in #2107
- Clean up pagination css in user table by @int-y1 in #2112
- Fix small bug with problem attempt icon by @int-y1 in #2104
- Simplify AC query for /stats/language/ by @int-y1 in #2109
- Clean up org edit page by @int-y1 in #2111
- Clean up blog css by @int-y1 in #2113
- Add more space for user info column by @int-y1 in #2114
- Add dark Pygments code theme by @int-y1 in #2115
- Simplify CSS in judge version table by @int-y1 in #2117
- Slightly clean up navbar css by @int-y1 in #2119
- Remove Django 2.2 file by @int-y1 in #2125
- Move navbar CSS into separate file by @int-y1 in #2120
- Clean up contest calendar css by @int-y1 in #2122
- Fix rendering of target color on contest page by @Balint-R in #2124
- Clean up blog page css by @int-y1 in #2121
- Remove msp math renderer by @int-y1 in #2126
- Simplify design of user table's rating column by @int-y1 in #2127
- Fix hot problems css by @int-y1 in #2128
- Add more i18n by @int-y1 in #2132
- Minor i18n fixes by @int-y1 in #2134
- Remove png support in mathoid by @int-y1 in #2130
- Update translations from Crowdin by @dmoj-build in #2097
- Pin packaging to < 22 by @Xyene in #2138
New contributors
- @kevinjycui made their first contribution in #1399
- @adambenali made their first contribution in #1401
- @zecookiez made their first contribution in #1503
- @slightlyskepticalpotat made their first contribution in #1481
- @malbareda made their first contribution in #1518
- @jtyliu made their first contribution in #1564
- @munhyunsu made their first contribution in #1582
- @leduythuccs made their first contribution in #1638
- @subramanian0 made their first contribution in #1736
- @Riolku made their first contribution in #1763
- @UnknowName01 made their first contribution in #1825
- @jisoochoi7561 made their first contribution in #1823
- @y0105w49 made their first contribution in #1868
- @wesley-a-leung made their first contribution in #1950
- @ptheoch made their first contribution in #1972
- @FherStk made their first contribution in #2055
- @lakshy-gupta made their first contribution in #1645
- @jdabtieu made their first contribution in #2004
- @Balint-R made their first contribution in #2124