Update problem admin

This commit is contained in:
cuom1999 2022-06-20 22:16:58 +07:00
parent 0bc355132e
commit b0cbd4aecc
4 changed files with 98 additions and 67 deletions

View file

@ -5,7 +5,7 @@ from django.contrib import admin
from django.db import transaction from django.db import transaction
from django.db.models import Q, Avg, Count from django.db.models import Q, Avg, Count
from django.db.models.aggregates import StdDev from django.db.models.aggregates import StdDev
from django.forms import ModelForm from django.forms import ModelForm, TextInput
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.translation import gettext, gettext_lazy as _, ungettext from django.utils.translation import gettext, gettext_lazy as _, ungettext
@ -70,6 +70,7 @@ class ProblemForm(ModelForm):
), ),
"types": AdminSelect2MultipleWidget, "types": AdminSelect2MultipleWidget,
"group": AdminSelect2Widget, "group": AdminSelect2Widget,
"memory_limit": TextInput(attrs={'size':'20'}),
} }
if HeavyPreviewAdminPageDownWidget is not None: if HeavyPreviewAdminPageDownWidget is not None:
widgets["description"] = HeavyPreviewAdminPageDownWidget( widgets["description"] = HeavyPreviewAdminPageDownWidget(

View file

@ -0,0 +1,19 @@
# Generated by Django 2.2.25 on 2022-06-20 15:10
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('judge', '0127_auto_20220616_1442'),
]
operations = [
migrations.AlterField(
model_name='problem',
name='memory_limit',
field=models.PositiveIntegerField(help_text='The memory limit for this problem, in kilobytes (e.g. 256mb = 262144 kilobytes).', validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(1048576)], verbose_name='memory limit'),
),
]

View file

@ -215,7 +215,7 @@ class Problem(models.Model):
verbose_name=_("memory limit"), verbose_name=_("memory limit"),
help_text=_( help_text=_(
"The memory limit for this problem, in kilobytes " "The memory limit for this problem, in kilobytes "
"(e.g. 64mb = 65536 kilobytes)." "(e.g. 256mb = 262144 kilobytes)."
), ),
validators=[ validators=[
MinValueValidator(settings.DMOJ_PROBLEM_MIN_MEMORY_LIMIT), MinValueValidator(settings.DMOJ_PROBLEM_MIN_MEMORY_LIMIT),
@ -425,7 +425,7 @@ class Problem(models.Model):
) )
def __str__(self): def __str__(self):
return self.name return "%s (%s)" % (self.name, self.code)
def get_absolute_url(self): def get_absolute_url(self):
return reverse("problem_detail", args=(self.code,)) return reverse("problem_detail", args=(self.code,))

View file

@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lqdoj2\n" "Project-Id-Version: lqdoj2\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-18 14:29+0700\n" "POT-Creation-Date: 2022-06-20 22:11+0700\n"
"PO-Revision-Date: 2021-07-20 03:44\n" "PO-Revision-Date: 2021-07-20 03:44\n"
"Last-Translator: Icyene\n" "Last-Translator: Icyene\n"
"Language-Team: Vietnamese\n" "Language-Team: Vietnamese\n"
@ -520,7 +520,7 @@ msgstr "Đăng ký để nhận thông báo về các kỳ thi"
msgid "Enable experimental features" msgid "Enable experimental features"
msgstr "Sử dụng các tính năng thử nghiệm" msgstr "Sử dụng các tính năng thử nghiệm"
#: judge/forms.py:86 judge/views/organization.py:454 judge/views/register.py:68 #: judge/forms.py:86 judge/views/organization.py:458 judge/views/register.py:68
#, python-brace-format #, python-brace-format
msgid "You may not be part of more than {count} public groups." msgid "You may not be part of more than {count} public groups."
msgstr "Bạn không thể tham gia nhiều hơn {count} nhóm công khai." msgstr "Bạn không thể tham gia nhiều hơn {count} nhóm công khai."
@ -1394,7 +1394,9 @@ msgstr ""
#: judge/models/problem.py:170 #: judge/models/problem.py:170
msgid "These users will be able to edit the problem, and be listed as authors." msgid "These users will be able to edit the problem, and be listed as authors."
msgstr "Những người dùng này sẽ có thể chỉnh sửa bài tập, và nằm trong danh sách các tác giả" msgstr ""
"Những người dùng này sẽ có thể chỉnh sửa bài tập, và nằm trong danh sách các "
"tác giả"
#: judge/models/problem.py:175 #: judge/models/problem.py:175
msgid "curators" msgid "curators"
@ -1403,7 +1405,9 @@ msgstr ""
#: judge/models/problem.py:179 #: judge/models/problem.py:179
msgid "" msgid ""
"These users will be able to edit the problem, but not be listed as authors." "These users will be able to edit the problem, but not be listed as authors."
msgstr "Những người dùng này sẽ có thể chỉnh sửa bài tập, nhưng không nằm trong danh sách các tác giả" msgstr ""
"Những người dùng này sẽ có thể chỉnh sửa bài tập, nhưng không nằm trong danh "
"sách các tác giả"
#: judge/models/problem.py:185 #: judge/models/problem.py:185
msgid "testers" msgid "testers"
@ -1411,7 +1415,9 @@ msgstr ""
#: judge/models/problem.py:189 #: judge/models/problem.py:189
msgid "These users will be able to view the private problem, but not edit it." msgid "These users will be able to view the private problem, but not edit it."
msgstr "Những người dùng này sẽ thấy được bài tập này (dù riêng tư), nhưng không chỉnh sửa được" msgstr ""
"Những người dùng này sẽ thấy được bài tập này (dù riêng tư), nhưng không "
"chỉnh sửa được"
#: judge/models/problem.py:195 judge/models/volunteer.py:29 #: judge/models/problem.py:195 judge/models/volunteer.py:29
msgid "The type of problem, as shown on the problem's page." msgid "The type of problem, as shown on the problem's page."
@ -1425,23 +1431,30 @@ msgstr "Nhóm bài, hiện ở mục Nhóm bài trong danh sách bài tập"
msgid "" msgid ""
"The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) " "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) "
"are supported." "are supported."
msgstr "Giới hạn thời gian cho bài tập này, theo đơn vị giây. Có thể nhập số thực (ví dụ 1.5)" msgstr ""
"Giới hạn thời gian cho bài tập này, theo đơn vị giây. Có thể nhập số thực "
"(ví dụ 1.5)"
#: judge/models/problem.py:215 judge/models/problem.py:629 #: judge/models/problem.py:215 judge/models/problem.py:629
msgid "memory limit" msgid "memory limit"
msgstr "Giới hạn bộ nhớ" msgstr "Giới hạn bộ nhớ"
#: judge/models/problem.py:217 #: judge/models/problem.py:217
#, fuzzy
msgid "" msgid ""
"The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 " "The memory limit for this problem, in kilobytes (e.g. 256mb = 262144 "
"kilobytes)." "kilobytes)."
msgstr "Giới hạn bộ nhớ cho bài này, theo đơn vị kilobytes (ví dụ 64mb = 65536 kilobytes)" msgstr ""
"Giới hạn bộ nhớ cho bài này, theo đơn vị kilobytes (ví dụ 256mb = 262144 "
"kilobytes)"
#: judge/models/problem.py:229 #: judge/models/problem.py:229
msgid "" msgid ""
"Points awarded for problem completion. Points are displayed with a 'p' " "Points awarded for problem completion. Points are displayed with a 'p' "
"suffix if partial." "suffix if partial."
msgstr "Điểm thưởng khi hoàn thành bài tập. Điểm có thêm chữ 'p' ở sau cùng nếu như chấp nhận cho điểm thành phần (có điểm ngay khi không đúng toàn bộ test)" msgstr ""
"Điểm thưởng khi hoàn thành bài tập. Điểm có thêm chữ 'p' ở sau cùng nếu như "
"chấp nhận cho điểm thành phần (có điểm ngay khi không đúng toàn bộ test)"
#: judge/models/problem.py:235 #: judge/models/problem.py:235
msgid "allows partial points" msgid "allows partial points"
@ -2501,8 +2514,8 @@ msgstr "Bạn phải giải ít nhất 1 bài trước khi được vote."
msgid "You already voted." msgid "You already voted."
msgstr "Bạn đã vote." msgstr "Bạn đã vote."
#: judge/views/comment.py:153 judge/views/organization.py:754 #: judge/views/comment.py:153 judge/views/organization.py:758
#: judge/views/organization.py:846 #: judge/views/organization.py:850
msgid "Edited from site" msgid "Edited from site"
msgstr "Chỉnh sửa từ web" msgstr "Chỉnh sửa từ web"
@ -2716,53 +2729,53 @@ msgstr "Bạn không được phép chỉnh sửa tổ chức này."
msgid "Groups" msgid "Groups"
msgstr "Nhóm" msgstr "Nhóm"
#: judge/views/organization.py:307 #: judge/views/organization.py:311
#, python-format #, python-format
msgid "%s Members" msgid "%s Members"
msgstr "%s Thành viên" msgstr "%s Thành viên"
#: judge/views/organization.py:410 #: judge/views/organization.py:414
#, python-brace-format #, python-brace-format
msgid "All submissions in <a href=\"{1}\">{0}</a>" msgid "All submissions in <a href=\"{1}\">{0}</a>"
msgstr "Bài nộp trong <a href=\"{1}\">{0}</a>" msgstr "Bài nộp trong <a href=\"{1}\">{0}</a>"
#: judge/views/organization.py:440 judge/views/organization.py:446 #: judge/views/organization.py:444 judge/views/organization.py:450
#: judge/views/organization.py:453 #: judge/views/organization.py:457
msgid "Joining group" msgid "Joining group"
msgstr "Tham gia nhóm" msgstr "Tham gia nhóm"
#: judge/views/organization.py:441 #: judge/views/organization.py:445
msgid "You are already in the group." msgid "You are already in the group."
msgstr "Bạn đã ở trong nhóm." msgstr "Bạn đã ở trong nhóm."
#: judge/views/organization.py:446 #: judge/views/organization.py:450
msgid "This group is not open." msgid "This group is not open."
msgstr "Nhóm này là nhóm kín." msgstr "Nhóm này là nhóm kín."
#: judge/views/organization.py:469 #: judge/views/organization.py:473
msgid "Leaving group" msgid "Leaving group"
msgstr "Rời nhóm" msgstr "Rời nhóm"
#: judge/views/organization.py:470 #: judge/views/organization.py:474
#, python-format #, python-format
msgid "You are not in \"%s\"." msgid "You are not in \"%s\"."
msgstr "Bạn không ở trong \"%s\"." msgstr "Bạn không ở trong \"%s\"."
#: judge/views/organization.py:495 #: judge/views/organization.py:499
#, python-format #, python-format
msgid "Request to join %s" msgid "Request to join %s"
msgstr "Đăng ký tham gia %s" msgstr "Đăng ký tham gia %s"
#: judge/views/organization.py:526 #: judge/views/organization.py:530
msgid "Join request detail" msgid "Join request detail"
msgstr "Chi tiết đơn đăng ký" msgstr "Chi tiết đơn đăng ký"
#: judge/views/organization.py:574 #: judge/views/organization.py:578
#, python-format #, python-format
msgid "Managing join requests for %s" msgid "Managing join requests for %s"
msgstr "Quản lý đơn đăng ký cho %s" msgstr "Quản lý đơn đăng ký cho %s"
#: judge/views/organization.py:614 #: judge/views/organization.py:618
#, python-format #, python-format
msgid "" msgid ""
"Your organization can only receive %d more members. You cannot approve %d " "Your organization can only receive %d more members. You cannot approve %d "
@ -2771,71 +2784,71 @@ msgstr ""
"Tổ chức chỉ có thể chứa %d thành viên. Bạn không thể chấp thuận nhiều hơn %d " "Tổ chức chỉ có thể chứa %d thành viên. Bạn không thể chấp thuận nhiều hơn %d "
"người." "người."
#: judge/views/organization.py:632 #: judge/views/organization.py:636
#, python-format #, python-format
msgid "Approved %d user." msgid "Approved %d user."
msgid_plural "Approved %d users." msgid_plural "Approved %d users."
msgstr[0] "Đã chấp thuận %d người." msgstr[0] "Đã chấp thuận %d người."
#: judge/views/organization.py:635 #: judge/views/organization.py:639
#, python-format #, python-format
msgid "Rejected %d user." msgid "Rejected %d user."
msgid_plural "Rejected %d users." msgid_plural "Rejected %d users."
msgstr[0] "Đã từ chối %d người." msgstr[0] "Đã từ chối %d người."
#: judge/views/organization.py:675 #: judge/views/organization.py:679
#, python-format #, python-format
msgid "Add member for %s" msgid "Add member for %s"
msgstr "Thêm thành viên cho %s" msgstr "Thêm thành viên cho %s"
#: judge/views/organization.py:687 #: judge/views/organization.py:691
#, fuzzy #, fuzzy
#| msgid "Edited from site" #| msgid "Edited from site"
msgid "Added members from site" msgid "Added members from site"
msgstr "Chỉnh sửa từ web" msgstr "Chỉnh sửa từ web"
#: judge/views/organization.py:707 judge/views/organization.py:715 #: judge/views/organization.py:711 judge/views/organization.py:719
msgid "Can't kick user" msgid "Can't kick user"
msgstr "Không thể đuổi" msgstr "Không thể đuổi"
#: judge/views/organization.py:708 #: judge/views/organization.py:712
msgid "The user you are trying to kick does not exist!" msgid "The user you are trying to kick does not exist!"
msgstr "" msgstr ""
#: judge/views/organization.py:716 #: judge/views/organization.py:720
#, python-format #, python-format
msgid "The user you are trying to kick is not in organization: %s." msgid "The user you are trying to kick is not in organization: %s."
msgstr "" msgstr ""
#: judge/views/organization.py:737 #: judge/views/organization.py:741
#, fuzzy, python-format #, fuzzy, python-format
#| msgid "Editing %s" #| msgid "Editing %s"
msgid "Edit %s" msgid "Edit %s"
msgstr "Đang chỉnh sửa %s" msgstr "Đang chỉnh sửa %s"
#: judge/views/organization.py:776 #: judge/views/organization.py:780
#, python-format #, python-format
msgid "Add blog for %s" msgid "Add blog for %s"
msgstr "Thêm bài đăng cho %s" msgstr "Thêm bài đăng cho %s"
#: judge/views/organization.py:787 #: judge/views/organization.py:791
msgid "Added from site" msgid "Added from site"
msgstr "Thêm từ web" msgstr "Thêm từ web"
#: judge/views/organization.py:821 #: judge/views/organization.py:825
msgid "Permission denied" msgid "Permission denied"
msgstr "Truy cập bị từ chối" msgstr "Truy cập bị từ chối"
#: judge/views/organization.py:822 #: judge/views/organization.py:826
msgid "Not allowed to edit this blog" msgid "Not allowed to edit this blog"
msgstr "Bạn không được phép chỉnh sửa bài đăng này." msgstr "Bạn không được phép chỉnh sửa bài đăng này."
#: judge/views/organization.py:841 #: judge/views/organization.py:845
#, python-format #, python-format
msgid "Edit blog %s" msgid "Edit blog %s"
msgstr "Chỉnh sửa %s" msgstr "Chỉnh sửa %s"
#: judge/views/organization.py:871 #: judge/views/organization.py:875
#, python-format #, python-format
msgid "Pending blogs in %s" msgid "Pending blogs in %s"
msgstr "Bài đang đợi duyệt trong %s" msgstr "Bài đang đợi duyệt trong %s"
@ -3035,49 +3048,49 @@ msgstr "Kết quả chấm"
msgid "Version matrix" msgid "Version matrix"
msgstr "Ma trận phiên bản" msgstr "Ma trận phiên bản"
#: judge/views/submission.py:116 judge/views/submission.py:124 #: judge/views/submission.py:118 judge/views/submission.py:126
#, python-format #, python-format
msgid "Submission of %(problem)s by %(user)s" msgid "Submission of %(problem)s by %(user)s"
msgstr "Bài nộp của %(user)s cho bài %(problem)s" msgstr "Bài nộp của %(user)s cho bài %(problem)s"
#: judge/views/submission.py:289 judge/views/submission.py:290 #: judge/views/submission.py:291 judge/views/submission.py:292
#: templates/problem/problem.html:194 #: templates/problem/problem.html:194
msgid "All submissions" msgid "All submissions"
msgstr "Tất cả bài nộp" msgstr "Tất cả bài nộp"
#: judge/views/submission.py:482 #: judge/views/submission.py:484
msgid "All my submissions" msgid "All my submissions"
msgstr "Tất cả bài nộp của tôi" msgstr "Tất cả bài nộp của tôi"
#: judge/views/submission.py:483 #: judge/views/submission.py:485
#, python-format #, python-format
msgid "All submissions by %s" msgid "All submissions by %s"
msgstr "Tất cả bài nộp của %s" msgstr "Tất cả bài nộp của %s"
#: judge/views/submission.py:528 #: judge/views/submission.py:530
#, python-format #, python-format
msgid "All submissions for %s" msgid "All submissions for %s"
msgstr "Tất cả bài nộp cho %s" msgstr "Tất cả bài nộp cho %s"
#: judge/views/submission.py:556 #: judge/views/submission.py:558
msgid "Must pass a problem" msgid "Must pass a problem"
msgstr "Phải làm được một bài" msgstr "Phải làm được một bài"
#: judge/views/submission.py:614 #: judge/views/submission.py:616
#, python-format #, python-format
msgid "My submissions for %(problem)s" msgid "My submissions for %(problem)s"
msgstr "Bài nộp của tôi cho %(problem)s" msgstr "Bài nộp của tôi cho %(problem)s"
#: judge/views/submission.py:615 #: judge/views/submission.py:617
#, python-format #, python-format
msgid "%(user)s's submissions for %(problem)s" msgid "%(user)s's submissions for %(problem)s"
msgstr "Các bài nộp của %(user)s cho %(problem)s" msgstr "Các bài nộp của %(user)s cho %(problem)s"
#: judge/views/submission.py:745 #: judge/views/submission.py:747
msgid "Must pass a contest" msgid "Must pass a contest"
msgstr "Phải qua một kỳ thi" msgstr "Phải qua một kỳ thi"
#: judge/views/submission.py:775 #: judge/views/submission.py:777
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"<a href=\"{1}\">{0}</a>'s submissions for <a href=\"{3}\">{2}</a> in <a href=" "<a href=\"{1}\">{0}</a>'s submissions for <a href=\"{3}\">{2}</a> in <a href="
@ -3086,7 +3099,7 @@ msgstr ""
"Các bài nộp của <a href=\"{1}\">{0}</a> cho <a href=\"{3}\">{2}</a> trong <a " "Các bài nộp của <a href=\"{1}\">{0}</a> cho <a href=\"{3}\">{2}</a> trong <a "
"href=\"{5}\">{4}</a>" "href=\"{5}\">{4}</a>"
#: judge/views/submission.py:787 #: judge/views/submission.py:789
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"<a href=\"{1}\">{0}</a>'s submissions for problem {2} in <a href=\"{4}\">{3}" "<a href=\"{1}\">{0}</a>'s submissions for problem {2} in <a href=\"{4}\">{3}"
@ -3095,7 +3108,7 @@ msgstr ""
"Các bài nộp của <a href=\"{1}\">{0}</a> cho bài {2} trong <a href=\"{4}\">{3}" "Các bài nộp của <a href=\"{1}\">{0}</a> cho bài {2} trong <a href=\"{4}\">{3}"
"</a>" "</a>"
#: judge/views/submission.py:833 #: judge/views/submission.py:835
#, fuzzy #, fuzzy
#| msgid "You do not have the permission to rejudge submissions." #| msgid "You do not have the permission to rejudge submissions."
msgid "You don't have permission to access." msgid "You don't have permission to access."
@ -3412,7 +3425,7 @@ msgstr "Xin chào, <b>%(username)s</b>."
#: templates/base.html:259 templates/chat/chat.html:20 #: templates/base.html:259 templates/chat/chat.html:20
#: templates/comments/list.html:89 templates/contest/contest-list-tabs.html:24 #: templates/comments/list.html:89 templates/contest/contest-list-tabs.html:24
#: templates/contest/list.html:130 templates/contest/ranking-table.html:53 #: templates/contest/list.html:130 templates/contest/ranking-table.html:49
#: templates/internal/base.html:59 #: templates/internal/base.html:59
#: templates/organization/org-left-sidebar.html:10 #: templates/organization/org-left-sidebar.html:10
#: templates/problem/left-sidebar.html:5 templates/problem/list-base.html:249 #: templates/problem/left-sidebar.html:5 templates/problem/list-base.html:249
@ -3865,7 +3878,7 @@ msgstr "Số lượng"
msgid "Editorial" msgid "Editorial"
msgstr "Hướng dẫn" msgstr "Hướng dẫn"
#: templates/contest/list.html:90 templates/contest/media-js.html:147 #: templates/contest/list.html:90 templates/contest/media-js.html:150
msgid "Are you sure you want to join?" msgid "Are you sure you want to join?"
msgstr "Bạn có chắc tham gia?" msgstr "Bạn có chắc tham gia?"
@ -3954,11 +3967,11 @@ msgstr "Không có kỳ thi nào được lên lịch hiện tại."
msgid "Past Contests" msgid "Past Contests"
msgstr "Kỳ thi trong quá khứ" msgstr "Kỳ thi trong quá khứ"
#: templates/contest/media-js.html:142 #: templates/contest/media-js.html:145
msgid "Are you sure you want to leave?" msgid "Are you sure you want to leave?"
msgstr "Bạn có chắc muốn rời?" msgstr "Bạn có chắc muốn rời?"
#: templates/contest/media-js.html:143 #: templates/contest/media-js.html:146
msgid "" msgid ""
"You cannot come back to a virtual participation. You will have to start a " "You cannot come back to a virtual participation. You will have to start a "
"new one." "new one."
@ -3966,7 +3979,7 @@ msgstr ""
"Bạn không thể quay lại lần tham gia ảo này. Bạn sẽ phải tham gia ảo lại từ " "Bạn không thể quay lại lần tham gia ảo này. Bạn sẽ phải tham gia ảo lại từ "
"đầu." "đầu."
#: templates/contest/media-js.html:148 #: templates/contest/media-js.html:151
msgid "" msgid ""
"Joining a contest starts your timer, after which it becomes unstoppable." "Joining a contest starts your timer, after which it becomes unstoppable."
msgstr "Tham gia kỳ thi sẽ khởi động đồng hồ đếm ngược, và không thể dừng lại." msgstr "Tham gia kỳ thi sẽ khởi động đồng hồ đếm ngược, và không thể dừng lại."
@ -4003,19 +4016,11 @@ msgstr "Thêm vào đó, chỉ những tổ chức này mới được tham gia
msgid "Only the following organizations may access this contest:" msgid "Only the following organizations may access this contest:"
msgstr "Chỉ những tổ chức sau được tham gia kỳ thi:" msgstr "Chỉ những tổ chức sau được tham gia kỳ thi:"
#: templates/contest/ranking-table.html:9 #: templates/contest/ranking-table.html:40
msgid "Organization"
msgstr "Tổ chức"
#: templates/contest/ranking-table.html:10
msgid "Full Name"
msgstr "Họ tên"
#: templates/contest/ranking-table.html:44
msgid "Un-Disqualify" msgid "Un-Disqualify"
msgstr "Khôi phục kết quả" msgstr "Khôi phục kết quả"
#: templates/contest/ranking-table.html:47 #: templates/contest/ranking-table.html:43
msgid "Disqualify" msgid "Disqualify"
msgstr "Hủy kết quả" msgstr "Hủy kết quả"
@ -5637,6 +5642,12 @@ msgstr "Thông tin"
msgid "Check all" msgid "Check all"
msgstr "Chọn tất cả" msgstr "Chọn tất cả"
#~ msgid "Organization"
#~ msgstr "Tổ chức"
#~ msgid "Full Name"
#~ msgstr "Họ tên"
#~ msgid "Show my groups only" #~ msgid "Show my groups only"
#~ msgstr "Chỉ hiển thị nhóm đang tham gia" #~ msgstr "Chỉ hiển thị nhóm đang tham gia"