This commit is contained in:
Egor Matveev 2022-02-11 22:15:48 +03:00
parent 1efa48aff3
commit e721b9b5ec
7 changed files with 90 additions and 4 deletions

View File

@ -1,6 +1,5 @@
from Sprint.settings import CONSTS
from SprintLib.language import languages
def attributes(request):
return {**CONSTS, "languages": sorted(languages, key=lambda x: x.name)}
def attributes(_):
return CONSTS

View File

@ -0,0 +1,19 @@
# Generated by Django 3.2.4 on 2022-02-11 18:36
import django.contrib.postgres.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('Main', '0017_auto_20220201_0033'),
]
operations = [
migrations.AddField(
model_name='set',
name='languages',
field=django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), default=list, size=None),
),
]

View File

@ -7,6 +7,7 @@ from django.db.models.functions import Length
from django.utils import timezone
from Main.models.task import Task
from SprintLib.language import languages
class Set(models.Model):
@ -17,8 +18,13 @@ class Set(models.Model):
start_time = models.DateTimeField(default=None, null=True)
end_time = models.DateTimeField(default=None, null=True)
editors = ArrayField(models.TextField(), default=list)
languages = ArrayField(models.IntegerField(), default=list)
description = models.TextField(default='')
@property
def language_models(self):
return [languages[lang] for lang in self.languages]
@property
def start_time_moscow(self):
if self.start_time is None:

View File

@ -6,6 +6,7 @@ from django.utils import timezone
from Main.models import SetTask, Set
from SprintLib.BaseView import BaseView, AccessError
from SprintLib.language import languages
class SetSettingsView(BaseView):
@ -36,6 +37,7 @@ class SetSettingsView(BaseView):
if self.current_set.end_time
else timezone.now().strftime("%Y-%m-%dT%H:%M")
)
self.context['languages'] = languages
def post_save(self):
for key, value in self.request.POST.items():
@ -97,4 +99,17 @@ class SetSettingsView(BaseView):
for t in to_delete:
self.entities.set.editors.remove(t)
self.entities.set.save()
return "/admin/task?task_id=" + str(self.entities.task.id)
return "/admin/set?set_id=" + str(self.entities.set.id)
def post_languages_edit(self):
current_languages = self.entities.set.languages
for key, value in self.request.POST.items():
if key.startswith("language_"):
i = int(key.split("_")[1])
if i not in current_languages:
self.entities.set.languages.append(i)
to_delete = [i for i in current_languages if "language_" + str(i) not in self.request.POST]
for t in to_delete:
self.entities.set.languages.remove(t)
self.entities.set.save()
return "/admin/set?set_id=" + str(self.entities.set.id)

View File

@ -3,6 +3,7 @@ from zipfile import ZipFile
from Main.models import Solution, Progress, SolutionFile
from SprintLib.BaseView import BaseView, AccessError
from SprintLib.language import languages
from SprintLib.queue import send_testing
from SprintLib.utils import write_bytes
@ -23,9 +24,13 @@ class TaskView(BaseView):
if hasattr(self.entities, 'setTask'):
self.entities.add('task', self.entities.setTask.task)
self.entities.add('set', self.entities.setTask.set)
self.context['languages'] = self.entities.set.language_models
for lang in self.context['languages']:
print(lang)
else:
if not self.entities.task.public and not self.entities.task.creator == self.request.user and not self.request.user.username in self.entities.task.editors:
raise AccessError()
self.context['languages'] = languages
if self.request.method == "GET":
return
self.solution = Solution.objects.create(

View File

@ -18,4 +18,9 @@
Время окончания: <b>{% if not set.end_time %}без ограничений{% else %}{{ set.end_time_moscow }}{% endif %}</b><br>
Публичность: <b>{% if set.public %}публично{% else %}приватно{% endif %}</b><br>
Открытость: <b>{% if set.opened %}открыто{% else %}закрыто{% endif %} для просмотра и решения</b><br>
<hr><hr>
<h3>Языки программирования</h3>
{% for language in set.language_models %}
<img src="{{ language.logo_url }}" height="24px" width="24px"> {{ language.name }}<br>
{% endfor %}
{% endblock %}

View File

@ -122,4 +122,41 @@
</form>
</div>
</div>
<hr><hr>
<h3>Языки программирования</h3>
{% for language in set.language_models %}
<img src="{{ language.logo_url }}" height="24px" width="24px"> {{ language.name }}<br>
{% endfor %}
<button type="button" class="btn btn-primary" style="margin-top: 20px;" data-toggle="modal" data-target="#exampleL"><i class="fa fa-pencil"></i> Редактировать</button>
<div class="modal fade" id="exampleL" tabindex="-1" role="dialog" aria-labelledby="exampleModalLongTitleL" aria-hidden="true">
<div class="modal-dialog" role="document">
<form method="POST">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitleL">Редактировать языки программирования</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="container-fluid">
<div class="row">
<div class="col-12">
{% csrf_token %}
<input type="hidden" name="action" value="languages_edit">
{% for language in languages %}
<input type="checkbox" {% if language.id in set.languages %}checked{% endif %} name="language_{{ language.id }}"> <img src="{{ language.logo_url }}" height="24px" width="24px"> {{ language.name }}<br>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-times-circle"></i> Закрыть</button>
<button type="submit" class="btn btn-success"><i class="fa fa-check"></i> Установить</button>
</div>
</div>
</form>
</div>
</div>
{% endblock %}