Skip to content

Management Commands

Tra cứu mọi lệnh quản trị riêng của LCOJ (tạo người dùng, đăng ký máy chấm, nhập bài, xuất dữ liệu kỳ thi, sinh lời giải...) cùng đúng tham số của từng lệnh.

👤 Người vận hành · 🔑 SSH vào máy chủ và quyền chạy docker compose trong thư mục dmoj/

LCOJ có sẵn một bộ lệnh quản trị (Django management command) cho các việc như tạo người dùng và máy chấm, nhập bài, xuất dữ liệu kỳ thi, sinh lời giải... Trang này liệt kê toàn bộ các lệnh riêng đó, kèm đúng các tham số mà từng lệnh nhận.

Khi nào cần trang này

Dùng trang này khi bạn cần làm một việc quản trị mà giao diện web không làm được hoặc làm chậm (ví dụ tạo hàng loạt tài khoản). Management command là một lệnh Django chạy từ dòng lệnh bên trong container site; xem thêm Thuật ngữ.

  • Mọi lệnh đều chạy theo cùng một cách, xem Cách chạy lệnh.
  • Tìm lệnh theo nhóm trong bảng Tổng quan, hoặc theo việc cần làm:
Tôi muốn...Lệnh
Tạo một tài khoảnadduser
Tạo tài khoản cho cả lớp từ file CSVbatchadduser
Gộp hai tài khoản của cùng một ngườimove_user_content
Cấp API token cho người dùnggenerate_api_token
Đăng ký một máy chấm mớiaddjudge
Nhập bài từ Codeforces Polygonimport_polygon_package
Tải mã nguồn của thí sinh sau kỳ thiexport_contest_submissions
Kiểm tra đạo code trong kỳ thirunmoss
Sinh lời giải tự độnggenerate_editorials
Xem tham số của một lệnh bất kỳ./scripts/manage.py help <command> (chi tiết)

Cách chạy lệnh

Với bản cài Docker, chạy lệnh từ thư mục dmoj/ qua script bọc ./scripts/manage.py:

sh
cd dmoj/
./scripts/manage.py <command> [tham số] [tùy chọn]

Script này chạy docker compose exec $COMPOSE_EXEC_FLAGS site python3 manage.py <command>, tức là lệnh được thực thi bên trong container site.

Đường dẫn file nằm trong container

Thư mục làm việc của container site/site/, tương ứng dmoj/repo/ trên máy chủ. Mọi đường dẫn tương đối bạn truyền vào (file CSV đầu vào, file hay thư mục đầu ra) đều nằm dưới dmoj/repo/ trên máy chủ. Các thư mục dùng chung khác: /problems/ = dmoj/problems/, /media/ = dmoj/media/.

Tham số có dấu cách

Script truyền tham số không có dấu nháy ($@), nên một tham số chứa dấu cách (như tên bài) sẽ bị tách thành nhiều tham số. Với những lệnh như vậy, hãy mở shell trong container bằng ./scripts/enter_site rồi chạy python3 manage.py <command> ... ở đó.

Truyền thêm biến môi trường

Script chuyển COMPOSE_EXEC_FLAGS cho docker compose exec. Ví dụ, đặt một biến chỉ cho một lần chạy:

sh
COMPOSE_EXEC_FLAGS="-e OPENAI_API_KEY=sk-..." ./scripts/manage.py generate_editorials --dry-run

Tổng quan

NhómLệnhCông dụng
Người dùngadduserTạo một người dùng
Người dùngbatchadduserTạo nhiều người dùng từ file CSV, tự sinh mật khẩu
Người dùngmove_user_contentChuyển bài nộp và bình luận từ tài khoản này sang tài khoản khác
Người dùnggenerate_api_tokenSinh (hoặc sinh lại) API token của người dùng
Chấm bàiaddjudgeĐăng ký máy chấm cùng khóa xác thực
Chấm bàirunbridgedChạy bridge cho máy chấm (dịch vụ bridged dùng lệnh này)
Chấm bàirunbalancerChạy bộ cân bằng tải cho máy chấm
Bài tậpcreate_problemTạo một bài trống
Bài tậpimport_polygon_packageNhập bài từ package Codeforces Polygon
Bài tậpsubmit_polygon_solutionsNộp toàn bộ lời giải có trong package Polygon
Bài tậpcopy_languageCho phép ngôn ngữ B ở mọi bài đang cho phép ngôn ngữ A
Bài tậprender_pdfXuất đề bài ra PDF
Bài tậpbackfill_problem_data_sizeTính lại dung lượng file dữ liệu của từng bài
Lời giảigenerate_editorialsSinh lời giải bằng API tương thích OpenAI
Kỳ thiexport_contest_submissionsXuất mã nguồn của thí sinh ra cây thư mục
Kỳ thiexport_contest_submissions_detailsXuất kết quả từng test ra CSV
Kỳ thiexport_event_feedXuất event feed CLICS dạng XML (cho ICPC Resolver)
Kỳ thirunmossKiểm tra đạo code trong kỳ thi bằng MOSS
Kỳ thimerge_replay_dataThêm thí sinh của kỳ thi khác vào replay dưới dạng "bóng ma"
Tổ chứcbackfill_current_creditTính lại credit đã dùng trong tháng này của mọi tổ chức
Tổ chứcbackfill_monthly_creditTính lại lịch sử credit theo tháng của mọi tổ chức
Trang webadd_blog_navigationThêm mục "Blog" vào thanh điều hướng
Trang webgenerate_sitemapGhi các file sitemap tĩnh vào một thư mục
Trang webupdate_permissionsTạo/đổi tên quyền sau khi model thay đổi
Trang webmakedmojmessagesTạo file dịch cho các chuỗi lưu trong cơ sở dữ liệu
Trang webcamoIn ra URL qua proxy Camo của một ảnh

Các lệnh có sẵn của Django (migrate, createsuperuser, shell, loaddata, compilemessages, ...) cũng chạy qua cùng script này.

Người dùng

adduser

Tạo một người dùng cùng hồ sơ (profile).

sh
./scripts/manage.py adduser <name> <email> <password> [language] [--superuser] [--staff]
Tham sốMô tả
nameTên đăng nhập
emailEmail (không cần là email thật)
passwordMật khẩu
languageKhông bắt buộc. Mã ngôn ngữ mặc định của người dùng; mặc định là DEFAULT_USER_LANGUAGE (CPP20)
--superuserCấp quyền superuser
--staffCấp quyền staff (được vào trang quản trị Django)
sh
./scripts/manage.py adduser alice [email protected] 'S3cret!' PY3

WARNING

Mật khẩu sẽ nằm trong lịch sử shell. Với tài khoản quản trị, nên dùng createsuperuser, hoặc đổi mật khẩu ngay sau khi tạo.

batchadduser

Tạo nhiều người dùng từ file CSV. Mật khẩu được tự sinh (8 ký tự ngẫu nhiên) và ghi ra một file CSV kết quả.

sh
./scripts/manage.py batchadduser <input> <output>
Tham sốMô tả
inputFile CSV có dòng tiêu đề gồm cột usernamefullname
outputNơi ghi file CSV kết quả (username,fullname,password)

File đầu vào (dmoj/repo/students.csv trên máy chủ):

csv
username,fullname
lc_student01,Nguyen Van A
lc_student02,Tran Thi B
sh
./scripts/manage.py batchadduser students.csv students_out.csv

fullname được lưu vào trường tên (first name); mọi người dùng nhận ngôn ngữ mặc định DEFAULT_USER_LANGUAGE. Lệnh sẽ dừng ngay khi gặp tên đăng nhập trùng, vì vậy hãy kiểm tra file đầu vào trước.

WARNING

File CSV kết quả chứa mật khẩu dạng rõ. Hãy gửi cho người dùng một cách an toàn rồi xóa file.

move_user_content

Chuyển toàn bộ bài nộp, bình luận và lượt vote bình luận từ source sang target. Hữu ích khi một người có hai tài khoản.

sh
./scripts/manage.py move_user_content <source> <target>

Không thể hoàn tác

Thao tác chạy trong một transaction nhưng không có cách tự động đảo ngược: sau đó bạn không còn phân biệt được bài nộp nào vốn của source. Hãy sao lưu cơ sở dữ liệu trước. Lệnh từ chối chạy nếu source đã từng tham gia kỳ thi. Tài khoản source không bị xóa.

generate_api_token

Sinh hoặc sinh lại API token của người dùng và in ra màn hình. Token là chuỗi URL-safe dài 48 ký tự, dùng trong header Authorization: Bearer <token> (xem API).

sh
./scripts/manage.py generate_api_token <name>

WARNING

Sinh lại token sẽ làm token cũ mất hiệu lực. Token bỏ qua xác thực hai lớp (nhưng không vào được trang quản trị), nên hãy giữ nó như mật khẩu.

Chấm bài

addjudge

Đăng ký máy chấm vào cơ sở dữ liệu để nó kết nối được tới bridge.

sh
./scripts/manage.py addjudge <name> <auth_key>
Tham sốMô tả
nameTên máy chấm (phải trùng với id trong cấu hình máy chấm)
auth_keyKhóa xác thực (phải trùng với key trong cấu hình máy chấm)

Lệnh không tự sinh khóa; bạn tự chọn, ví dụ bằng openssl rand -base64 48. Cũng có thể tạo máy chấm trong trang quản trị Django. Xem Cài đặt máy chấm.

runbridged

Chạy bridge mà các máy chấm kết nối tới. Với bản cài Docker, đây là lệnh khởi động của dịch vụ bridged; bạn không cần tự chạy.

sh
python3 manage.py runbridged [--monitor] [--problem-storage-globs GLOB ...]
Tùy chọnMô tả
--monitorTheo dõi thư mục dữ liệu bài và tự cập nhật bài khi dữ liệu thay đổi
--problem-storage-globsCác glob cần theo dõi (mặc định: không có)

Địa chỉ lắng nghe lấy từ các thiết lập BRIDGED_JUDGE_ADDRESS (mặc định cổng 9999) và BRIDGED_DJANGO_ADDRESS (mặc định cổng 9998), không phải từ tham số dòng lệnh.

runbalancer

Chạy bộ cân bằng tải cho máy chấm với file cấu hình YAML.

sh
./scripts/manage.py runbalancer -c <config.yml>
Tùy chọnMô tả
-c, --configFile YAML chứa cấu hình bộ cân bằng tải (bắt buộc)

Bài tập

create_problem

Tạo một bài trống với đề bài, một dạng bài và một nhóm bài. Dạng bài và nhóm bài phải có sẵn.

sh
./scripts/manage.py create_problem <code> <name> <body> <type> <group>
Tham sốMô tả
codeMã bài
nameTên bài
bodyĐề bài (Markdown)
typeTên một dạng bài đã có
groupTên một nhóm bài đã có
sh
# chạy trong container (./scripts/enter_site), vì tên và đề bài có dấu cách
python3 manage.py create_problem aplusb "A + B" "Tính a + b." <type_name> <group_name>

Lệnh không đặt giới hạn, điểm, test hay tác giả; hãy sửa bài sau khi tạo (xem Quản lý bài tập).

import_polygon_package

Nhập một package đầy đủ (full package, dạng zip) từ Codeforces Polygon.

sh
./scripts/manage.py import_polygon_package <package> <code> [--update] [--authors USER ...] [--curators USER ...]
Tham số / tùy chọnMô tả
packageĐường dẫn tới file zip
codeMã bài cần tạo
--updateCập nhật bài nếu đã tồn tại
--authorsMột hoặc nhiều tên đăng nhập làm tác giả
--curatorsMột hoặc nhiều tên đăng nhập làm người quản lý bài
sh
./scripts/manage.py import_polygon_package packages/aplusb.zip aplusb --authors admin

Quá trình nhập có tương tác (có thể hỏi bạn), và in ra URL của bài khi xong.

submit_polygon_solutions

Nộp mọi lời giải liệt kê trong problem.xml của package Polygon vào một bài đã có, để kiểm tra kết quả chấm có khớp nhãn mong đợi. Mỗi mã nguồn được thêm chú thích đầu file gồm tên file và kết quả mong đợi.

sh
./scripts/manage.py submit_polygon_solutions <package> <code> <submitter>
Tham sốMô tả
packageĐường dẫn tới file zip
codeMã bài
submitterTên đăng nhập dùng để nộp

Các ngôn ngữ được hỗ trợ ánh xạ sang mã CPP20, JAVA, PAS, PY2, PY3, PYPY, PYPY3, KOTLIN, GO, RUST; lời giải khác bị bỏ qua. Các mã ngôn ngữ này phải có trên hệ thống.

copy_language

Với mọi bài đang cho phép ngôn ngữ source, cho phép thêm ngôn ngữ target, đồng thời chép giới hạn thời gian/bộ nhớ riêng theo ngôn ngữ của source sang target.

sh
./scripts/manage.py copy_language <source> <target>
sh
./scripts/manage.py copy_language CPP17 CPP20

Cả hai tham số là mã ngôn ngữ, không phải mã bài.

Ghi đè danh sách bài của target

Danh sách bài cho phép target sẽ bị thay bằng danh sách của source: bài nào đang cho phép target nhưng không cho phép source sẽ mất target. Hãy sao lưu cơ sở dữ liệu trước khi chạy.

render_pdf

Xuất đề bài ra file <code>.pdf trong thư mục làm việc (dmoj/repo/ trên máy chủ).

sh
./scripts/manage.py render_pdf <code> [-l LANGUAGE]
Tham số / tùy chọnMô tả
codeMã bài
-l, --languageNgôn ngữ đề; dùng bản dịch nếu có. Mặc định: LANGUAGE_CODE (vi trong cấu hình mặc định của lcoj-docker)

Cần Pdfoid (DMOJ_PDF_PDFOID_URL). Xem Pdfoid.

backfill_problem_data_size

Tính lại dung lượng các file dữ liệu của từng bài (zip test, generator, checker, grader, header tùy biến) trong DMOJ_PROBLEM_DATA_ROOT và lưu tổng vào bản ghi dữ liệu bài.

sh
./scripts/manage.py backfill_problem_data_size [--dry-run]
Tùy chọnMô tả
--dry-runChỉ hiển thị thay đổi, không lưu

Chạy một lần sau khi nâng cấp lên phiên bản có theo dõi dung lượng dữ liệu bài, hoặc khi dung lượng hiển thị có vẻ sai.

Lời giải

generate_editorials

Sinh lời giải (editorial) cho các bài công khai chưa có lời giải, dùng API chat tương thích OpenAI với structured output của Pydantic.

sh
./scripts/manage.py generate_editorials [tùy chọn]

Yêu cầu

  • Gói openaipydantic. Hai gói này có trong additional_requirements.txt và đã được cài trong image base của Docker.
  • Biến OPENAI_API_KEY phải có trong môi trường của container site (thêm vào environment/site.env rồi tạo lại container, hoặc truyền qua COMPOSE_EXEC_FLAGS như ở trên).
  • OPENAI_BASE_URL không bắt buộc; đặt biến này để dùng một endpoint tương thích OpenAI khác.

Tùy chọn

Tùy chọnMô tảMặc định
--problem CODE, -p CODEChỉ xử lý một bàiMọi bài công khai chưa có lời giải
--limit N, -l NSố bài tối đa cần xử lý10
--offset NBỏ qua N bài đầu tiên (sắp theo ID)0
--dry-runSinh và xem trước, không lưu gìtắt
--verboseGhi log mức debugtắt
--model MODELTên model gửi lên APImimo-v2-flash
--temperature TNhiệt độ lấy mẫu0.7
--max-retries NSố lần thử lại khi API lỗi3
--retry-delay SThời gian chờ gốc (giây), nhân đôi sau mỗi lần thử lại2
--log-file PATHGhi log thêm vào file nàykhông có

Cách hoạt động

  1. Chọn các bài có is_public=True và chưa có lời giải (với --problem, bài đó phải công khai và chưa có lời giải).
  2. Lấy tối đa 3 bài nộp Accepted gần nhất bằng C/C++, ưu tiên của những người khác nhau.
  3. Gửi đề bài và các lời giải lên API, rồi phân tích câu trả lời theo một schema cố định.
  4. Dựng Markdown theo định dạng chuẩn bên dưới.
  5. Lưu lời giải ở trạng thái công khai, xuất bản ngay. Tác giả: người dùng tên admin (hoặc superuser đầu tiên), sau đó là tác giả của các bài nộp được lấy mẫu.

Xuất bản ngay lập tức

Lời giải sinh ra hiển thị cho người dùng ngay. Luôn xem trước bằng --dry-run và kiểm tra vài kết quả trên trang (https://luyencode.net/problem/<code>/editorial).

Định dạng lời giải (tiêu đề bằng tiếng Việt, đúng như được sinh ra):

markdown
## Hiểu bài toán
[Giải thích đề bài]

## Các cách tiếp cận

### Cách Brute Force

```cpp
[code]
```

* **Time Complexity**: O(n²)
* **Space Complexity**: O(1)

[Giải thích]

### Cách Hash Map
[code + giải thích]

## Phân tích độ phức tạp
| Cách tiếp cận | Time | Space | Tên |
|--------------|------|-------|-----|
| 1 | O(n²) | O(1) | Brute Force |
| 2 | O(n) | O(n) | Hash Map |

## Bài học kinh nghiệm
- [Nhận xét]

## Lỗi thường gặp
- [Lỗi]

Ví dụ

sh
# 1. Xem trước một bài (không lưu gì)
./scripts/manage.py generate_editorials --problem aplusb --dry-run --verbose

# 2. Sinh thật
./scripts/manage.py generate_editorials --problem aplusb

# 3. Xử lý 20 bài và ghi log (đường dẫn nằm trong container)
./scripts/manage.py generate_editorials --limit 20 --log-file /tmp/editorials.log

# 4. Dùng model khác
./scripts/manage.py generate_editorials --problem aplusb --model gpt-4o-mini --temperature 0.5

Log đánh dấu bài thành công bằng và thất bại bằng . Mỗi bài mất vài giây; hãy giảm --limit hoặc tăng --retry-delay nếu API giới hạn tần suất.

Lỗi thường gặp

Thông báoCách xử lý
OPENAI_API_KEY environment variable not setCung cấp khóa cho container site
OpenAI package not installedBuild lại image: docker compose up -d --build base site celery
Insufficient AC C/C++ solutionsBài chưa có bài nộp Accepted bằng C/C++; bỏ qua hoặc tự viết lời giải
Problem '<code>' not found or already has editorialSai mã bài, bài không công khai, hoặc đã có lời giải

Gỡ một lời giải đã sinh

Sửa hoặc xóa ở phần lời giải trong trang chỉnh sửa bài của trang quản trị Django, hoặc dùng shell:

DANGER

Lệnh dưới đây xóa vĩnh viễn lời giải của bài được chỉ định.

sh
./scripts/manage.py shell
>>> from judge.models import Solution
>>> Solution.objects.filter(problem__code='aplusb').delete()

Kỳ thi

export_contest_submissions

Xuất mã nguồn của mọi thí sinh thi chính thức (không tính thi ảo) ra cây thư mục. Bài nộp cuối cùng của mỗi người cho mỗi bài nằm ở <output>/<username>/<problem>.<ext>; các bài nộp cũ hơn nằm ở <output>/<username>/$History/<problem>_<id>.<ext>.

sh
./scripts/manage.py export_contest_submissions <key> <output>
Tham sốMô tả
keyMã kỳ thi
outputThư mục đầu ra; phải chưa tồn tại
sh
./scripts/manage.py export_contest_submissions lcoj_round1 exports/lcoj_round1

export_contest_submissions_details

Xuất kết quả từng test của mọi bài nộp trong kỳ thi ra một file CSV với các cột username, problem, submission, testcase, points, time, memory, feedback.

sh
./scripts/manage.py export_contest_submissions_details <key> <output>
sh
./scripts/manage.py export_contest_submissions_details lcoj_round1 exports/lcoj_round1_details.csv

export_event_feed

Xuất event feed CLICS dạng XML cho các công cụ như ICPC Resolver.

sh
./scripts/manage.py export_event_feed <key> <output> [--medal lastGold lastSilver lastBronze]
Tham số / tùy chọnMô tảMặc định
keyMã kỳ thi
outputFile đầu ra; phải có đuôi .xml
--medalThứ hạng cuối cùng nhận huy chương vàng, bạc, đồng4 8 12
sh
./scripts/manage.py export_event_feed lcoj_icpc exports/lcoj_icpc.xml --medal 1 3 6

runmoss

Chạy MOSS trên các bài nộp Accepted của kỳ thi (thí sinh chính thức và người theo dõi), theo từng bài và từng ngôn ngữ (C++, C, Java, Python, Pascal), rồi in ra URL kết quả MOSS.

sh
./scripts/manage.py runmoss <contest>

contest kỳ thi. Cần MOSS_API_KEY (trong lcoj-docker, đặt qua biến môi trường MOSS_API_KEY). Người tổ chức kỳ thi cũng có thể chạy MOSS từ trang /moss của kỳ thi.

merge_replay_data

Bổ sung vào replay bảng xếp hạng của kỳ thi A các thí sinh của một kỳ thi B khác, hiển thị dưới dạng "bóng ma" (ghost). Hữu ích khi so sánh một kỳ thi mirror trên luyencode.net với kỳ thi gốc.

sh
./scripts/manage.py merge_replay_data <contest> <b_json>
Tham sốMô tả
contestMã kỳ thi A trên hệ thống này
b_jsonFile JSON dữ liệu replay của kỳ thi B (cùng định dạng được phục vụ tại /contest/<key>/replay/<version>/)

Lệnh dựng lại dữ liệu replay của A từ cơ sở dữ liệu (nên chạy lại nhiều lần cũng không bị nhân đôi bóng ma), ghép bài theo thứ tự, tăng replay_version của kỳ thi, ghi file mới vào MEDIA_ROOT/contest_replay/, và bật nút bật/tắt bóng ma trên trang bảng xếp hạng. Hai kỳ thi phải có cùng số bài; nếu thời lượng khác nhau thì lệnh in cảnh báo. Chỉ những kỳ thi xem lại được (công khai, đã kết thúc, không đóng băng, bảng xếp hạng hiển thị) mới có replay.

Tổ chức

Các lệnh này tính lại lượng credit mà tổ chức đã dùng (thời gian chấm của bài và kỳ thi thuộc tổ chức). Không có tham số và có ghi vào cơ sở dữ liệu.

backfill_current_credit

Tính lại lượng dùng trong tháng hiện tại của mọi tổ chức và đặt lại credit miễn phí về VNOJ_MONTHLY_FREE_CREDIT.

sh
./scripts/manage.py backfill_current_credit

backfill_monthly_credit

Tính lại bản ghi lượng dùng theo tháng của mọi tổ chức, từ tháng 6/2023 tới tháng trọn vẹn gần nhất.

sh
./scripts/manage.py backfill_monthly_credit

Bảo trì trang web

add_blog_navigation

Thêm mục điều hướng cấp cao nhất Blog/blog/ (key blog) vào cuối thanh điều hướng. Không làm gì nếu đã có mục với key blog.

sh
./scripts/manage.py add_blog_navigation

generate_sitemap

Ghi các file sitemap tĩnh: <directory>/sitemap.xml (file chỉ mục) và mỗi trang sitemap một file trong thư mục con. Trang web vốn đã phục vụ /sitemap.xml động, nên lệnh này chỉ cần khi bạn muốn phục vụ file tĩnh.

sh
./scripts/manage.py generate_sitemap <directory> [-s SITE] [-p PROTOCOL] [-d SUBDIR] [-P PREFIX]
Tham số / tùy chọnMô tảMặc định
directoryThư mục đầu ra
-s, --siteID của siteSite hiện tại
-p, --protocolGiao thức dùng trong liên kếthttps
-d, --subdir, --subdirectoryThư mục con chứa các file sitemap riêng lẻsitemaps
-P, --prefixTiền tố URL của các sitemap riêng lẻ; phải kết thúc bằng /<protocol>://<domain>/<subdir>/

Thêm -v 2 để xem tiến trình.

update_permissions

Tạo các quyền còn thiếu và cập nhật tên các quyền đã có, cho mọi app hoặc chỉ các app chỉ định. Chạy sau khi Meta.permissions của model thay đổi (xem Phân quyền).

sh
./scripts/manage.py update_permissions [--apps APP1,APP2] [--create-only | --update-only]
Tùy chọnMô tả
--appsDanh sách app, cách nhau bằng dấu phẩy (mặc định: mọi app)
--create-onlyChỉ tạo quyền còn thiếu
--update-onlyChỉ đổi tên quyền đã có

Dùng -v 2 để in ra từng quyền được đổi tên.

makedmojmessages

Tạo catalog dịch dmoj-user từ các chuỗi trong cơ sở dữ liệu (nhãn thanh điều hướng và tên dạng bài), thay vì từ mã nguồn.

sh
./scripts/manage.py makedmojmessages (-l LOCALE ... | -a) [-x LOCALE] [--no-wrap] [--no-obsolete] [--keep-pot]
Tùy chọnMô tả
-l, --localeLocale cần tạo/cập nhật (dùng được nhiều lần), ví dụ vi
-a, --allCập nhật mọi locale đang có
-x, --excludeLocale cần bỏ qua (dùng được nhiều lần)
--no-wrapKhông ngắt dòng dài
--no-obsoleteXóa các chuỗi lỗi thời
--keep-potGiữ lại file .pot (để debug)

Sau đó biên dịch bằng ./scripts/manage.py compilemessages.

camo

In ra URL qua proxy Camo của một URL ảnh. Báo lỗi Camo not available nếu chưa cấu hình Camo (DMOJ_CAMO_URL, DMOJ_CAMO_KEY). Xem Proxy nội dung SSL.

sh
./scripts/manage.py camo <url>

Mẹo

Chạy lệnh dài ở chế độ nền

Dùng -T (không cấp TTY) để lệnh vẫn chạy khi phiên SSH kết thúc:

sh
COMPOSE_EXEC_FLAGS="-T" nohup ./scripts/manage.py generate_editorials --limit 100 > editorials.out 2>&1 &
tail -f editorials.out

Lên lịch với cron

Đặt trong crontab của máy chủ; dùng đường dẫn tuyệt đối tới dmoj/-T vì cron không có TTY:

cron
# Tính lại credit của tổ chức lúc 00:10 ngày 1 hằng tháng
10 0 1 * * cd /path/to/lcoj-docker/dmoj && COMPOSE_EXEC_FLAGS="-T" ./scripts/manage.py backfill_monthly_credit

Xem hướng dẫn của lệnh

Liệt kê mọi lệnh (có sẵn của Django và riêng của LCOJ):

sh
./scripts/manage.py help

Xem tham số của một lệnh:

sh
./scripts/manage.py help <command>
# ví dụ
./scripts/manage.py help adduser

Tiếp theo