mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-12-29 00:22:03 +00:00
update
This commit is contained in:
parent
5091070759
commit
675557668c
@ -7,7 +7,8 @@ WORKDIR /app
|
||||
|
||||
HEALTHCHECK --interval=5s --retries=3 CMD python2 /app/deploy/health_check.py
|
||||
|
||||
RUN apk add --update --no-cache build-base nginx openssl curl unzip supervisor jpeg-dev zlib-dev postgresql-dev freetype-dev && \
|
||||
RUN apk add --update --no-cache build-base nginx openssl curl unzip supervisor jpeg-dev zlib-dev postgresql-dev freetype-dev git && \
|
||||
git clone
|
||||
pip install --no-cache-dir -r /app/deploy/requirements.txt && \
|
||||
apk del build-base --purge
|
||||
|
||||
|
@ -11,6 +11,7 @@ from django.utils.timezone import now
|
||||
from django.views.decorators.csrf import ensure_csrf_cookie, csrf_exempt
|
||||
from otpauth import OtpAuth
|
||||
|
||||
from group.models import Group
|
||||
from problem.models import Problem
|
||||
from utils.constants import ContestRuleType
|
||||
from options.options import SysOptions
|
||||
@ -375,6 +376,7 @@ class SessionManagementAPI(APIView):
|
||||
|
||||
class UserRankAPI(APIView):
|
||||
def get(self, request):
|
||||
group_id = request.GET.get("group_id")
|
||||
rule_type = request.GET.get("rule")
|
||||
if rule_type not in ContestRuleType.choices():
|
||||
rule_type = ContestRuleType.ACM
|
||||
@ -384,6 +386,8 @@ class UserRankAPI(APIView):
|
||||
profiles = profiles.filter(submission_number__gt=0).order_by("-accepted_number", "submission_number")
|
||||
else:
|
||||
profiles = profiles.filter(total_score__gt=0).order_by("-total_score")
|
||||
if group_id:
|
||||
profiles = profiles.filter(user__in=Group.objects.get(id=group_id).members.all())
|
||||
return self.success(self.paginate_data(request, profiles, RankInfoSerializer))
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
proxy_pass http://backend;
|
||||
proxy_set_header X-Real-IP __IP_HEADER__;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header Host $http_host;
|
||||
client_max_body_size 200M;
|
||||
proxy_http_version 1.1;
|
||||
|
27
group/migrations/0002_auto_20180510_0041.py
Normal file
27
group/migrations/0002_auto_20180510_0041.py
Normal file
@ -0,0 +1,27 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.3 on 2018-05-10 00:41
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('group', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='group',
|
||||
name='allow_join',
|
||||
field=models.BooleanField(default=True),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='group',
|
||||
name='password',
|
||||
field=models.TextField(default=''),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
@ -3,9 +3,11 @@ from account.models import User
|
||||
|
||||
|
||||
class Group(models.Model):
|
||||
name = models.TextField()
|
||||
name = models.TextField(unique=True)
|
||||
description = models.TextField()
|
||||
create_time = models.DateTimeField(auto_now_add=True)
|
||||
password = models.TextField()
|
||||
allow_join = models.BooleanField()
|
||||
created_by = models.ForeignKey(User, related_name="my_groups")
|
||||
members = models.ManyToManyField(User)
|
||||
|
||||
|
@ -6,7 +6,37 @@ from .models import Group
|
||||
|
||||
class GroupSerializer(serializers.ModelSerializer):
|
||||
created_by = UsernameSerializer()
|
||||
members = UsernameSerializer(many=True)
|
||||
|
||||
class Meta:
|
||||
model = Group
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class CreateGroupSerializer(serializers.Serializer):
|
||||
name = serializers.CharField()
|
||||
description = serializers.CharField()
|
||||
password = serializers.CharField(allow_blank=True)
|
||||
allow_join = serializers.BooleanField()
|
||||
|
||||
|
||||
class EditGroupSerializer(CreateGroupSerializer):
|
||||
id = serializers.IntegerField()
|
||||
|
||||
|
||||
class DeleteGroupSerializer(serializers.Serializer):
|
||||
group_id = serializers.IntegerField()
|
||||
user_id = serializers.IntegerField(required=False)
|
||||
|
||||
|
||||
class SimpleGroupSerializer(serializers.ModelSerializer):
|
||||
created_by = UsernameSerializer()
|
||||
|
||||
class Meta:
|
||||
model = Group
|
||||
fields = ["id", "created_by", "name"]
|
||||
|
||||
|
||||
class JoinGroupSerializer(serializers.Serializer):
|
||||
group_name = serializers.CharField()
|
||||
password = serializers.CharField()
|
7
group/urls/oj.py
Normal file
7
group/urls/oj.py
Normal file
@ -0,0 +1,7 @@
|
||||
from django.conf.urls import url
|
||||
from ..views.oj import GroupAPI
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
url(r"^group/?$", GroupAPI.as_view(), name="group_api"),
|
||||
]
|
@ -1,8 +1,11 @@
|
||||
from django.db import IntegrityError
|
||||
|
||||
from account.decorators import admin_role_required, ensure_created_by
|
||||
from account.models import User
|
||||
from utils.api import APIView, validate_serializer
|
||||
|
||||
from ..models import Group
|
||||
from ..serializers import GroupSerializer
|
||||
from ..serializers import GroupSerializer, CreateGroupSerializer, EditGroupSerializer, DeleteGroupSerializer
|
||||
|
||||
|
||||
class GroupAPI(APIView):
|
||||
@ -25,11 +28,43 @@ class GroupAPI(APIView):
|
||||
groups = groups.filter(name__contains=keyword)
|
||||
return self.success(self.paginate_data(request, groups, GroupSerializer))
|
||||
|
||||
@validate_serializer(CreateGroupSerializer)
|
||||
def post(self, request):
|
||||
pass
|
||||
data = request.data
|
||||
data["created_by"] = request.user
|
||||
try:
|
||||
group = Group.objects.create(**data)
|
||||
except IntegrityError:
|
||||
return self.error("小组名不能重复")
|
||||
return self.success(GroupSerializer(group).data)
|
||||
|
||||
@validate_serializer(EditGroupSerializer)
|
||||
def put(self, request):
|
||||
pass
|
||||
data = request.data
|
||||
_id = data.pop("id")
|
||||
try:
|
||||
group = Group.objects.get(id=_id)
|
||||
except Group.DoesNotExist:
|
||||
return self.error("Group does not exist")
|
||||
ensure_created_by(group, request.user)
|
||||
try:
|
||||
Group.objects.filter(id=_id).update(**data)
|
||||
except IntegrityError:
|
||||
return self.error("小组名不能重复")
|
||||
return self.success()
|
||||
|
||||
@validate_serializer(DeleteGroupSerializer)
|
||||
def delete(self, request):
|
||||
pass
|
||||
data = request.data
|
||||
try:
|
||||
group = Group.objects.get(id=data["group_id"])
|
||||
except Group.DoesNotExist:
|
||||
return self.error("Group does not exist")
|
||||
ensure_created_by(group, request.user)
|
||||
if not data.get("user_id"):
|
||||
group.members.clear()
|
||||
group.delete()
|
||||
return self.success()
|
||||
else:
|
||||
group.members.remove(User.objects.get(id=data["user_id"]))
|
||||
return self.success(GroupSerializer(group).data)
|
||||
|
22
group/views/oj.py
Normal file
22
group/views/oj.py
Normal file
@ -0,0 +1,22 @@
|
||||
from group.models import Group
|
||||
from utils.api import APIView, validate_serializer
|
||||
from ..serializers import SimpleGroupSerializer, JoinGroupSerializer
|
||||
|
||||
|
||||
class GroupAPI(APIView):
|
||||
def get(self, request):
|
||||
return self.success(SimpleGroupSerializer(Group.objects.filter(allow_join=True).order_by("-id"), many=True).data)
|
||||
|
||||
@validate_serializer(JoinGroupSerializer)
|
||||
def post(self, request):
|
||||
data = request.data
|
||||
try:
|
||||
group = Group.objects.get(allow_join=True, name=data["group_name"])
|
||||
except Group.DoesNotExist:
|
||||
return self.error("小组不存在")
|
||||
if group.members.filter(username=request.user.username).exists():
|
||||
return self.error("你已经在小组中了")
|
||||
if group.password and group.password != data["password"]:
|
||||
return self.error("密码错误")
|
||||
group.members.add(request.user)
|
||||
return self.success()
|
@ -180,7 +180,7 @@ REST_FRAMEWORK = {
|
||||
)
|
||||
}
|
||||
|
||||
REDIS_URL = "redis://%s:%s" % (REDIS_CONF["host"], REDIS_CONF["port"])
|
||||
REDIS_URL = "redis://:foobar@%s:%s" % (REDIS_CONF["host"], REDIS_CONF["port"])
|
||||
|
||||
|
||||
def redis_config(db):
|
||||
|
@ -14,5 +14,6 @@ urlpatterns = [
|
||||
url(r"^api/", include("submission.urls.oj")),
|
||||
url(r"^api/admin/", include("submission.urls.admin")),
|
||||
url(r"^api/admin/", include("utils.urls")),
|
||||
url(r"^api/admin/", include("group.urls.admin"))
|
||||
url(r"^api/admin/", include("group.urls.admin")),
|
||||
url(r"^api/", include("group.urls.oj"))
|
||||
]
|
||||
|
Loading…
Reference in New Issue
Block a user