diff --git a/src/pretalx/orga/forms/cfp.py b/src/pretalx/orga/forms/cfp.py
index 88e79bb0fc..c7e136dee8 100644
--- a/src/pretalx/orga/forms/cfp.py
+++ b/src/pretalx/orga/forms/cfp.py
@@ -87,16 +87,24 @@ def __init__(self, *args, obj, **kwargs):
self.fields[field_name].widget.attrs["placeholder"] = ""
for attribute in self.request_require_fields:
field_name = f"cfp_ask_{attribute}"
+ visibility = obj.cfp.fields.get(attribute, default_fields()[attribute])["visibility"]
+ if visibility == "optional":
+ css_class = "btn btn-outline-dark btn-sm"
+ elif visibility == "required":
+ css_class = "btn btn-outline-success btn-sm"
+ else:
+ css_class = "btn btn-outline-danger btn-sm"
self.fields[field_name] = forms.ChoiceField(
required=True,
initial=obj.cfp.fields.get(attribute, default_fields()[attribute])[
"visibility"
],
choices=[
- ("do_not_ask", _("Do not ask")),
- ("optional", _("Ask, but do not require input")),
- ("required", _("Ask and require input")),
+ ("do_not_ask", _("Not Active")),
+ ("optional", _("Optional")),
+ ("required", _("Required")),
],
+ widget=forms.Select(attrs={'class': css_class}),
)
if not obj.is_multilingual:
self.fields.pop("cfp_ask_content_locale", None)
diff --git a/src/pretalx/orga/templates/orga/cfp/question_view.html b/src/pretalx/orga/templates/orga/cfp/question_view.html
index b8d0a2ff4e..6b761d8f4f 100644
--- a/src/pretalx/orga/templates/orga/cfp/question_view.html
+++ b/src/pretalx/orga/templates/orga/cfp/question_view.html
@@ -29,9 +29,10 @@
| {% translate "Question" %} |
{% translate "Target" %} |
- {% translate "required" %} |
- {% translate "active" %} |
- {% translate "Answers" %} |
+ {% translate "Required" %} |
+ {% translate "Active" %} |
+ {% translate "Public" %} |
+ {% translate "Answers" %} |
|
@@ -47,17 +48,58 @@
{{ question.get_target_display }}
-
-
- {% if question.question_required == "require after" or question.freeze_after%}
-
- {% endif %}
+
|
-
-
+
+ {% if question.active %}
+
+ {% else %}
+
+ {% endif %}
+
+ |
+
+ {% if question.answer_count == 0%}
+
+ {% if question.is_public == True %}
+
+ {% else %}
+
+ {% endif %}
+
+ {% else %}
+ {% if question.is_public == True %}
+
+ {% else %}
+
+ {% endif %}
+ {% endif %}
|
-
+ |
{{ question.answer_count }}
|
diff --git a/src/pretalx/orga/urls.py b/src/pretalx/orga/urls.py
index e225a74f8b..2e0a78c240 100644
--- a/src/pretalx/orga/urls.py
+++ b/src/pretalx/orga/urls.py
@@ -170,6 +170,21 @@
cfp.CfPQuestionToggle.as_view(),
name="cfp.question.toggle",
),
+ path(
+ "active",
+ cfp.CfPQuestionActive.as_view(),
+ name="cfp.question.active",
+ ),
+ path(
+ "required",
+ cfp.CfPQuestionRequired.as_view(),
+ name="cfp.question.required",
+ ),
+ path(
+ "public",
+ cfp.CfPQuestionPublic.as_view(),
+ name="cfp.question.public",
+ ),
]
),
),
diff --git a/src/pretalx/orga/views/cfp.py b/src/pretalx/orga/views/cfp.py
index d90e6e432b..0efe3c5475 100644
--- a/src/pretalx/orga/views/cfp.py
+++ b/src/pretalx/orga/views/cfp.py
@@ -357,6 +357,68 @@ def dispatch(self, request, *args, **kwargs):
return redirect(question.urls.base)
+class CfPQuestionActive(PermissionRequired, View):
+ permission_required = "orga.edit_question"
+
+ def get_object(self) -> Question:
+ return Question.all_objects.filter(
+ pk=self.kwargs.get("pk")
+ ).first()
+
+ def dispatch(self, request, *args, **kwargs):
+ question = self.get_object()
+ question.active = not question.active
+ question.save(update_fields=["active"])
+ return redirect(question.urls.list)
+
+
+class CfPQuestionRequired(PermissionRequired, View):
+ permission_required = "orga.edit_question"
+
+ def get_object(self) -> Question:
+ return Question.all_objects.filter(
+ pk=self.kwargs.get("pk")
+ ).first()
+
+ def dispatch(self, request, *args, **kwargs):
+ question = self.get_object()
+
+ current_value = question.question_required
+
+ if current_value == "optional":
+ question.question_required = "required"
+ elif current_value == "required":
+ question.question_required = "after_deadline"
+ return redirect(question.urls.edit)
+ else:
+ question.question_required = "optional"
+
+ question.save(update_fields=["question_required"])
+ return redirect(question.urls.list)
+
+
+class CfPQuestionPublic(PermissionRequired, View):
+ permission_required = "orga.edit_question"
+
+ def get_object(self) -> Question:
+ return Question.all_objects.filter(
+ pk=self.kwargs.get("pk")
+ ).first()
+
+ def dispatch(self, request, *args, **kwargs):
+ question = self.get_object()
+
+ current_value = question.is_public
+
+ if current_value is True:
+ question.is_public = False
+ else:
+ question.is_public = True
+
+ question.save(update_fields=["is_public"])
+ return redirect(question.urls.list)
+
+
class CfPQuestionRemind(EventPermissionRequired, TemplateView):
template_name = "orga/cfp/question_remind.html"
permission_required = "orga.view_question"
diff --git a/src/pretalx/submission/models/question.py b/src/pretalx/submission/models/question.py
index 3e46e65ba2..607d13d7d6 100644
--- a/src/pretalx/submission/models/question.py
+++ b/src/pretalx/submission/models/question.py
@@ -272,11 +272,15 @@ def read_only(self):
class urls(EventUrls):
base = "{self.event.cfp.urls.questions}{self.pk}/"
+ list = "{self.event.cfp.urls.questions}"
edit = "{base}edit"
up = "{base}up"
down = "{base}down"
delete = "{base}delete"
toggle = "{base}toggle"
+ active = "{base}active"
+ required = "{base}required"
+ public = "{base}public"
def __str__(self):
return str(self.question)
|