mirror of
				https://gitlab.com/animath/si/plateforme-corres2math.git
				synced 2025-11-04 11:12:21 +01:00 
			
		
		
		
	Add a modal to create a question
This commit is contained in:
		@@ -6,7 +6,7 @@ from django.core.exceptions import ValidationError
 | 
			
		||||
from django.db.models import Q
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from .models import Participation, Phase, Team, Video
 | 
			
		||||
from .models import Participation, Phase, Question, Team, Video
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TeamForm(forms.ModelForm):
 | 
			
		||||
@@ -138,12 +138,24 @@ class SendParticipationForm(forms.ModelForm):
 | 
			
		||||
        self.instance = participation
 | 
			
		||||
        return cleaned_data
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = Participation
 | 
			
		||||
        fields = ('sent_participation',)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class QuestionForm(forms.ModelForm):
 | 
			
		||||
    """
 | 
			
		||||
    Create or update a question.
 | 
			
		||||
    """
 | 
			
		||||
    def __init__(self, *args, **kwargs):
 | 
			
		||||
        super().__init__(*args, **kwargs)
 | 
			
		||||
        self.fields["question"].widget.attrs.update({"placeholder": _("How did you get the idea to ...?")})
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = Question
 | 
			
		||||
        fields = ('question',)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PhaseForm(forms.ModelForm):
 | 
			
		||||
    """
 | 
			
		||||
    Form to update the calendar of a phase.
 | 
			
		||||
 
 | 
			
		||||
@@ -114,7 +114,9 @@
 | 
			
		||||
                        </div>
 | 
			
		||||
 | 
			
		||||
                        {% if user.registration.participates %}
 | 
			
		||||
                            <button class="btn btn-success"><i class="fas fa-plus-circle"></i> {% trans "Add a question" %}</button>
 | 
			
		||||
                            <button class="btn btn-success" data-toggle="modal" data-target="#addQuestionModal">
 | 
			
		||||
                                <i class="fas fa-plus-circle"></i> {% trans "Add a question" %}
 | 
			
		||||
                            </button>
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
                    {% elif current_phase.phase_number == 3 %}
 | 
			
		||||
                        <div class="alert alert-info">
 | 
			
		||||
@@ -164,23 +166,40 @@
 | 
			
		||||
        {% include "base_modal.html" with modal_id="displaySolution" modal_action="" modal_button="" modal_additional_class="modal-lg" modal_content=participation.received_participation.solution.as_iframe|default:unsupported_platform %}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
 | 
			
		||||
{% if user.registration.participates and current_phase.phase_number == 2 %}
 | 
			
		||||
    {% trans "Add question" as modal_title %}
 | 
			
		||||
    {% trans "Add" as modal_button %}
 | 
			
		||||
    {% url "participation:add_question" pk=participation.pk as modal_action %}
 | 
			
		||||
{% include "base_modal.html" with modal_id="addQuestion" modal_button_type="success" %}
 | 
			
		||||
{% endif %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block extrajavascript %}
 | 
			
		||||
    <script>
 | 
			
		||||
        $(document).ready(function() {
 | 
			
		||||
            {% if user.registration.is_admin %}
 | 
			
		||||
            $('button[data-target="#defineReceivedParticipationModal"]').click(function() {
 | 
			
		||||
                let modalBody = $("#defineReceivedParticipationModal div.modal-body");
 | 
			
		||||
                if (!modalBody.html().trim())
 | 
			
		||||
                    modalBody.load("{% url "participation:participation_receive_participation" pk=participation.pk %} #form-content");
 | 
			
		||||
            });
 | 
			
		||||
            $('button[data-target="#defineSentParticipationModal"]').click(function() {
 | 
			
		||||
                let modalBody = $("#defineSentParticipationModal div.modal-body");
 | 
			
		||||
                if (!modalBody.html().trim())
 | 
			
		||||
                    modalBody.load("{% url "participation:participation_send_participation" pk=participation.pk %} #form-content");
 | 
			
		||||
            });
 | 
			
		||||
                $('button[data-target="#defineReceivedParticipationModal"]').click(function() {
 | 
			
		||||
                    let modalBody = $("#defineReceivedParticipationModal div.modal-body");
 | 
			
		||||
                    if (!modalBody.html().trim())
 | 
			
		||||
                        modalBody.load("{% url "participation:participation_receive_participation" pk=participation.pk %} #form-content");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                $('button[data-target="#defineSentParticipationModal"]').click(function() {
 | 
			
		||||
                    let modalBody = $("#defineSentParticipationModal div.modal-body");
 | 
			
		||||
                    if (!modalBody.html().trim())
 | 
			
		||||
                        modalBody.load("{% url "participation:participation_send_participation" pk=participation.pk %} #form-content");
 | 
			
		||||
                });
 | 
			
		||||
            {% endif %}
 | 
			
		||||
 | 
			
		||||
            {% if user.registration.participates and current_phase.phase_number == 2 %}
 | 
			
		||||
                $('button[data-target="#addQuestionModal"]').click(function() {
 | 
			
		||||
                    let modalBody = $("#addQuestionModal div.modal-body");
 | 
			
		||||
                    if (!modalBody.html().trim())
 | 
			
		||||
                        modalBody.load("{% url "participation:add_question" pk=participation.pk %} #form-content");
 | 
			
		||||
                });
 | 
			
		||||
            {% endif %}
 | 
			
		||||
 | 
			
		||||
            $('button[data-target="#uploadSolutionModal"]').click(function() {
 | 
			
		||||
                let modalBody = $("#uploadSolutionModal div.modal-body");
 | 
			
		||||
                if (!modalBody.html().trim())
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% load crispy_forms_filters i18n %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    <form method="post">
 | 
			
		||||
        <div id="form-content">
 | 
			
		||||
            {% csrf_token %}
 | 
			
		||||
            {{ form|crispy }}
 | 
			
		||||
        </div>
 | 
			
		||||
        <button class="btn btn-primary" type="submit">{% trans "Send" %}</button>
 | 
			
		||||
    </form>
 | 
			
		||||
{% endblock content %}
 | 
			
		||||
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
from django.urls import path
 | 
			
		||||
from django.views.generic import TemplateView
 | 
			
		||||
 | 
			
		||||
from .views import CalendarView, CreateTeamView, JoinTeamView, MyParticipationDetailView, MyTeamDetailView, \
 | 
			
		||||
    ParticipationDetailView, PhaseUpdateView, SetParticipationReceiveParticipationView, \
 | 
			
		||||
from .views import CalendarView, CreateQuestionView, CreateTeamView, JoinTeamView, MyParticipationDetailView, \
 | 
			
		||||
    MyTeamDetailView, ParticipationDetailView, PhaseUpdateView, SetParticipationReceiveParticipationView, \
 | 
			
		||||
    SetParticipationSendParticipationView, TeamAuthorizationsView, TeamDetailView, TeamLeaveView, TeamUpdateView, \
 | 
			
		||||
    UploadVideoView
 | 
			
		||||
    UpdateQuestionView, UploadVideoView
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
app_name = "participation"
 | 
			
		||||
@@ -24,6 +24,8 @@ urlpatterns = [
 | 
			
		||||
         name="participation_receive_participation"),
 | 
			
		||||
    path("detail/<int:pk>/send-participation/", SetParticipationSendParticipationView.as_view(),
 | 
			
		||||
         name="participation_send_participation"),
 | 
			
		||||
    path("detail/<int:pk>/add-question/", CreateQuestionView.as_view(), name="add_question"),
 | 
			
		||||
    path("update-question/<int:pk>/", CreateQuestionView.as_view(), name="update_question"),
 | 
			
		||||
    path("calendar/", CalendarView.as_view(), name="calendar"),
 | 
			
		||||
    path("calendar/<int:pk>/", PhaseUpdateView.as_view(), name="update_phase"),
 | 
			
		||||
    path("chat/", TemplateView.as_view(template_name="participation/chat.html"), name="chat")
 | 
			
		||||
 
 | 
			
		||||
@@ -20,9 +20,10 @@ from django_tables2 import SingleTableView
 | 
			
		||||
from magic import Magic
 | 
			
		||||
from registration.models import AdminRegistration
 | 
			
		||||
 | 
			
		||||
from .forms import JoinTeamForm, ParticipationForm, PhaseForm, ReceiveParticipationForm, RequestValidationForm, \
 | 
			
		||||
    SendParticipationForm, TeamForm, UploadVideoForm, ValidateParticipationForm
 | 
			
		||||
from .models import Participation, Phase, Team, Video
 | 
			
		||||
from .forms import JoinTeamForm, ParticipationForm, PhaseForm, QuestionForm, \
 | 
			
		||||
    ReceiveParticipationForm, RequestValidationForm, SendParticipationForm, TeamForm, \
 | 
			
		||||
    UploadVideoForm, ValidateParticipationForm
 | 
			
		||||
from .models import Participation, Phase, Question, Team, Video
 | 
			
		||||
from .tables import CalendarTable
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -382,6 +383,53 @@ class SetParticipationSendParticipationView(AdminMixin, UpdateView):
 | 
			
		||||
        return reverse_lazy("participation:participation_detail", args=(self.object.pk,))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CreateQuestionView(LoginRequiredMixin, CreateView):
 | 
			
		||||
    """
 | 
			
		||||
    Ask a question to another team.
 | 
			
		||||
    """
 | 
			
		||||
    participation: Participation
 | 
			
		||||
    model = Question
 | 
			
		||||
    form_class = QuestionForm
 | 
			
		||||
 | 
			
		||||
    def dispatch(self, request, *args, **kwargs):
 | 
			
		||||
        if not request.user.is_authenticated:
 | 
			
		||||
            return self.handle_no_permission()
 | 
			
		||||
        self.participation = Participation.objects.get(pk=kwargs["pk"])
 | 
			
		||||
        if request.user.registration.is_admin or \
 | 
			
		||||
                request.user.registration.participates and \
 | 
			
		||||
                request.user.registration.team.pk == self.participation.team_id:
 | 
			
		||||
            return super().dispatch(request, *args, **kwargs)
 | 
			
		||||
        raise PermissionDenied
 | 
			
		||||
 | 
			
		||||
    def form_valid(self, form):
 | 
			
		||||
        form.instance.participation = self.participation
 | 
			
		||||
        return super().form_valid(form)
 | 
			
		||||
 | 
			
		||||
    def get_success_url(self):
 | 
			
		||||
        return reverse_lazy("participation:participation_detail", args=(self.participation.pk,))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UpdateQuestionView(LoginRequiredMixin, UpdateView):
 | 
			
		||||
    """
 | 
			
		||||
    Edit a question.
 | 
			
		||||
    """
 | 
			
		||||
    model = Question
 | 
			
		||||
    form_class = QuestionForm
 | 
			
		||||
 | 
			
		||||
    def dispatch(self, request, *args, **kwargs):
 | 
			
		||||
        self.object = self.get_object(**kwargs)
 | 
			
		||||
        if not request.user.is_authenticated:
 | 
			
		||||
            return self.handle_no_permission()
 | 
			
		||||
        if request.user.registration.is_admin or \
 | 
			
		||||
                request.user.registration.participates and \
 | 
			
		||||
                request.user.registration.team.pk == self.object.participation.team_id:
 | 
			
		||||
            return super().dispatch(request, *args, **kwargs)
 | 
			
		||||
        raise PermissionDenied
 | 
			
		||||
 | 
			
		||||
    def get_success_url(self):
 | 
			
		||||
        return reverse_lazy("participation:participation_detail", args=(self.object.participation.pk,))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UploadVideoView(LoginRequiredMixin, UpdateView):
 | 
			
		||||
    """
 | 
			
		||||
    Upload a solution video for a team.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user