From edc3507ed5428c24679ecc00369baa25b0c58c97 Mon Sep 17 00:00:00 2001 From: 31Tir Date: Fri, 12 Jun 2020 17:10:55 +0430 Subject: [PATCH 1/6] some api for chanllenges --- .gitignore | 138 +++++++++++ ai/account/__init__.py | 0 ai/account/admin.py | 5 + ai/account/api/__init__.py | 0 ai/account/api/serializers.py | 45 ++++ ai/account/api/urls.py | 18 ++ ai/account/api/views.py | 54 +++++ ai/account/apps.py | 5 + ai/account/migrations/0001_initial.py | 53 +++++ .../migrations/0002_auto_20200611_0834.py | 32 +++ ai/account/migrations/__init__.py | 0 ai/account/models.py | 22 ++ ai/account/tests.py | 3 + ai/account/views.py | 3 + ai/ai/__init__.py | 2 + ai/ai/asgi.py | 16 ++ ai/ai/celery.py | 18 ++ ai/ai/settings.py | 163 +++++++++++++ ai/ai/urls.py | 12 + ai/ai/wsgi.py | 16 ++ ai/challenge/__init__.py | 0 ai/challenge/admin.py | 9 + ai/challenge/api/serializer.py | 223 ++++++++++++++++++ ai/challenge/api/urls.py | 33 +++ ai/challenge/api/views.py | 185 +++++++++++++++ ai/challenge/apps.py | 5 + ai/challenge/compiler.py | 143 +++++++++++ ai/challenge/migrations/0001_initial.py | 94 ++++++++ ai/challenge/migrations/__init__.py | 0 ai/challenge/models.py | 103 ++++++++ ai/challenge/tasks.py | 17 ++ ai/challenge/tests.py | 3 + ai/challenge/views.py | 3 + ai/manage.py | 21 ++ ai/media/1/client | 1 + ai/media/1/client.zip | Bin 0 -> 199 bytes ai/media/1/run.sh | 1 + ai/media/p.zip/client.zip | Bin 0 -> 199 bytes requirements.txt | 16 ++ 39 files changed, 1462 insertions(+) create mode 100644 .gitignore create mode 100644 ai/account/__init__.py create mode 100644 ai/account/admin.py create mode 100644 ai/account/api/__init__.py create mode 100644 ai/account/api/serializers.py create mode 100644 ai/account/api/urls.py create mode 100644 ai/account/api/views.py create mode 100644 ai/account/apps.py create mode 100644 ai/account/migrations/0001_initial.py create mode 100644 ai/account/migrations/0002_auto_20200611_0834.py create mode 100644 ai/account/migrations/__init__.py create mode 100644 ai/account/models.py create mode 100644 ai/account/tests.py create mode 100644 ai/account/views.py create mode 100644 ai/ai/__init__.py create mode 100644 ai/ai/asgi.py create mode 100644 ai/ai/celery.py create mode 100644 ai/ai/settings.py create mode 100644 ai/ai/urls.py create mode 100644 ai/ai/wsgi.py create mode 100644 ai/challenge/__init__.py create mode 100644 ai/challenge/admin.py create mode 100644 ai/challenge/api/serializer.py create mode 100644 ai/challenge/api/urls.py create mode 100644 ai/challenge/api/views.py create mode 100644 ai/challenge/apps.py create mode 100644 ai/challenge/compiler.py create mode 100644 ai/challenge/migrations/0001_initial.py create mode 100644 ai/challenge/migrations/__init__.py create mode 100644 ai/challenge/models.py create mode 100644 ai/challenge/tasks.py create mode 100644 ai/challenge/tests.py create mode 100644 ai/challenge/views.py create mode 100755 ai/manage.py create mode 100644 ai/media/1/client create mode 100644 ai/media/1/client.zip create mode 100755 ai/media/1/run.sh create mode 100644 ai/media/p.zip/client.zip create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62af979 --- /dev/null +++ b/.gitignore @@ -0,0 +1,138 @@ +.vscode + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class +# C extensions +*.so +*.pyc +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ \ No newline at end of file diff --git a/ai/account/__init__.py b/ai/account/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ai/account/admin.py b/ai/account/admin.py new file mode 100644 index 0000000..ffba9b8 --- /dev/null +++ b/ai/account/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from .models import User, PostMessage + +admin.site.register(User) +admin.site.register(PostMessage) diff --git a/ai/account/api/__init__.py b/ai/account/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ai/account/api/serializers.py b/ai/account/api/serializers.py new file mode 100644 index 0000000..6297978 --- /dev/null +++ b/ai/account/api/serializers.py @@ -0,0 +1,45 @@ +from rest_framework import serializers +from account.models import User +from challenge.models import PostMessage + + +class RegisterationSerializer(serializers.ModelSerializer): + password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True) + + class Meta: + model = User + fields = ['username', 'email', 'password', 'password2', 'english_firstname', 'english_lastname', 'birthday',] + + extra_kwargs = { + 'password': {'write_only' :True}, + } + + def save(self): + user = User( + email = self.validated_data['email'], + username = self.validated_data['username'], + birthday = self.validated_data['birthday'], + english_firstname = self.validated_data['english_firstname'], + english_lastname = self.validated_data['english_lastname'] + + ) + user.is_active = True + password = self.validated_data['password'] + password2 = self.validated_data['password2'] + + if password != password2: + raise serializers.ValidationError({'password': 'پسورد ها باید مشابه باشند !'}) + user.set_password(password) + user.save() + return user + + + +class UserSerializer(serializers.HyperlinkedModelSerializer): + + class Meta: + model = User + fields = ('id', 'username', 'email', 'english_lastname', 'is_active','teams' , 'message_box') + + + diff --git a/ai/account/api/urls.py b/ai/account/api/urls.py new file mode 100644 index 0000000..96ba256 --- /dev/null +++ b/ai/account/api/urls.py @@ -0,0 +1,18 @@ +from django.urls import path, include +from rest_framework import routers + +from account.api import views + + + + +# router = routers.DefaultRouter() +# router.register('users', views.UserView, basename="user") + + + +urlpatterns = [ + path('register/', views.registration_view, name='register_api'), + path('flag_user/', views.flag_uses, name='flag_user'), + # path('', include(router.urls)) +] \ No newline at end of file diff --git a/ai/account/api/views.py b/ai/account/api/views.py new file mode 100644 index 0000000..5209899 --- /dev/null +++ b/ai/account/api/views.py @@ -0,0 +1,54 @@ +from rest_framework import status, viewsets +from rest_framework.response import Response +from rest_framework.decorators import api_view, permission_classes +from django.shortcuts import get_object_or_404 +from account.models import User +from account.api.serializers import ( + RegisterationSerializer, + UserSerializer, +) + +from rest_framework.permissions import IsAuthenticated + + + + +class UserView(viewsets.ReadOnlyModelViewSet): + # permission_classes = [IsAuthenticated] + queryset = User.objects.all() + serializer_class = UserSerializer + + + + + +@api_view(['POST',]) +def registration_view(request,): + if request.method == 'POST': + serializer = RegisterationSerializer(data=request.data) + data = {} + if serializer.is_valid(): + user = serializer.save() + data['response']= 'ثبت نام با موفقیت انجام شد' + data['email'] = user.email + data['username'] = user.username + data['id'] = user.id + else: + data = serializer.errors + return Response(data) + + + + +@api_view(['GET',]) +@permission_classes([IsAuthenticated]) +def flag_uses(request,user): + data={} + try: + person = get_object_or_404(User, username=user) + data["response"] = "ok" + data["user"] = person.username + return Response(data) + except User.DoesNotExist: + data["response"] = "not found" + return Response(data, status=status.HTTP_404_NOT_FOUND) \ No newline at end of file diff --git a/ai/account/apps.py b/ai/account/apps.py new file mode 100644 index 0000000..3f3cc5d --- /dev/null +++ b/ai/account/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AccountConfig(AppConfig): + name = 'account' diff --git a/ai/account/migrations/0001_initial.py b/ai/account/migrations/0001_initial.py new file mode 100644 index 0000000..a5b5b5e --- /dev/null +++ b/ai/account/migrations/0001_initial.py @@ -0,0 +1,53 @@ +# Generated by Django 3.0.7 on 2020-06-11 08:34 + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0011_update_proxy_permissions'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('english_firstname', models.CharField(max_length=50)), + ('english_lastname', models.CharField(max_length=50)), + ('photo_main', models.ImageField(blank=True, upload_to='photo/profile/%Y/%m/%d')), + ('birthday', models.DateTimeField()), + ('individual_score', models.IntegerField(blank=True, default=0)), + ('phone_number', models.IntegerField(blank=True, default=0)), + ('national_id', models.IntegerField(blank=True, default=0)), + ('gender', models.CharField(blank=True, choices=[('Man', 'M'), ('Woman', 'W')], max_length=5)), + ('abilites', models.TextField(blank=True)), + ('bio', models.TextField(blank=True)), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/ai/account/migrations/0002_auto_20200611_0834.py b/ai/account/migrations/0002_auto_20200611_0834.py new file mode 100644 index 0000000..90185d6 --- /dev/null +++ b/ai/account/migrations/0002_auto_20200611_0834.py @@ -0,0 +1,32 @@ +# Generated by Django 3.0.7 on 2020-06-11 08:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('challenge', '0001_initial'), + ('account', '0001_initial'), + ('auth', '0011_update_proxy_permissions'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='message_box', + field=models.ManyToManyField(blank=True, related_name='message_box', to='challenge.PostMessage'), + ), + migrations.AddField( + model_name='user', + name='teams', + field=models.ManyToManyField(blank=True, related_name='teams', to='challenge.Team'), + ), + migrations.AddField( + model_name='user', + name='user_permissions', + field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), + ), + ] diff --git a/ai/account/migrations/__init__.py b/ai/account/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ai/account/models.py b/ai/account/models.py new file mode 100644 index 0000000..dbb0035 --- /dev/null +++ b/ai/account/models.py @@ -0,0 +1,22 @@ +from django.db import models +from challenge.models import Team, PostMessage +from django.contrib.auth.models import AbstractUser + + +class User(AbstractUser): + english_firstname = models.CharField(max_length=50) + english_lastname = models.CharField(max_length=50) + photo_main = models.ImageField(upload_to='photo/profile/%Y/%m/%d', blank=True) + birthday = models.DateTimeField(auto_now=False) + individual_score = models.IntegerField(default=0, blank=True) + phone_number = models.IntegerField(default=0, blank=True) + national_id = models.IntegerField(default=0, blank=True) + Gender = {('Man','M'), ('Woman','W')} + gender = models.CharField(choices=Gender, max_length=5, blank=True) + abilites = models.TextField(blank=True) + bio = models.TextField(blank=True) + message_box = models.ManyToManyField(PostMessage, blank=True, related_name='message_box') + teams = models.ManyToManyField(Team, blank=True, related_name='teams') + + + diff --git a/ai/account/tests.py b/ai/account/tests.py new file mode 100644 index 0000000..de8bdc0 --- /dev/null +++ b/ai/account/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/ai/account/views.py b/ai/account/views.py new file mode 100644 index 0000000..c60c790 --- /dev/null +++ b/ai/account/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/ai/ai/__init__.py b/ai/ai/__init__.py new file mode 100644 index 0000000..ba87500 --- /dev/null +++ b/ai/ai/__init__.py @@ -0,0 +1,2 @@ +from __future__ import absolute_import +from .celery import app as celery_app \ No newline at end of file diff --git a/ai/ai/asgi.py b/ai/ai/asgi.py new file mode 100644 index 0000000..abc3a8d --- /dev/null +++ b/ai/ai/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for ai project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ai.settings') + +application = get_asgi_application() diff --git a/ai/ai/celery.py b/ai/ai/celery.py new file mode 100644 index 0000000..1a4f2bc --- /dev/null +++ b/ai/ai/celery.py @@ -0,0 +1,18 @@ +from __future__ import absolute_import +import os +from celery import Celery +from django.conf import settings + +# set the default Django settings module for the 'celery' program. +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ai.settings') +app = Celery('ai') + +# Using a string here means the worker will not have to +# pickle the object when using Windows. +app.config_from_object('django.conf:settings') +app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) + + +@app.task(bind=True) +def debug_task(self): + print('Request: {0!r}'.format(self.request)) \ No newline at end of file diff --git a/ai/ai/settings.py b/ai/ai/settings.py new file mode 100644 index 0000000..d4a76d6 --- /dev/null +++ b/ai/ai/settings.py @@ -0,0 +1,163 @@ + +import os +from datetime import timedelta + + +AUTH_USER_MODEL = 'account.User' + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'o%v)g8xyn@=x)56w39411a6haxp+^&s##!04!5b0d=7^3=mt31' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'account', + 'challenge', + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'rest_framework', + 'rest_framework.authtoken', +] + +REST_FRAMEWORK = { + 'DEFAULT_AUTHENTICATION_CLASSES': [ + 'rest_framework_simplejwt.authentication.JWTAuthentication', + ], +} + + + +SIMPLE_JWT = { + 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30), + # 'REFRESH_TOKEN_LIFETIME': timedelta(days=14), + # 'ROTATE_REFRESH_TOKENS': True, + # 'BLACKLIST_AFTER_ROTATION': False, + # 'ALGORITHM': 'HS256', + # 'SIGNING_KEY': SECRET_KEY, + # 'VERIFYING_KEY': None, + # 'AUTH_HEADER_TYPES': ('JWT',), + # 'USER_ID_FIELD': 'id', + # 'USER_ID_CLAIM': 'user_id', + # 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), + # 'TOKEN_TYPE_CLAIM': 'token_type', +} + + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'ai.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + os.path.join(BASE_DIR, 'Front-end/build') + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'ai.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/3.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.0/howto/static-files/ + +STATIC_URL = '/static/' + + +# Media +MEDIA_ROOT = os.path.join(BASE_DIR,'media') +MEDIA_URL = '/media/' +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, 'Front-end/build/static'), +] + + + +# CELERY STUFF +BROKER_URL = 'redis://localhost:6379' +CELERY_RESULT_BACKEND = 'redis://localhost:6379' +CELERY_ACCEPT_CONTENT = ['application/json'] +CELERY_TASK_SERIALIZER = 'json' +CELERY_RESULT_SERIALIZER = 'json' +CELERY_TIMEZONE = 'Africa/Nairobi' + + diff --git a/ai/ai/urls.py b/ai/ai/urls.py new file mode 100644 index 0000000..ff4045a --- /dev/null +++ b/ai/ai/urls.py @@ -0,0 +1,12 @@ +from django.contrib import admin +from django.urls import path,include +from django.conf import settings +from django.conf.urls.static import static +from django.views.generic import TemplateView + +urlpatterns = [ + path('', TemplateView.as_view(template_name='index.html')), + path('',include('challenge.api.urls'),name='challenge'), + path('admin/', admin.site.urls), + path('account/', include('account.api.urls'), name='account_api') +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/ai/ai/wsgi.py b/ai/ai/wsgi.py new file mode 100644 index 0000000..6fe3185 --- /dev/null +++ b/ai/ai/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for ai project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ai.settings') + +application = get_wsgi_application() diff --git a/ai/challenge/__init__.py b/ai/challenge/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ai/challenge/admin.py b/ai/challenge/admin.py new file mode 100644 index 0000000..bb87b34 --- /dev/null +++ b/ai/challenge/admin.py @@ -0,0 +1,9 @@ +from django.contrib import admin +from .models import Reward , Submission, Team, Game, Score, Challenge + +admin.site.register(Reward) +admin.site.register(Submission) +admin.site.register(Team) +admin.site.register(Game) +admin.site.register(Score) +admin.site.register(Challenge) \ No newline at end of file diff --git a/ai/challenge/api/serializer.py b/ai/challenge/api/serializer.py new file mode 100644 index 0000000..c36b269 --- /dev/null +++ b/ai/challenge/api/serializer.py @@ -0,0 +1,223 @@ +from rest_framework import serializers +from challenge.models import Team, Score, Challenge, PostMessage, Submission +from account.models import User +from django.forms.fields import FileField + +from rest_framework.response import Response + + + +class TeamRegistation(serializers.ModelSerializer): + user_field = serializers.CharField(style={'input_type':'password'}, write_only=True) + + class Meta: + model = Team + fields = ('name','user_field') + + def save(self,user): + field = [User.objects.filter(username=i) for i in self.validated_data['user_field'].split(' ')] + team = Team.objects.create( + name = self.validated_data['name'], + admin = user + ) + user.teams.add(team) + for i in range(min(len(field),2)): + team.member.add(field[i][0]) + text = ' {admin} invited you to join {team} '.format(admin=team.admin, team=team.name) + link = 'http://127.0.0.1:8000/answer/{team}'.format(team=team.name) + message = PostMessage.objects.create(message=text, data=link) + field[i][0].message_box.add(message) + return team + + +class InviteRegister(serializers.ModelSerializer): + ans = serializers.CharField(max_length=3) + id = serializers.IntegerField() + + class Meta: + model = Team + fields = ['ans', 'id'] + + + def set_invite(self, user, team): + try: + team = Team.objects.filter(name=team, + member__username__iexact=user)[0] + except: + PostMessage.objects.get( pk = self.validated_data['id']).delete() + raise serializers.ValidationError({'response':' چینین تیمی وجود ندارد. یا ممکن است این تیم حذف شده باشد'}) + data = {} + if self.validated_data['ans'] == 'yes': + team.active = True + user.teams.add(team) + data['answer'] = 'عضویت شما انجام شد' + else: + team.member.remove(user) + data['answer'] = 'شما درخواست عضویت را رد کردید' + team.save() + PostMessage.objects.get( pk = self.validated_data['id']).delete() + return data + + + +class Member_Edit(serializers.ModelSerializer): + team = serializers.CharField(max_length=100) + member = serializers.CharField(max_length=100) + + class Meta: + model = Team + fields = ['team','member'] + + def add_member(self, admin): + T = Team.objects.filter(name=self.validated_data['team'])[0] + field = [User.objects.filter(username=i) for i in self.validated_data['member'].split(' ')] + l = len(T.member.distinct()) + data = {} + if T.admin == admin and l < 2 : + for i in range(2-l): + if field[i][0] not in T.member.distinct() : + T.member.add(field[i][0]) + text = ' {admin} invited you to join {team} '.format(admin=T.admin, team=T.name) + link = 'http://127.0.0.1:8000/answer/{team}'.format(team=T.name) + message = PostMessage.objects.create(message=text, data=link) + field[i][0].message_box.add(message) + T.save() + data['response'] = 'درخواست برای افراد ارسال شد' + else : + data['response'] = 'Wrong' + return data + + + def delete_member(self, admin): + team = Team.objects.filter(name=self.validated_data['team'])[0] + member = User.objects.filter( username = self.validated_data['member']) + data = {} + if team.admin == admin or admin == member : + if member in team.member.distinct(): + team.member.remove(member) + member.teams.remove(team) + if team.admin == admin and admin == member: + team.delete() + elif len(team.member.distinct()) == 0 : + team.active = False + data['response'] = ' {user} با موفقیت حذف شد '.format(user=member) + else : + data['response'] = 'عضو در این گروه وجود ندارد' + else: + data['response'] = ' اجازه انجام چنین کاری وجود ندارد' + return data + + +class DeleteTeam(serializers.ModelSerializer): + team = serializers.CharField(max_length=100) + + class Meta: + model = Team + fields = ['team'] + + + def delet_team(self, admin): + team = Team.objects.filter(name=self.validated_data['team'])[0] + data = {} + if team.admin == admin: + team.delete() + data['response'] = 'تیم با موفقیت حذف شد' + else: + data['response'] = 'اجازه چنین کاری وجود ندارد' + + return data + + + + +class PostSerializer(serializers.HyperlinkedModelSerializer): + + class Meta: + model = PostMessage + fields = ('id', 'message', 'data', 'url') + + + +class TeamSerializer(serializers.HyperlinkedModelSerializer): + + class Meta: + model = Team + fields = ('id', 'name', 'admin', 'member', 'score', 'submission', 'active', 'message_box') + + + + + +class ScoreSerializer(serializers.HyperlinkedModelSerializer): + + class Meta: + model = Score + fields = ('id', 'score', 'challenge') + + +class ChallengeSerializer(serializers.HyperlinkedModelSerializer): + + class Meta: + model = Challenge + fields = ('id', 'name') + + + + + + +########################################################## +################# submission ###################### +########################################################## + + +class SubmissionSerializer(serializers.ModelSerializer): + + challenge_name = serializers.CharField() + team = serializers.CharField() + language_name = serializers.CharField() + + class Meta: + model = Submission + fields = ('challenge_name', 'team', 'zip_file', 'language_name') + + # def custom_data(self): + # data = { + # 'team':self.validated_data['team'], + # 'zip_file':self.validated_data['zip_file'], + # 'challenge_name':self.validated_data['challenge_name'] + # } + # return data + def submit(self, member="ali"): + + challenge = Challenge.objects.filter(name = self.validated_data['challenge_name'])[0] + T = Team.objects.filter(name = self.validated_data['team'])[0] + user = User.objects.filter(username = member)[0] #user member + file = self.validated_data['zip_file'] + language = self.validated_data['language_name'] + if file.name[-4:] == '.zip' and user in T.member.distinct() or user == T.admin : #and the team is in this challenge + if len(Submission.objects.all()) == 0 : + file.name = str(1) + else: + str(Submission.objects.latest('id').id+1) + submit = Submission.objects.create( + challenge = challenge, + user = user, + zip_file = file, + language = language, + status = 'compiling' + ) + data = { + "file":submit.id, + } + from challenge.tasks import submission_task + ans = submission_task.delay(data) + if ans.result==0: + rs = {'response' : 'there is problem in submit . please try again '} + else: + rs = {"response":"succes submit "} + return rs + else: + return {"response":"fail"} + + diff --git a/ai/challenge/api/urls.py b/ai/challenge/api/urls.py new file mode 100644 index 0000000..1343c55 --- /dev/null +++ b/ai/challenge/api/urls.py @@ -0,0 +1,33 @@ +from django.urls import path,include +from . import views +from account.api import views as account_views +from rest_framework import routers + + +router = routers.DefaultRouter() +router.register('challeges', views.ChallengeView, basename="challenge") +router.register('users', account_views.UserView ) +router.register('message', views.PostMessagetView ) +router.register('teams', views.TeamViewList) +# router.register('scorslist', views.ScoreView, basename="score") + + + +from rest_framework_simplejwt import views as jwt_views + + +urlpatterns = [ + path('api/token/', jwt_views.TokenObtainPairView.as_view(), name='token_obtain_pair'), + path('api/token/refresh/', jwt_views.TokenRefreshView.as_view(), name='token_refresh'), + path('score/', views.Score_detail), + + path('team/register', views.Teamregister), + path('answer/', views.AnswerToInvite ), + path('addmember', views.add_member ), + path('removemember', views.delete_member ), + + path('submit', views.submit_file ), + + + path('', include(router.urls)), +] diff --git a/ai/challenge/api/views.py b/ai/challenge/api/views.py new file mode 100644 index 0000000..d976ba6 --- /dev/null +++ b/ai/challenge/api/views.py @@ -0,0 +1,185 @@ +from rest_framework import viewsets, status +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import IsAuthenticated +from account.models import User +from challenge.models import ( + Team, + Score, + Challenge, + PostMessage +) + +from .serializer import ( + ScoreSerializer, + TeamSerializer, + ChallengeSerializer, + TeamRegistation, + InviteRegister, + Member_Edit, + DeleteTeam, + PostSerializer, + SubmissionSerializer + ) + + +from rest_framework.permissions import IsAuthenticated +from rest_framework.views import APIView + + + + + + + + +# creat team +@api_view(['POST',]) +@permission_classes([IsAuthenticated]) +def Teamregister(request): + if request.method == 'POST': + serializer = TeamRegistation(data=request.data) + data = {} + if serializer.is_valid(): + team = serializer.save(request.user) + data['response'] = 'تیم با موفقیت تشکیل شد و دعوت نامه های برای اعضا فرستاده شد.' + else: + data = serializer.errors + return Response(data) + + + + +#asnwer to invite +@api_view(['POST',]) +@permission_classes([IsAuthenticated]) +def AnswerToInvite(request, team): + data = {} + if request.method == 'POST': + serializer = InviteRegister(data=request.data) + if serializer.is_valid(): + data = serializer.set_invite(request.user, team) + return Response(data, status=status.HTTP_200_OK) + else: + data['response'] = 'Wrong' + return Response(data,status=status.HTTP_400_BAD_REQUEST) + return Response(data, status=status.HTTP_400_BAD_REQUEST) + + + +#add new member +@api_view(['POST']) +@permission_classes([IsAuthenticated]) +def add_member(request): + data = {} + if request.method == 'POST': + serializer = Member_Edit(data=request.data) + if serializer.is_valid(): + data = serializer.add_member(request.user) + return Response(data) + else: + return Response(serializer.errors) + + +#delete member from team with admin +@api_view(['POST',]) +@permission_classes([IsAuthenticated]) +def delete_member(request): + data = {} + if request.method == 'POST' : + serializer = Member_Edit(data=request.data) + if serializer.is_valid(): + data = serializer.delete(request.user) + else: + data = serializer.errors + return Response(data) + + + +#delete team +@api_view(['POST']) +@permission_classes([IsAuthenticated]) +def delete_team(request): + data = {} + if request.method == 'POST': + serializer = DeleteTeam(data=request.data) + if serializer.is_valid(): + data = serializer.delet_team(request.user) + else: + data = serializer.errors + return Response(data) + + +# team detail +@api_view(['GET']) +def TeamView_detail(request,pk): + if request.method == 'GET': + teames = Team.objects(kp=pk) + serializer = TeamSerializer(Team, many=True) + return Response(serializer.data) + + + + +@api_view(['GET']) +def Score_detail(request,pk): + try: + score = Score.objects.get(pk=pk) + except Score.DoesNotExist: + return Response(status=status.HTTP_404_NOT_FOUND) + + if request.method == 'GET': + serializer = ScoreSerializer(score,context={'request': request}) + return Response(serializer.data) + + + + + + + + +##### show all detail + + +class PostMessagetView(viewsets.ReadOnlyModelViewSet): + queryset = PostMessage.objects.all() + serializer_class = PostSerializer + + +class ScoreView(viewsets.ReadOnlyModelViewSet): + queryset = Score.objects.all() + serializer_class = ScoreSerializer + + +class ChallengeView(viewsets.ReadOnlyModelViewSet): + queryset = Challenge.objects.all() + serializer_class = ChallengeSerializer + + +class TeamViewList(viewsets.ReadOnlyModelViewSet): + queryset = Team.objects.all() + serializer_class = TeamSerializer + + + + + + + +################################################# +################## submission ################### + + +@api_view(['POST']) +def submit_file(request): + if request.method == 'POST': + serializer = SubmissionSerializer(data=request.data) + if serializer.is_valid(): + data = serializer.submit() + return Response(data) + return Response({'response':'wrong'}) + + + diff --git a/ai/challenge/apps.py b/ai/challenge/apps.py new file mode 100644 index 0000000..482994b --- /dev/null +++ b/ai/challenge/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ChallengeConfig(AppConfig): + name = 'challenge' diff --git a/ai/challenge/compiler.py b/ai/challenge/compiler.py new file mode 100644 index 0000000..322f6af --- /dev/null +++ b/ai/challenge/compiler.py @@ -0,0 +1,143 @@ +import os, subprocess, shutil, sys, zipfile +from pathlib import Path + +cwd = os.getcwd() + +def unzip(submission_dir): + with zipfile.ZipFile(submission_dir + "/client.zip", 'r') as zip_ref: + zip_ref.extractall(submission_dir + "/source") + +def java(submission_id): + submission_dir = cwd + "/media/" + str(submission_id) + try: + try: + shutil.rmtree(submission_dir + "/source") + except: + pass + # unzipping submitted client + unzip(submission_dir) + + source_dir = submission_dir + "/source/" + os.listdir(submission_dir + "/source")[0] + build_dir = submission_dir + "/build" + client_path = submission_dir + "/client.jar" + + # compile client + java_files = [] + jar_files = [] + for (dirpath, _, filenames) in os.walk(source_dir): + p = [os.path.join(dirpath, f) for f in filenames if f[-5:] == '.java'] + java_files.extend(p) + p = [os.path.join(dirpath, f) for f in filenames if f[-4:] == '.jar'] + jar_files.extend(p) + try: + os.remove(client_path) + except: + pass + try: + shutil.rmtree(build_dir) + except: + pass + os.mkdir(build_dir) + subprocess.run(['javac', '-d', build_dir, '-classpath', ':'.join(jar_files) + ':'] + java_files, check=True, stdout=subprocess.PIPE, universal_newlines=True) + for jar_file in jar_files: + subprocess.run(['unzip', jar_file, '-x', 'META-INF/MANIFEST.MF', '-d', build_dir], check=True, stdout=subprocess.PIPE, universal_newlines=True) + subprocess.run(['jar', '-cvfe', client_path, 'client.Main', './'], check=True, stdout=subprocess.PIPE, universal_newlines=True, cwd=build_dir) + shutil.rmtree(submission_dir + "/source") + shutil.rmtree(build_dir) + + # create client runner file + file = open(submission_dir + "/run.sh", 'w') + file.write("timeout -m " + str(1024**3) + " -t 150 java -jar '" + client_path + "'") + file.close() + os.system("chmod +x '" + submission_dir + "/run.sh'") + + return 1 + except Exception as Error: + print(str(Error)) + file = open(submission_dir + "/error.log", 'w') + file.write(str(Error)) + file.close() + + return 0 + +def cpp(submission_id): + submission_dir = cwd + "/media/" + str(submission_id) + try: + try: + shutil.rmtree(submission_dir + "/source") + except: + pass + # unzipping submitted client + unzip(submission_dir) + + source_dir = submission_dir + "/source/" + os.listdir(submission_dir + "/source")[0] + build_dir = os.path.join(source_dir, 'build') + client_path = submission_dir + "/client" + + # compile client + try: + os.remove(client_path) + except: + pass + try: + shutil.rmtree(build_dir) + except: + pass + os.mkdir(build_dir) + subprocess.run(['cmake', '-S', source_dir, '-B', build_dir], check=True, stdout=subprocess.PIPE, universal_newlines=True) + subprocess.run(['make', '-C', build_dir], check=True, stdout=subprocess.PIPE, universal_newlines=True) + shutil.move(build_dir + '/client/client', client_path) + shutil.rmtree(submission_dir + "/source") + + # create client runner file + file = open(submission_dir + "/run.sh", 'w') + file.write("timeout -m " + str(1024**3) + " -t 150 '" + client_path + "'") + file.close() + os.system("chmod +x '" + submission_dir + "/run.sh'") + + return 1 + except Exception as Error: + print(str(Error)) + file = open(submission_dir + "/error.log", 'w') + file.write(str(Error)) + file.close() + + return 0 + +def python(submission_id): + submission_dir = cwd + "/media/" + str(submission_id) + try: + try: + shutil.rmtree(submission_dir + "/source") + except: + pass + # unzipping submitted client + unzip(submission_dir) + + source_dir = submission_dir + "/source/" + os.listdir(submission_dir + "/source")[0] + client_path = submission_dir + "/client" + + # move source to specific folder + try: + shutil.rmtree(client_path) + except: + pass + shutil.move(source_dir, client_path) + shutil.rmtree(submission_dir + "/source") + + # create client runner file + file = open(submission_dir + "/run.sh", 'w') + file.write("timeout -m " + str(1024**3) + " -t 150 python3 '" + client_path + "/Controller.py'") + file.close() + os.system("chmod +x '" + submission_dir + "/run.sh'") + + return 1 + except Exception as Error: + print(str(Error)) + file = open(submission_dir + "/error.log", 'w') + file.write(str(Error)) + file.close() + + return 0 + + diff --git a/ai/challenge/migrations/0001_initial.py b/ai/challenge/migrations/0001_initial.py new file mode 100644 index 0000000..740af75 --- /dev/null +++ b/ai/challenge/migrations/0001_initial.py @@ -0,0 +1,94 @@ +# Generated by Django 3.0.7 on 2020-06-11 08:34 + +import challenge.models +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Challenge', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ], + ), + migrations.CreateModel( + name='PostMessage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.CharField(max_length=100)), + ('data', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Score', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('type', models.CharField(choices=[('Lig', 'L'), ('frindy', 'F')], max_length=9)), + ('score', models.IntegerField(default=0)), + ('pos', models.CharField(blank=True, max_length=10)), + ('challenge', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='challenge.Challenge')), + ], + ), + migrations.CreateModel( + name='Submission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('zip_file', models.FileField(blank=True, null=True, upload_to=challenge.models.where_to_upload)), + ('language', models.CharField(choices=[('c++', 'C++'), ('java', 'Java'), ('python', 'Python'), ('go', 'Go')], default='python', max_length=10)), + ('status', models.CharField(choices=[('compiling', 0), ('compiled', 1), ('Eroro', -1)], max_length=9)), + ('date', models.DateTimeField(auto_now=True)), + ('challenge', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='challenge.Challenge')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Team', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, unique=True)), + ('photo_main', models.ImageField(blank=True, null=True, upload_to='photo/team/%Y/%m/%d')), + ('active', models.BooleanField(default=False)), + ('admin', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='admin', to=settings.AUTH_USER_MODEL)), + ('member', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL)), + ('message_box', models.ManyToManyField(to='challenge.PostMessage')), + ('score', models.ManyToManyField(blank=True, related_name='members', to='challenge.Score')), + ('submission', models.ManyToManyField(blank=True, to='challenge.Submission')), + ], + ), + migrations.CreateModel( + name='Reward', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('rank', models.IntegerField(choices=[(1, 1), (3, 3), (2, 2)])), + ('discribtion', models.TextField()), + ('date', models.DateTimeField(default=datetime.datetime.now)), + ('users', models.ManyToManyField(blank=True, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Game', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('team1_result', models.IntegerField(default=0)), + ('team2_result', models.IntegerField(default=0)), + ('game_type', models.CharField(choices=[('f_random', 'R'), ('Lig', 'L'), ('tornoment', 'T'), ('f_normal', 'N')], default='friendly', max_length=50)), + ('challenge', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='challenge.Challenge')), + ('team_1', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='team_1', to='challenge.Team')), + ('team_2', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='team_2', to='challenge.Team')), + ], + ), + ] diff --git a/ai/challenge/migrations/__init__.py b/ai/challenge/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ai/challenge/models.py b/ai/challenge/models.py new file mode 100644 index 0000000..2d2f4bf --- /dev/null +++ b/ai/challenge/models.py @@ -0,0 +1,103 @@ +from django.db import models +from datetime import datetime + +class Reward(models.Model): + name = models.CharField(max_length=50) + rank = models.IntegerField(choices={(1,1),(2,2),(3,3)}) + discribtion = models.TextField() + users = models.ManyToManyField("account.User", blank=True) + date = models.DateTimeField(default=datetime.now,) + + def __str__(self): + return self.name + + +def where_to_upload(instance, filename): + return '{0}/client.zip'.format(filename) + + +class Submission(models.Model): + challenge = models.ForeignKey('challenge.Challenge', on_delete=models.CASCADE) + user = models.ForeignKey("account.User", on_delete=models.CASCADE) + zip_file = models.FileField(upload_to=where_to_upload, blank=True, null=True) + + LANGUAGE_CHOICE = {('go','Go'),('c++','C++'),('python','Python'),('java','Java'),} + language = models.CharField(choices=LANGUAGE_CHOICE, default='python', max_length=10) + + COMPILE_CHOICE = { ('Eroro',-1), ('compiling',0), ('compiled',1), } + status = models.CharField(choices=COMPILE_CHOICE, max_length=9) + + date = models.DateTimeField(auto_now=True) + + def __str__(self): + return " ({}) : {} : {} : {} ".format(self.id , self.user, self.language, str(self.date)[:19]) + + +class Team(models.Model): + name = models.CharField(max_length=100, unique=True) + photo_main = models.ImageField(upload_to='photo/team/%Y/%m/%d', blank=True, null=True) + admin = models.ForeignKey('account.User', on_delete=models.CASCADE, related_name='admin') + member = models.ManyToManyField("account.User", blank=True) + score = models.ManyToManyField('challenge.Score', blank=True, related_name='members') + submission = models.ManyToManyField("challenge.Submission",blank=True) + message_box = models.ManyToManyField('challenge.PostMessage') + active = models.BooleanField(default=False) + # challenge_history = models.ManyToManyField("challenge.Challenge") + #game = models.ManyToManyField("challenges.Game") + + + def __str__(self): + return self.name + + +class Challenge(models.Model): + name = models.CharField(max_length=50) + # discribtion = models.TextField() + # teams = models.ManyToManyField("challenge.Team") + # team_1_score = models.IntegerField(default=0) + # team_2_score = models.IntegerField(default=0) + # game = models.ManyToManyField("challenge.Game") + # # laby - waiting - finished ---> must be creat dear developers + # STATUS_CHOICE = {('laby','Laby'), ('waiting','Waiting'), ('finished','Finished')} + # challenge_status = models.CharField(choices=STATUS_CHOICE, default='laby', max_length=50) + + + def __str__(self): + return self.name + + +class Game(models.Model): + name = models.CharField(max_length=50) + team_1 = models.ForeignKey('challenge.Team', related_name='team_1', on_delete=models.CASCADE) + team_2 = models.ForeignKey('challenge.Team', related_name='team_2', on_delete=models.CASCADE) + team1_result = models.IntegerField(default=0) + team2_result = models.IntegerField(default=0) + # game_score = models.IntegerField(default=0) + + TYPE_CHOICE = {('tornoment','T'), ('f_normal','N'), ('f_random','R'), ('Lig','L')} + game_type = models.CharField(choices=TYPE_CHOICE, default='friendly', max_length=50) + challenge = models.ForeignKey(Challenge, on_delete=models.CASCADE) + # game_map = models.CharField(blank=True,null=True,max_length=70) + + + +class Score(models.Model): + TYPE_CHOICE = {('frindy','F'),('Lig','L')} + type = models.CharField(choices=TYPE_CHOICE, max_length=9) + challenge = models.ForeignKey('challenge.Challenge', on_delete=models.CASCADE) + score = models.IntegerField(default=0) + pos = models.CharField(blank=True, max_length=10) + + + def __str__(self): + return str(self.score) + + + + +class PostMessage(models.Model): + message = models.CharField(max_length=100) + data = models.CharField(max_length=100) + + def __str__(self): + return 'message in id : {}'.format(self.id) \ No newline at end of file diff --git a/ai/challenge/tasks.py b/ai/challenge/tasks.py new file mode 100644 index 0000000..edde4d5 --- /dev/null +++ b/ai/challenge/tasks.py @@ -0,0 +1,17 @@ +from celery import shared_task +from challenge import compiler +from challenge.models import Submission + +@shared_task +def submission_task(data): + submit = Submission.objects.filter(id = data['file'])[0] + if submit.language == 'python': ans = compiler.python(submit.id) + elif submit.language == 'c++': ans = compiler.cpp(submit.id) + elif submit.language == 'go': ans = compiler.go(submit.id) + elif submit.language == 'java': ans = compiler.java(submit.id) + if ans == 1 : + pass + # run the code with id of submission + else: + submit.delete() + return ans \ No newline at end of file diff --git a/ai/challenge/tests.py b/ai/challenge/tests.py new file mode 100644 index 0000000..de8bdc0 --- /dev/null +++ b/ai/challenge/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/ai/challenge/views.py b/ai/challenge/views.py new file mode 100644 index 0000000..c60c790 --- /dev/null +++ b/ai/challenge/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/ai/manage.py b/ai/manage.py new file mode 100755 index 0000000..3f94ec0 --- /dev/null +++ b/ai/manage.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ai.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/ai/media/1/client b/ai/media/1/client new file mode 100644 index 0000000..23762e5 --- /dev/null +++ b/ai/media/1/client @@ -0,0 +1 @@ +print(1231) \ No newline at end of file diff --git a/ai/media/1/client.zip b/ai/media/1/client.zip new file mode 100644 index 0000000000000000000000000000000000000000..1a944e145e71d05c44177df2d986a1508c7fc88d GIT binary patch literal 199 zcmWIWW@Zs#-~htt&Qk#lP{0kOSr`-;4D|{sLqm8O*souC5O)QLL3C*aHv=Qf3ud4a z5TUJc>Wub90}~^&D=Z8F-s~JpR1Y5I1sVV{B*2@INrV|;0kRy(0vOoR2x1XqU4S<$ Q8%Ql95C#G1co2sH0EUt+rT_o{ literal 0 HcmV?d00001 diff --git a/ai/media/1/run.sh b/ai/media/1/run.sh new file mode 100755 index 0000000..eda8085 --- /dev/null +++ b/ai/media/1/run.sh @@ -0,0 +1 @@ +timeout -m 1073741824 -t 150 python3 '/home/zac/drive_1/python/AI_Battle/Data-Base/ai/media/1/client/Controller.py' \ No newline at end of file diff --git a/ai/media/p.zip/client.zip b/ai/media/p.zip/client.zip new file mode 100644 index 0000000000000000000000000000000000000000..1a944e145e71d05c44177df2d986a1508c7fc88d GIT binary patch literal 199 zcmWIWW@Zs#-~htt&Qk#lP{0kOSr`-;4D|{sLqm8O*souC5O)QLL3C*aHv=Qf3ud4a z5TUJc>Wub90}~^&D=Z8F-s~JpR1Y5I1sVV{B*2@INrV|;0kRy(0vOoR2x1XqU4S<$ Q8%Ql95C#G1co2sH0EUt+rT_o{ literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1de0030 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,16 @@ +amqp==2.6.0 +asgiref==3.2.7 +billiard==3.6.3.0 +celery==4.4.5 +Django==3.0.7 +djangorestframework==3.11.0 +djangorestframework-jwt==1.11.0 +djangorestframework-simplejwt==4.4.0 +future==0.18.2 +kombu==4.6.10 +Pillow==2.2.1 +PyJWT==1.7.1 +pytz==2020.1 +redis==3.5.3 +sqlparse==0.3.1 +vine==1.3.0 From a0c20337c07ffc70d7709fdf03e79583ee6d7fe4 Mon Sep 17 00:00:00 2001 From: 31Tir Date: Thu, 18 Jun 2020 20:07:32 +0430 Subject: [PATCH 2/6] complate create team and submit for them but out of challenge --- .gitignore | 1 + ai/challenge/api/serializer.py | 23 ++++++++++++----------- ai/challenge/api/views.py | 6 +++++- ai/media/1/client | 1 - ai/media/1/client.zip | Bin 199 -> 0 bytes ai/media/1/run.sh | 1 - ai/media/p.zip/client.zip | Bin 199 -> 0 bytes 7 files changed, 18 insertions(+), 14 deletions(-) delete mode 100644 ai/media/1/client delete mode 100644 ai/media/1/client.zip delete mode 100755 ai/media/1/run.sh delete mode 100644 ai/media/p.zip/client.zip diff --git a/.gitignore b/.gitignore index 62af979..9f8b73f 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ lib64/ parts/ sdist/ var/ +media/ wheels/ share/python-wheels/ *.egg-info/ diff --git a/ai/challenge/api/serializer.py b/ai/challenge/api/serializer.py index c36b269..7e4fb63 100644 --- a/ai/challenge/api/serializer.py +++ b/ai/challenge/api/serializer.py @@ -22,11 +22,12 @@ def save(self,user): ) user.teams.add(team) for i in range(min(len(field),2)): - team.member.add(field[i][0]) - text = ' {admin} invited you to join {team} '.format(admin=team.admin, team=team.name) - link = 'http://127.0.0.1:8000/answer/{team}'.format(team=team.name) - message = PostMessage.objects.create(message=text, data=link) - field[i][0].message_box.add(message) + if field[i][0] != user: + team.member.add(field[i][0]) + text = 'Hi {user}, {admin} invited you to join {team} '.format(user=field[i][0].username, admin=team.admin, team=team.name) + link = 'http://127.0.0.1:8000/answer/{team}'.format(team=team.name) + message = PostMessage.objects.create(message=text, data=link) + field[i][0].message_box.add(message) return team @@ -188,18 +189,18 @@ class Meta: # 'challenge_name':self.validated_data['challenge_name'] # } # return data - def submit(self, member="ali"): + def submit(self, member): challenge = Challenge.objects.filter(name = self.validated_data['challenge_name'])[0] T = Team.objects.filter(name = self.validated_data['team'])[0] user = User.objects.filter(username = member)[0] #user member file = self.validated_data['zip_file'] language = self.validated_data['language_name'] - if file.name[-4:] == '.zip' and user in T.member.distinct() or user == T.admin : #and the team is in this challenge + if file.name[-4:] == '.zip' and ( member in T.member.distinct() or member == T.admin ) : # and T in challenge.team.distinct() # for this chanllenge , team shoud register in challenge if len(Submission.objects.all()) == 0 : file.name = str(1) else: - str(Submission.objects.latest('id').id+1) + file.name = str(Submission.objects.latest('id').id+1) submit = Submission.objects.create( challenge = challenge, user = user, @@ -213,10 +214,10 @@ def submit(self, member="ali"): from challenge.tasks import submission_task ans = submission_task.delay(data) if ans.result==0: - rs = {'response' : 'there is problem in submit . please try again '} + rs = 'there is problem in submit . please try again ' else: - rs = {"response":"succes submit "} - return rs + rs = "succes submit " + return {'response' : rs} else: return {"response":"fail"} diff --git a/ai/challenge/api/views.py b/ai/challenge/api/views.py index d976ba6..27b3e3a 100644 --- a/ai/challenge/api/views.py +++ b/ai/challenge/api/views.py @@ -173,13 +173,17 @@ class TeamViewList(viewsets.ReadOnlyModelViewSet): @api_view(['POST']) +@permission_classes([IsAuthenticated]) def submit_file(request): if request.method == 'POST': serializer = SubmissionSerializer(data=request.data) if serializer.is_valid(): - data = serializer.submit() + data = serializer.submit(request.user) return Response(data) return Response({'response':'wrong'}) + + +# to do : submission is wrong in tasks ... diff --git a/ai/media/1/client b/ai/media/1/client deleted file mode 100644 index 23762e5..0000000 --- a/ai/media/1/client +++ /dev/null @@ -1 +0,0 @@ -print(1231) \ No newline at end of file diff --git a/ai/media/1/client.zip b/ai/media/1/client.zip deleted file mode 100644 index 1a944e145e71d05c44177df2d986a1508c7fc88d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmWIWW@Zs#-~htt&Qk#lP{0kOSr`-;4D|{sLqm8O*souC5O)QLL3C*aHv=Qf3ud4a z5TUJc>Wub90}~^&D=Z8F-s~JpR1Y5I1sVV{B*2@INrV|;0kRy(0vOoR2x1XqU4S<$ Q8%Ql95C#G1co2sH0EUt+rT_o{ diff --git a/ai/media/1/run.sh b/ai/media/1/run.sh deleted file mode 100755 index eda8085..0000000 --- a/ai/media/1/run.sh +++ /dev/null @@ -1 +0,0 @@ -timeout -m 1073741824 -t 150 python3 '/home/zac/drive_1/python/AI_Battle/Data-Base/ai/media/1/client/Controller.py' \ No newline at end of file diff --git a/ai/media/p.zip/client.zip b/ai/media/p.zip/client.zip deleted file mode 100644 index 1a944e145e71d05c44177df2d986a1508c7fc88d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmWIWW@Zs#-~htt&Qk#lP{0kOSr`-;4D|{sLqm8O*souC5O)QLL3C*aHv=Qf3ud4a z5TUJc>Wub90}~^&D=Z8F-s~JpR1Y5I1sVV{B*2@INrV|;0kRy(0vOoR2x1XqU4S<$ Q8%Ql95C#G1co2sH0EUt+rT_o{ From ee80a857c5fe056fb566e6184f6f54c27ef42ad3 Mon Sep 17 00:00:00 2001 From: 31Tir Date: Wed, 1 Jul 2020 19:29:23 +0430 Subject: [PATCH 3/6] complate challnge --- .gitignore | 1 + ai/challenge/admin.py | 3 +- ai/challenge/api/permission.py | 33 +++++++ ai/challenge/api/serializer.py | 156 +++++++++++++++++++++++++++------ ai/challenge/api/urls.py | 4 + ai/challenge/api/views.py | 52 ++++++++--- ai/challenge/models.py | 47 ++++++---- ai/challenge/tasks.py | 2 +- 8 files changed, 241 insertions(+), 57 deletions(-) create mode 100644 ai/challenge/api/permission.py diff --git a/.gitignore b/.gitignore index 9f8b73f..ed115ed 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ lib64/ parts/ sdist/ var/ +migrations/ media/ wheels/ share/python-wheels/ diff --git a/ai/challenge/admin.py b/ai/challenge/admin.py index bb87b34..1f4d850 100644 --- a/ai/challenge/admin.py +++ b/ai/challenge/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin -from .models import Reward , Submission, Team, Game, Score, Challenge +from .models import Reward , Submission, Team, Game, Score, Challenge, Race +admin.site.register(Race) admin.site.register(Reward) admin.site.register(Submission) admin.site.register(Team) diff --git a/ai/challenge/api/permission.py b/ai/challenge/api/permission.py new file mode 100644 index 0000000..472f2af --- /dev/null +++ b/ai/challenge/api/permission.py @@ -0,0 +1,33 @@ +from rest_framework.permissions import BasePermission +from challenge.models import Submission, Challenge,Team, Game + + +class SubmitOneCode(BasePermission): + """ + Allows if user submited one code for this game + """ + message = 'at the first you shoud submite code for this game' + + def has_permission(self, request, view): + team = Team.objects.filter(name=request.data['your_team'])[0] + game = Game.objects.filter(name=request.data['game'])[0] + # submission = Submission.objects.filter(challenge=, game=,user=) + for i in team.submission.distinct(): + if i.game == game: + return True + return False + + + +class Registred(BasePermission): + """ + Allow if user in this team and team be in this challenge + """ + message = 'you can not submit code ' + + def has_permission(self, request, view): + team = Team.objects.filter(name=request.data['team'])[0] + challenge = Challenge.objects.filter(name=request.data['challenge']) + if request.user == team.admin or request.user in team.member.distinct(): + return True + return False \ No newline at end of file diff --git a/ai/challenge/api/serializer.py b/ai/challenge/api/serializer.py index 7e4fb63..2414e45 100644 --- a/ai/challenge/api/serializer.py +++ b/ai/challenge/api/serializer.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from challenge.models import Team, Score, Challenge, PostMessage, Submission +from challenge.models import Team, Score, Challenge, PostMessage, Submission, Race,Game from account.models import User from django.forms.fields import FileField @@ -172,53 +172,153 @@ class Meta: ########################################################## -class SubmissionSerializer(serializers.ModelSerializer): - - challenge_name = serializers.CharField() +class SubmissionSerializer(serializers.ModelSerializer): team = serializers.CharField() - language_name = serializers.CharField() + challenge = serializers.CharField() + game = serializers.CharField() + class Meta: model = Submission - fields = ('challenge_name', 'team', 'zip_file', 'language_name') - - # def custom_data(self): - # data = { - # 'team':self.validated_data['team'], - # 'zip_file':self.validated_data['zip_file'], - # 'challenge_name':self.validated_data['challenge_name'] - # } - # return data - def submit(self, member): + fields = ('challenge', 'team', 'language', 'game', 'zip_file') - challenge = Challenge.objects.filter(name = self.validated_data['challenge_name'])[0] - T = Team.objects.filter(name = self.validated_data['team'])[0] - user = User.objects.filter(username = member)[0] #user member - file = self.validated_data['zip_file'] - language = self.validated_data['language_name'] - if file.name[-4:] == '.zip' and ( member in T.member.distinct() or member == T.admin ) : # and T in challenge.team.distinct() # for this chanllenge , team shoud register in challenge + + def submit(self, member): + try: + challenge = Challenge.objects.filter(name = self.validated_data['challenge'])[0] + team = Team.objects.filter(name= self.validated_data['team'])[0] + file = self.validated_data['zip_file'] + language = self.validated_data['language'] + game = Game.objects.filter(name = self.validated_data['game'])[0] + except: + result = {'response':'wrong. pleas try again'} + return result + if file.name[-4:] != '.zip': + result = {'response':'your file is not zip'} + else: if len(Submission.objects.all()) == 0 : file.name = str(1) else: file.name = str(Submission.objects.latest('id').id+1) submit = Submission.objects.create( challenge = challenge, - user = user, + user = member, zip_file = file, language = language, - status = 'compiling' + status = 'compiling', + game = game ) data = { "file":submit.id, } - from challenge.tasks import submission_task - ans = submission_task.delay(data) + from challenge.tasks import compile_task + ans = compile_task.delay(data) if ans.result==0: rs = 'there is problem in submit . please try again ' else: + team.submission.add(submit) rs = "succes submit " - return {'response' : rs} - else: - return {"response":"fail"} + return {'response' : rs} + + + + +class ChallengeRegisterSerializer(serializers.Serializer): + team = serializers.CharField() + challenge = serializers.CharField() + + def register_team(self, user): + result = "" + try: + challenge = Challenge.objects.filter(name = self.validated_data['challenge'])[0] + T = Team.objects.filter(name = self.validated_data['team'])[0] + if user == T.admin and T.active == True: + challenge.teams.add(T) + result = 'team {} added'.format(T.name) + else: + result = 'you can not do this' + except: + result = 'except' + return result + + + +class CreatRace(serializers.Serializer): + rival_team = serializers.CharField() + your_team = serializers.CharField() + challenge = serializers.CharField() + game = serializers.CharField() + + + def creat(self, user): + result = '' + try: + challenge = Challenge.objects.filter(name = self.validated_data['challenge'])[0] + teams = challenge.teams.distinct() + rival_team = Team.objects.filter(name = self.validated_data['rival_team'])[0] + team = Team.objects.filter(name = self.validated_data['your_team'])[0] + games = challenge.game.distinct() + game = Game.objects.filter(name = self.validated_data['game'])[0] + if user != team.admin: + result = {'response':"you are not admin of {}".format(Team.name)} + elif game not in games: + result = {'response':'this game is not in this challneg'} + elif (rival_team not in teams) or (team not in teams): + result = "shout every two team be in challenge" + else: + race = Race.objects.create( + game = game, + team_1 = team, + team_2 = rival_team + ) + + text = ' {admin} from {team} invited you to a race in {G} game '.format(admin=user.username,team=team.name, G=game.name) + message = PostMessage.objects.create(message=text) + link = 'http://127.0.0.1:9000/answer-to-race/{team}/{race}/{msg}'.format(team=rival_team.name, race=race.id, msg=message.id ) + message.data = link + message.save() + rival_team.message_box.add(message) + result = "invite send" + except : + result = {'response':'wrong in exept'} + return result + + +class AnswerToRaceRegister(serializers.Serializer): + race_id = serializers.CharField() + msg_id = serializers.CharField() + answer = serializers.CharField() + + + def set_invite(self, team, user): + try: + T = Team.objects.filter(name = team)[0] + ans = self.validated_data['answer'] + msg = PostMessage.objects.filter(id=self.validated_data['msg_id'])[0] + race = Race.objects.filter(id = self.validated_data['race_id'])[0] + # import pdb; pdb.set_trace() + if user == T.admin: + if ans == 'Yes': + race.allow = True + race.save() + text = '{team} accepted your invite'.format(team=team) + message = PostMessage.objects.create(message=text) + race.team_1.message_box.add(message) + msg.delete() + result = {'response':'invite accepted'} + elif ans == "No": + text = '{team} passed your invite'.format(team) + message = PostMessage.objects.create(message=text) + race.team_1.message_box.add(message) + msg.delete() + race.delete() + result = {'response':'invite passes'} + else: + result = {'response':'you are not admin of this group'} + return result + except: + result = {'response':"wrong in except"} + return result + diff --git a/ai/challenge/api/urls.py b/ai/challenge/api/urls.py index 1343c55..44bf3c5 100644 --- a/ai/challenge/api/urls.py +++ b/ai/challenge/api/urls.py @@ -26,6 +26,10 @@ path('addmember', views.add_member ), path('removemember', views.delete_member ), + path('challenge-register', views.challenge_register ), + path('create-race', views.create_race), + path('answer-to-race/', views.answertorace), + path('submit', views.submit_file ), diff --git a/ai/challenge/api/views.py b/ai/challenge/api/views.py index 27b3e3a..67fb1ec 100644 --- a/ai/challenge/api/views.py +++ b/ai/challenge/api/views.py @@ -1,8 +1,8 @@ from rest_framework import viewsets, status -from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated +from .permission import SubmitOneCode, Registred from account.models import User from challenge.models import ( Team, @@ -20,11 +20,13 @@ Member_Edit, DeleteTeam, PostSerializer, - SubmissionSerializer + SubmissionSerializer, + ChallengeRegisterSerializer, + CreatRace, + AnswerToRaceRegister, ) -from rest_framework.permissions import IsAuthenticated from rest_framework.views import APIView @@ -164,16 +166,8 @@ class TeamViewList(viewsets.ReadOnlyModelViewSet): - - - - -################################################# -################## submission ################### - - @api_view(['POST']) -@permission_classes([IsAuthenticated]) +@permission_classes([IsAuthenticated,Registred]) def submit_file(request): if request.method == 'POST': serializer = SubmissionSerializer(data=request.data) @@ -184,6 +178,40 @@ def submit_file(request): +@api_view(['POST']) +@permission_classes([IsAuthenticated]) +def challenge_register(request): + if request.method == "POST": + serializer = ChallengeRegisterSerializer(data=request.data) + if serializer.is_valid(): + ans = serializer.register_team(request.user) + return Response(ans) + return Response({'response':'wrong'}) + + +@api_view(['POST']) +@permission_classes([IsAuthenticated,SubmitOneCode]) +def create_race(request): + if request.method == 'POST': + serializer = CreatRace(data=request.data) + if serializer.is_valid(): + result = serializer.creat(request.user) + return Response(result) + return Response({'response':'wrong'}) + + +@api_view(['POST']) +@permission_classes([IsAuthenticated]) +def answertorace(request, team): + if request.method == 'POST': + serializer = AnswerToRaceRegister(data=request.data) + if serializer.is_valid(): + result = serializer.set_invite(team, request.user) + return Response(result) + return Response({"response":"wrong"}) + # to do : submission is wrong in tasks ... + +# to do : team-28 is one member on it is active \ No newline at end of file diff --git a/ai/challenge/models.py b/ai/challenge/models.py index 2d2f4bf..6837f86 100644 --- a/ai/challenge/models.py +++ b/ai/challenge/models.py @@ -1,5 +1,6 @@ from django.db import models from datetime import datetime +from django.db.models.signals import post_save class Reward(models.Model): name = models.CharField(max_length=50) @@ -29,6 +30,8 @@ class Submission(models.Model): date = models.DateTimeField(auto_now=True) + game = models.ForeignKey('challenge.Game', on_delete=models.CASCADE) + def __str__(self): return " ({}) : {} : {} : {} ".format(self.id , self.user, self.language, str(self.date)[:19]) @@ -40,46 +43,60 @@ class Team(models.Model): member = models.ManyToManyField("account.User", blank=True) score = models.ManyToManyField('challenge.Score', blank=True, related_name='members') submission = models.ManyToManyField("challenge.Submission",blank=True) - message_box = models.ManyToManyField('challenge.PostMessage') + message_box = models.ManyToManyField('challenge.PostMessage',blank=True) active = models.BooleanField(default=False) # challenge_history = models.ManyToManyField("challenge.Challenge") #game = models.ManyToManyField("challenges.Game") - def __str__(self): return self.name class Challenge(models.Model): name = models.CharField(max_length=50) - # discribtion = models.TextField() - # teams = models.ManyToManyField("challenge.Team") - # team_1_score = models.IntegerField(default=0) - # team_2_score = models.IntegerField(default=0) - # game = models.ManyToManyField("challenge.Game") + discribtion = models.TextField(default=" ") + teams = models.ManyToManyField("challenge.Team",blank=True) # همه ی تیم ها + game = models.ManyToManyField("challenge.Game",blank=True) # گیم ها ONE TO MANY + Race = models.ManyToManyField("challenge.Race",blank=True) # مسابقات # # laby - waiting - finished ---> must be creat dear developers # STATUS_CHOICE = {('laby','Laby'), ('waiting','Waiting'), ('finished','Finished')} # challenge_status = models.CharField(choices=STATUS_CHOICE, default='laby', max_length=50) - def __str__(self): return self.name class Game(models.Model): - name = models.CharField(max_length=50) + name = models.CharField(max_length=50, unique=True) + + def __str__(self): + return self.name + + +class Race(models.Model): + name = models.CharField(max_length=50, blank=True) + game = models.ForeignKey("challenge.Game", on_delete=models.CASCADE) # گیم مسابقه team_1 = models.ForeignKey('challenge.Team', related_name='team_1', on_delete=models.CASCADE) team_2 = models.ForeignKey('challenge.Team', related_name='team_2', on_delete=models.CASCADE) team1_result = models.IntegerField(default=0) team2_result = models.IntegerField(default=0) - # game_score = models.IntegerField(default=0) - - TYPE_CHOICE = {('tornoment','T'), ('f_normal','N'), ('f_random','R'), ('Lig','L')} - game_type = models.CharField(choices=TYPE_CHOICE, default='friendly', max_length=50) - challenge = models.ForeignKey(Challenge, on_delete=models.CASCADE) + allow = models.BooleanField(default=False) + # game_score = models.IntegerField(default=0) # این مقدار به اسکور تیم ها کم یا اضاقه می شود + + # TYPE_CHOICE = {('tornoment','T'), ('f_normal','N'), ('f_random','R'), ('Lig','L')} + # game_type = models.CharField(choices=TYPE_CHOICE, default='friendly', max_length=50) # game_map = models.CharField(blank=True,null=True,max_length=70) + + + def __str__(self): + return '{} : {} '.format(self.name, self.id) +def set_name(sender, instance, **kwargs): + new_name = " {} VS {} ".format(instance.team_1.name, instance.team_2.name) + Race.objects.filter(id = instance.id ).update(name = new_name ) +post_save.connect(set_name, sender=Race) + class Score(models.Model): TYPE_CHOICE = {('frindy','F'),('Lig','L')} @@ -97,7 +114,7 @@ def __str__(self): class PostMessage(models.Model): message = models.CharField(max_length=100) - data = models.CharField(max_length=100) + data = models.CharField(max_length=100,blank=True) def __str__(self): return 'message in id : {}'.format(self.id) \ No newline at end of file diff --git a/ai/challenge/tasks.py b/ai/challenge/tasks.py index edde4d5..cb51cea 100644 --- a/ai/challenge/tasks.py +++ b/ai/challenge/tasks.py @@ -3,7 +3,7 @@ from challenge.models import Submission @shared_task -def submission_task(data): +def compile_task(data): submit = Submission.objects.filter(id = data['file'])[0] if submit.language == 'python': ans = compiler.python(submit.id) elif submit.language == 'c++': ans = compiler.cpp(submit.id) From 973d953f12b16cabe628f57132ee3bd9fcaaf3a6 Mon Sep 17 00:00:00 2001 From: 31Tir Date: Thu, 23 Jul 2020 00:29:02 +0430 Subject: [PATCH 4/6] little fix --- ai/challenge/models.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ai/challenge/models.py b/ai/challenge/models.py index 6837f86..bbffb36 100644 --- a/ai/challenge/models.py +++ b/ai/challenge/models.py @@ -1,5 +1,4 @@ from django.db import models -from datetime import datetime from django.db.models.signals import post_save class Reward(models.Model): @@ -7,7 +6,7 @@ class Reward(models.Model): rank = models.IntegerField(choices={(1,1),(2,2),(3,3)}) discribtion = models.TextField() users = models.ManyToManyField("account.User", blank=True) - date = models.DateTimeField(default=datetime.now,) + date = models.DateTimeField(auto_now=True) def __str__(self): return self.name @@ -30,7 +29,7 @@ class Submission(models.Model): date = models.DateTimeField(auto_now=True) - game = models.ForeignKey('challenge.Game', on_delete=models.CASCADE) + game = models.ForeignKey('challenge.Game', on_delete=models.CASCADE, related_name='Game') def __str__(self): return " ({}) : {} : {} : {} ".format(self.id , self.user, self.language, str(self.date)[:19]) From e95732a18424282ab90d6f70ea09530099fbcff9 Mon Sep 17 00:00:00 2001 From: 31Tir Date: Thu, 23 Jul 2020 01:02:10 +0430 Subject: [PATCH 5/6] fix :) --- ai/challenge/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ai/challenge/models.py b/ai/challenge/models.py index bbffb36..40016d5 100644 --- a/ai/challenge/models.py +++ b/ai/challenge/models.py @@ -29,7 +29,7 @@ class Submission(models.Model): date = models.DateTimeField(auto_now=True) - game = models.ForeignKey('challenge.Game', on_delete=models.CASCADE, related_name='Game') + game = models.ForeignKey('challenge.Game', on_delete=models.CASCADE,default='') def __str__(self): return " ({}) : {} : {} : {} ".format(self.id , self.user, self.language, str(self.date)[:19]) @@ -66,7 +66,7 @@ def __str__(self): class Game(models.Model): - name = models.CharField(max_length=50, unique=True) + name = models.CharField(max_length=50, unique=True, default='game') def __str__(self): return self.name From af8c3edcf140fae3ae3d29c50ded07417cfec546 Mon Sep 17 00:00:00 2001 From: 31Tir Date: Thu, 23 Jul 2020 12:18:26 +0430 Subject: [PATCH 6/6] fix :) --- ai/account/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ai/account/models.py b/ai/account/models.py index dbb0035..334d97e 100644 --- a/ai/account/models.py +++ b/ai/account/models.py @@ -7,7 +7,7 @@ class User(AbstractUser): english_firstname = models.CharField(max_length=50) english_lastname = models.CharField(max_length=50) photo_main = models.ImageField(upload_to='photo/profile/%Y/%m/%d', blank=True) - birthday = models.DateTimeField(auto_now=False) + birthday = models.DateField(auto_now=False) individual_score = models.IntegerField(default=0, blank=True) phone_number = models.IntegerField(default=0, blank=True) national_id = models.IntegerField(default=0, blank=True)