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 Sprint.settings import CONSTS
from SprintLib.language import languages
def attributes(request): def attributes(_):
return {**CONSTS, "languages": sorted(languages, key=lambda x: x.name)} 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 django.utils import timezone
from Main.models.task import Task from Main.models.task import Task
from SprintLib.language import languages
class Set(models.Model): class Set(models.Model):
@ -17,8 +18,13 @@ class Set(models.Model):
start_time = models.DateTimeField(default=None, null=True) start_time = models.DateTimeField(default=None, null=True)
end_time = models.DateTimeField(default=None, null=True) end_time = models.DateTimeField(default=None, null=True)
editors = ArrayField(models.TextField(), default=list) editors = ArrayField(models.TextField(), default=list)
languages = ArrayField(models.IntegerField(), default=list)
description = models.TextField(default='') description = models.TextField(default='')
@property
def language_models(self):
return [languages[lang] for lang in self.languages]
@property @property
def start_time_moscow(self): def start_time_moscow(self):
if self.start_time is None: if self.start_time is None:

View File

@ -6,6 +6,7 @@ from django.utils import timezone
from Main.models import SetTask, Set from Main.models import SetTask, Set
from SprintLib.BaseView import BaseView, AccessError from SprintLib.BaseView import BaseView, AccessError
from SprintLib.language import languages
class SetSettingsView(BaseView): class SetSettingsView(BaseView):
@ -36,6 +37,7 @@ class SetSettingsView(BaseView):
if self.current_set.end_time if self.current_set.end_time
else timezone.now().strftime("%Y-%m-%dT%H:%M") else timezone.now().strftime("%Y-%m-%dT%H:%M")
) )
self.context['languages'] = languages
def post_save(self): def post_save(self):
for key, value in self.request.POST.items(): for key, value in self.request.POST.items():
@ -97,4 +99,17 @@ class SetSettingsView(BaseView):
for t in to_delete: for t in to_delete:
self.entities.set.editors.remove(t) self.entities.set.editors.remove(t)
self.entities.set.save() 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 Main.models import Solution, Progress, SolutionFile
from SprintLib.BaseView import BaseView, AccessError from SprintLib.BaseView import BaseView, AccessError
from SprintLib.language import languages
from SprintLib.queue import send_testing from SprintLib.queue import send_testing
from SprintLib.utils import write_bytes from SprintLib.utils import write_bytes
@ -23,9 +24,13 @@ class TaskView(BaseView):
if hasattr(self.entities, 'setTask'): if hasattr(self.entities, 'setTask'):
self.entities.add('task', self.entities.setTask.task) self.entities.add('task', self.entities.setTask.task)
self.entities.add('set', self.entities.setTask.set) 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: 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: 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() raise AccessError()
self.context['languages'] = languages
if self.request.method == "GET": if self.request.method == "GET":
return return
self.solution = Solution.objects.create( 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 not set.end_time %}без ограничений{% else %}{{ set.end_time_moscow }}{% endif %}</b><br>
Публичность: <b>{% if set.public %}публично{% else %}приватно{% endif %}</b><br> Публичность: <b>{% if set.public %}публично{% else %}приватно{% endif %}</b><br>
Открытость: <b>{% if set.opened %}открыто{% 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 %} {% endblock %}

View File

@ -122,4 +122,41 @@
</form> </form>
</div> </div>
</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 %} {% endblock %}