mirror of
https://github.com/pretix/pretix.git
synced 2026-07-28 08:45:08 +00:00
Move comment form
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
{% endif %}
|
||||
{% compress js %}
|
||||
<script type="text/javascript" src="{% static "jquery/js/jquery-3.6.4.min.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "htmx/htmx-2.0.10.min.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "js/jquery.formset.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "typeahead/typeahead.bundle.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "bootstrap/js/bootstrap.js" %}"></script>
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
{% load i18n %}
|
||||
{% load icon %}
|
||||
<div id="comment-form">
|
||||
<strong>{% trans "Comment" %}:</strong>
|
||||
{% if "event.settings.general:write" in request.eventpermset %}
|
||||
<button type="button" class="btn btn-default btn-xs"
|
||||
hx-get="{% url "control:event.index.comment" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
hx-target="#comment-form">
|
||||
{% icon "edit" %}
|
||||
</button>
|
||||
{% endif %}
|
||||
{% if request.event.comment %}
|
||||
<p>
|
||||
{{ request.event.comment|linebreaksbr }}
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
@@ -0,0 +1,16 @@
|
||||
{% load i18n %}
|
||||
{% load bootstrap3 %}
|
||||
<form class="form" method="post"
|
||||
hx-post="{% url "control:event.index.comment" event=request.event.slug organizer=request.event.organizer.slug %}">
|
||||
{% csrf_token %}
|
||||
<div>
|
||||
<p>
|
||||
{% bootstrap_field form.comment layout="inline" show_help=True show_label=False horizontal_field_class="col-md-12" %}
|
||||
</p>
|
||||
<p class="text-right flip">
|
||||
<button class="btn btn-default">
|
||||
{% trans "Update comment" %}
|
||||
</button>
|
||||
</p>
|
||||
</div>
|
||||
</form>
|
||||
@@ -4,9 +4,10 @@
|
||||
{% load bootstrap3 %}
|
||||
{% load static %}
|
||||
{% load eventsignal %}
|
||||
{% load icon %}
|
||||
{% block title %}{{ request.event.name }}{% endblock %}
|
||||
{% block content %}
|
||||
<h1>
|
||||
<h1 class="event-dashboard-header">
|
||||
{{ request.event.name }}
|
||||
<small>
|
||||
{% if request.event.has_subevents %}
|
||||
@@ -14,11 +15,43 @@
|
||||
{% else %}
|
||||
{{ request.event.get_date_range_display }}
|
||||
{% endif %}
|
||||
<span id="warnings_loading" class="fa fa-cog fa-spin"></span>
|
||||
<span id="warnings_indicator" class="htmx-indicator">{% icon "cog fa-spin" %}</span>
|
||||
</small>
|
||||
<div class="pull-right flip">
|
||||
<a href="{% url "control:event.live" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
data-toggle="tooltip"
|
||||
title="{% trans "Click to change shop status" %}">
|
||||
{% icon "pencil" %}</a>
|
||||
<a href="{% url "control:event.live" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
data-toggle="tooltip"
|
||||
title="{% trans "Click to change shop status" %}">
|
||||
{% if request.event.live and request.event.testmode %}
|
||||
<span class="label label-warning">
|
||||
<span class="fa fa-warning"></span>
|
||||
{% trans "public test mode" %}
|
||||
</span>
|
||||
{% elif request.event.live %}
|
||||
<span class="label label-success">
|
||||
<span class="fa fa-check"></span>
|
||||
{% trans "live" %}
|
||||
</span>
|
||||
{% elif request.event.testmode %}
|
||||
<span class="label label-warning">
|
||||
<span class="fa fa-power-off"></span>
|
||||
{% trans "private test mode" %}
|
||||
</span>
|
||||
{% else %}
|
||||
<span class="label label-danger">
|
||||
<span class="fa fa-power-off"></span>
|
||||
{% trans "offline" %}
|
||||
</span>
|
||||
{% endif %}
|
||||
</a>
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</h1>
|
||||
<div class="helper-space-below">
|
||||
{% trans "Shop URL:" %}
|
||||
<strong>{% trans "Shop URL:" %}</strong>
|
||||
<span id="shop_url" class="text-muted">{% abseventurl request.event "presale:event.index" %}</span>
|
||||
<button type="button" class="btn btn-default btn-xs btn-clipboard js-only" data-clipboard-target="#shop_url">
|
||||
<i class="fa fa-clipboard" aria-hidden="true"></i>
|
||||
@@ -31,16 +64,18 @@
|
||||
{% include "pretixcontrol/event/fragment_qr_dropdown.html" with url=0 %}
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
{% include "pretixcontrol/event/dashboard_partial_comment.html" with url=0 %}
|
||||
</div>
|
||||
|
||||
|
||||
<div hx-get="{% url "control:event.index.warnings" organizer=request.organizer.slug event=request.event.slug %}"
|
||||
hx-indicator="#warnings_indicator"
|
||||
hx-trigger="load"></div>
|
||||
|
||||
<div id="warnings_target"></div>
|
||||
{% eventsignal request.event "pretix.control.signals.event_dashboard_top" request=request %}
|
||||
|
||||
{% if request.event.has_subevents %}
|
||||
<form class="form-inline helper-display-inline" action="" method="get">
|
||||
{% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
|
||||
</form>
|
||||
{% endif %}
|
||||
{% if not request.event.has_subevents or subevent %}
|
||||
{% if not request.event.has_subevents %}
|
||||
{% include "pretixcontrol/event/fragment_timeline.html" %}
|
||||
{% endif %}
|
||||
{% if widgets_override %}
|
||||
@@ -81,30 +116,6 @@
|
||||
{% endif %}
|
||||
|
||||
<p> </p>
|
||||
<div class="panel panel-default items">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
{% trans "Internal comment" %}
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<form class="form" method="post"
|
||||
action="{% url "control:event.comment" event=request.event.slug organizer=request.event.organizer.slug %}">
|
||||
{% csrf_token %}
|
||||
<div class="row">
|
||||
{% bootstrap_field comment_form.comment layout="horizontal" show_help=True show_label=False horizontal_field_class="col-md-12" %}
|
||||
</div>
|
||||
{% if not comment_form.readonly %}
|
||||
<p class="text-right flip">
|
||||
<br>
|
||||
<button class="btn btn-default">
|
||||
{% trans "Update comment" %}
|
||||
</button>
|
||||
</p>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% if "event.orders:read" in request.eventpermset or "event.orders:write" in request.eventpermset or "event.settings.general:write" in request.eventpermset or "event.items:write" in request.eventpermset %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
@@ -112,7 +123,7 @@
|
||||
{% trans "Event logs" %}
|
||||
</h3>
|
||||
</div>
|
||||
<ul class="list-group" id="logs_target">
|
||||
<ul class="list-group" hx-get="{% url "control:event.index.logs" organizer=request.organizer.slug event=request.event.slug %}" hx-trigger="load">
|
||||
<div class="logs-lazy-loading">
|
||||
<span class="fa fa-cog fa-4x"></span>
|
||||
</div>
|
||||
|
||||
@@ -275,12 +275,11 @@ urlpatterns = [
|
||||
re_path(r'^widgets.json$', dashboards.event_index_widgets_lazy, name='event.index.widgets'),
|
||||
re_path(r'^dashboard/partials/logs$', dashboards.event_index_log_lazy, name='event.index.logs'),
|
||||
re_path(r'^dashboard/partials/warnings$', dashboards.event_index_warnings_lazy, name='event.index.warnings'),
|
||||
re_path(r'^dashboard/partials/comment$', event.EventComment.as_view(), name='event.index.comment'),
|
||||
re_path(r'^live/$', event.EventLive.as_view(), name='event.live'),
|
||||
re_path(r'^transfer_session/$', event.EventTransferSession.as_view(), name='event.transfer_session'),
|
||||
re_path(r'^logs/$', event.EventLog.as_view(), name='event.log'),
|
||||
re_path(r'^delete/$', event.EventDelete.as_view(), name='event.delete'),
|
||||
re_path(r'^comment/$', event.EventComment.as_view(),
|
||||
name='event.comment'),
|
||||
re_path(r'^quickstart/$', event.QuickSetupView.as_view(), name='event.quick'),
|
||||
re_path(r'^settings/$', event.EventUpdate.as_view(), name='event.settings'),
|
||||
re_path(r'^settings/plugins$', event.EventPlugins.as_view(), name='event.settings.plugins'),
|
||||
|
||||
@@ -270,37 +270,6 @@ def quota_widgets(sender, subevent=None, lazy=False, **kwargs):
|
||||
return widgets
|
||||
|
||||
|
||||
@receiver(signal=event_dashboard_widgets)
|
||||
def shop_state_widget(sender, **kwargs):
|
||||
return [{
|
||||
'display_size': 'small',
|
||||
'priority': 1000,
|
||||
'content': format_html(
|
||||
'<div class="shopstate">{t1}<br><span class="{cls}"><span class="fa {icon}"></span> {state}</span>{t2}</div>',
|
||||
t1=_('Your ticket shop is'), t2=_('Click here to change'),
|
||||
state=_('live') if sender.live and not sender.testmode else (
|
||||
_('live and in test mode') if sender.live else (
|
||||
_('not yet public') if not sender.testmode else (
|
||||
_('in private test mode')
|
||||
)
|
||||
)
|
||||
),
|
||||
icon='fa-check-circle' if sender.live and not sender.testmode else (
|
||||
'fa-warning' if sender.live else (
|
||||
'fa-times-circle' if not sender.testmode else (
|
||||
'fa-times-circle'
|
||||
)
|
||||
)
|
||||
),
|
||||
cls='live' if sender.live else 'off'
|
||||
),
|
||||
'url': reverse('control:event.live', kwargs={
|
||||
'event': sender.slug,
|
||||
'organizer': sender.organizer.slug
|
||||
})
|
||||
}]
|
||||
|
||||
|
||||
@receiver(signal=event_dashboard_widgets)
|
||||
def checkin_widget(sender, subevent=None, lazy=False, **kwargs):
|
||||
widgets = []
|
||||
@@ -356,8 +325,6 @@ def build_json_response(widgets):
|
||||
|
||||
|
||||
def event_index(request, organizer, event):
|
||||
from pretix.control.forms.event import CommentForm
|
||||
|
||||
subevent = None
|
||||
if request.GET.get("subevent", "") != "" and request.event.has_subevents:
|
||||
i = request.GET.get("subevent", "")
|
||||
@@ -368,8 +335,6 @@ def event_index(request, organizer, event):
|
||||
|
||||
can_view_orders = request.user.has_event_permission(request.organizer, request.event, 'event.orders:read',
|
||||
request=request)
|
||||
can_change_event_settings = request.user.has_event_permission(request.organizer, request.event,
|
||||
'event.settings.general:write', request=request)
|
||||
|
||||
widgets = []
|
||||
widgets_override = ''
|
||||
@@ -387,17 +352,17 @@ def event_index(request, organizer, event):
|
||||
'widgets': rearrange(widgets),
|
||||
'widgets_override': widgets_override,
|
||||
'subevent': subevent,
|
||||
'comment_form': CommentForm(initial={'comment': request.event.comment}, readonly=not can_change_event_settings),
|
||||
}
|
||||
|
||||
ctx['timeline'] = [
|
||||
{
|
||||
'date': t.datetime.astimezone(request.event.timezone).date(),
|
||||
'entry': t,
|
||||
'time': t.datetime.astimezone(request.event.timezone)
|
||||
}
|
||||
for t in timeline_for_event(request.event, subevent)
|
||||
]
|
||||
if not request.event.has_subevents:
|
||||
ctx['timeline'] = [
|
||||
{
|
||||
'date': t.datetime.astimezone(request.event.timezone).date(),
|
||||
'entry': t,
|
||||
'time': t.datetime.astimezone(request.event.timezone)
|
||||
}
|
||||
for t in timeline_for_event(request.event, None)
|
||||
]
|
||||
ctx['today'] = now().astimezone(request.event.timezone).date()
|
||||
ctx['nearly_now'] = now().astimezone(request.event.timezone) - timedelta(seconds=20)
|
||||
resp = render(request, 'pretixcontrol/event/index.html', ctx)
|
||||
|
||||
@@ -57,10 +57,9 @@ from django.db import transaction
|
||||
from django.db.models import Count, ProtectedError
|
||||
from django.forms import inlineformset_factory
|
||||
from django.http import (
|
||||
Http404, HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed,
|
||||
JsonResponse,
|
||||
Http404, HttpResponse, HttpResponseBadRequest, JsonResponse,
|
||||
)
|
||||
from django.shortcuts import redirect
|
||||
from django.shortcuts import redirect, render
|
||||
from django.urls import NoReverseMatch, reverse
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.html import conditional_escape, format_html
|
||||
@@ -1299,24 +1298,23 @@ class EventLog(EventPermissionRequiredMixin, PaginationMixin, ListView):
|
||||
return LogFilterForm(data=self.request.GET, organizer=self.request.organizer)
|
||||
|
||||
|
||||
class EventComment(EventPermissionRequiredMixin, View):
|
||||
class EventComment(EventPermissionRequiredMixin, UpdateView):
|
||||
permission = 'event.settings.general:write'
|
||||
form_class = CommentForm
|
||||
template_name = 'pretixcontrol/event/dashboard_partial_comment_form.html'
|
||||
|
||||
def post(self, *args, **kwargs):
|
||||
form = CommentForm(self.request.POST)
|
||||
if form.is_valid():
|
||||
self.request.event.comment = form.cleaned_data.get('comment')
|
||||
self.request.event.save()
|
||||
self.request.event.log_action('pretix.event.comment', user=self.request.user, data={
|
||||
'new_comment': form.cleaned_data.get('comment')
|
||||
})
|
||||
messages.success(self.request, _('The comment has been updated.'))
|
||||
else:
|
||||
messages.error(self.request, _('Could not update the comment.'))
|
||||
return redirect(self.get_success_url())
|
||||
def get_object(self, queryset=None):
|
||||
return self.request.event
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
return HttpResponseNotAllowed(['POST'])
|
||||
def form_valid(self, form):
|
||||
form.save()
|
||||
self.request.event.log_action('pretix.event.comment', user=self.request.user, data={
|
||||
'new_comment': form.cleaned_data.get('comment')
|
||||
})
|
||||
return render(
|
||||
self.request,
|
||||
'pretixcontrol/event/dashboard_partial_comment.html',
|
||||
)
|
||||
|
||||
def get_success_url(self) -> str:
|
||||
return reverse('control:event.index', kwargs={
|
||||
|
||||
+1
File diff suppressed because one or more lines are too long
@@ -15,12 +15,4 @@ $(function () {
|
||||
if ($("#logs_target").length == 0) {
|
||||
return;
|
||||
}
|
||||
$.get("dashboard/partials/logs", function (data) {
|
||||
$("#logs_target").html(data)
|
||||
add_log_expand_handlers($("#logs_target"))
|
||||
});
|
||||
$.get("dashboard/partials/warnings", function (data) {
|
||||
$("#warnings_loading").remove()
|
||||
$("#warnings_target").html(data)
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
.event-dashboard-header {
|
||||
margin-bottom: 10px;
|
||||
|
||||
.pull-right a .fa-pencil {
|
||||
color: $text-muted;
|
||||
font-size: 0.7em;
|
||||
&:hover {
|
||||
color: $link-hover-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dashboard {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
@@ -898,6 +898,18 @@ tbody th {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.htmx-indicator {
|
||||
opacity:0;
|
||||
visibility: hidden
|
||||
}
|
||||
.htmx-request .htmx-indicator,
|
||||
.htmx-request.htmx-indicator {
|
||||
opacity:1;
|
||||
visibility: visible;
|
||||
transition: opacity 200ms ease-in
|
||||
}
|
||||
|
||||
|
||||
@import "../../pretixbase/scss/_rtl.scss";
|
||||
@import "../../bootstrap/scss/_rtl.scss";
|
||||
@import "_rtl.scss";
|
||||
|
||||
Reference in New Issue
Block a user