mirror of
https://github.com/pretix/pretix.git
synced 2025-12-27 17:42:27 +00:00
Compare commits
11 Commits
v4.12.0
...
fix-pdf-ed
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bbca2f6c40 | ||
|
|
6c0f19a1f6 | ||
|
|
37454dd84e | ||
|
|
9bba61a495 | ||
|
|
4cd4b94a4b | ||
|
|
6c7f5f4888 | ||
|
|
c13d873f1f | ||
|
|
bddeb35520 | ||
|
|
9ce519bb0b | ||
|
|
1f9b0b842f | ||
|
|
69b482849a |
@@ -240,6 +240,9 @@ The following snippet is an example on how to configure a nginx proxy for pretix
|
||||
listen 80 default_server;
|
||||
listen [::]:80 ipv6only=on default_server;
|
||||
server_name pretix.mydomain.com;
|
||||
location / {
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
}
|
||||
server {
|
||||
listen 443 default_server;
|
||||
|
||||
@@ -225,6 +225,9 @@ The following snippet is an example on how to configure a nginx proxy for pretix
|
||||
listen 80 default_server;
|
||||
listen [::]:80 ipv6only=on default_server;
|
||||
server_name pretix.mydomain.com;
|
||||
location / {
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
}
|
||||
server {
|
||||
listen 443 default_server;
|
||||
|
||||
@@ -428,7 +428,7 @@ List of all orders
|
||||
``last_modified``, and ``status``. Default: ``datetime``
|
||||
:query string code: Only return orders that match the given order code
|
||||
:query string status: Only return orders in the given order status (see above)
|
||||
:query string search: Only return orders matching a given search query
|
||||
:query string search: Only return orders matching a given search query (matching for names, email addresses, and company names)
|
||||
:query integer item: Only return orders with a position that contains this item ID. *Warning:* Result will also include orders if they contain mixed items, and it will even return orders where the item is only contained in a canceled position.
|
||||
:query integer variation: Only return orders with a position that contains this variation ID. *Warning:* Result will also include orders if they contain mixed items and variations, and it will even return orders where the variation is only contained in a canceled position.
|
||||
:query boolean testmode: Only return orders with ``testmode`` set to ``true`` or ``false``
|
||||
|
||||
@@ -19,4 +19,4 @@
|
||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
__version__ = "4.12.0"
|
||||
__version__ = "4.13.0.dev0"
|
||||
|
||||
@@ -1344,22 +1344,36 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE
|
||||
def form_valid(self, form):
|
||||
self.save_meta()
|
||||
messages.success(self.request, _('Your changes have been saved.'))
|
||||
if form.has_changed() or any(f.has_changed() for f in self.plugin_forms):
|
||||
data = {
|
||||
k: form.cleaned_data.get(k)
|
||||
for k in form.changed_data
|
||||
}
|
||||
for f in self.plugin_forms:
|
||||
data.update({
|
||||
k: (f.cleaned_data.get(k).name
|
||||
if isinstance(f.cleaned_data.get(k), File)
|
||||
else f.cleaned_data.get(k))
|
||||
for k in f.changed_data
|
||||
})
|
||||
|
||||
change_data = {
|
||||
k: form.cleaned_data.get(k)
|
||||
for k in form.changed_data
|
||||
}
|
||||
for f in self.plugin_forms:
|
||||
change_data.update({
|
||||
k: (f.cleaned_data.get(k).name
|
||||
if isinstance(f.cleaned_data.get(k), File)
|
||||
else f.cleaned_data.get(k))
|
||||
for k in f.changed_data
|
||||
})
|
||||
|
||||
meta_changed = {}
|
||||
for f in self.meta_forms:
|
||||
meta_changed.update({
|
||||
k: (f.cleaned_data.get(k).name
|
||||
if isinstance(f.cleaned_data.get(k), File)
|
||||
else f.cleaned_data.get(k))
|
||||
for k in f.changed_data
|
||||
})
|
||||
if meta_changed:
|
||||
change_data['meta_data'] = meta_changed
|
||||
|
||||
if change_data:
|
||||
self.object.log_action(
|
||||
'pretix.event.item.changed', user=self.request.user, data=data
|
||||
'pretix.event.item.changed', user=self.request.user, data=change_data
|
||||
)
|
||||
invalidate_cache.apply_async(kwargs={'event': self.request.event.pk, 'item': self.object.pk})
|
||||
|
||||
for f in self.plugin_forms:
|
||||
f.save()
|
||||
|
||||
|
||||
@@ -1186,13 +1186,17 @@ class OrderTransition(OrderView):
|
||||
if ps == Decimal('0.00') and self.order.pending_sum <= Decimal('0.00'):
|
||||
p = self.order.payments.filter(state=OrderPayment.PAYMENT_STATE_CONFIRMED).last()
|
||||
if p:
|
||||
p._mark_order_paid(
|
||||
user=self.request.user,
|
||||
send_mail=self.mark_paid_form.cleaned_data['send_email'],
|
||||
force=self.mark_paid_form.cleaned_data.get('force', False),
|
||||
payment_refund_sum=self.order.payment_refund_sum,
|
||||
)
|
||||
messages.success(self.request, _('The order has been marked as paid.'))
|
||||
try:
|
||||
p._mark_order_paid(
|
||||
user=self.request.user,
|
||||
send_mail=self.mark_paid_form.cleaned_data['send_email'],
|
||||
force=self.mark_paid_form.cleaned_data.get('force', False),
|
||||
payment_refund_sum=self.order.payment_refund_sum,
|
||||
)
|
||||
except Quota.QuotaExceededException as e:
|
||||
messages.error(self.request, str(e))
|
||||
else:
|
||||
messages.success(self.request, _('The order has been marked as paid.'))
|
||||
return redirect(self.get_order_url())
|
||||
|
||||
try:
|
||||
|
||||
@@ -42,6 +42,7 @@ from django.db.models.signals import post_save
|
||||
from django.dispatch import receiver
|
||||
from django.urls import resolve, reverse
|
||||
from django.utils import timezone
|
||||
from django.utils.timezone import now
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django_scopes import scope, scopes_disabled
|
||||
|
||||
@@ -134,6 +135,7 @@ def sendmail_run_rules(sender, **kwargs):
|
||||
with scopes_disabled():
|
||||
mails = ScheduledMail.objects.all()
|
||||
|
||||
unchanged = []
|
||||
for m in mails.filter(Q(last_computed__isnull=True)
|
||||
| Q(subevent__last_modified__gt=F('last_computed'))
|
||||
| Q(event__last_modified__gt=F('last_computed'))):
|
||||
@@ -141,6 +143,17 @@ def sendmail_run_rules(sender, **kwargs):
|
||||
m.recompute()
|
||||
if m.computed_datetime != previous:
|
||||
m.save(update_fields=['last_computed', 'computed_datetime'])
|
||||
else:
|
||||
unchanged.append(m.pk)
|
||||
|
||||
if unchanged:
|
||||
# Theoretically, we don't need to write back the unchanged ones to the database… but that will cause us to
|
||||
# recompute them on every run until eternity. So we want to set their last_computed date to something more
|
||||
# recent... but not for all of them at once, in case it's millions, so we don't stress the database without
|
||||
# cause
|
||||
batch_size = max(connection.ops.bulk_batch_size(['id'], unchanged) - 2, 100)
|
||||
for i in range(max(1, 5000 // batch_size)):
|
||||
ScheduledMail.objects.filter(pk__in=unchanged[i * batch_size:batch_size]).update(last_computed=now())
|
||||
|
||||
mails.filter(
|
||||
state=ScheduledMail.STATE_SCHEDULED,
|
||||
|
||||
@@ -300,7 +300,6 @@ var editor = {
|
||||
|
||||
// Fetch the required page
|
||||
editor.pdf.getPage(page_number).then(function (page) {
|
||||
console.log('Page loaded');
|
||||
var canvas = document.getElementById('pdf-canvas');
|
||||
|
||||
var scale = editor.$cva.width() / page.getViewport(1.0).width;
|
||||
@@ -326,7 +325,6 @@ var editor = {
|
||||
editor.pdf_page_number = page_number
|
||||
editor._init_page_nav();
|
||||
|
||||
console.log('Page rendered');
|
||||
if (dump || !editor._fabric_loaded) {
|
||||
editor._init_fabric(dump);
|
||||
} else {
|
||||
@@ -349,7 +347,6 @@ var editor = {
|
||||
}
|
||||
$("#page_nav").append($li)
|
||||
$a.on("click", function (event) {
|
||||
console.log("switch to page", $(this).attr("data-page"));
|
||||
editor.fabric.deactivateAll();
|
||||
editor._load_page(parseInt($(this).attr("data-page")));
|
||||
event.preventDefault();
|
||||
@@ -369,7 +366,6 @@ var editor = {
|
||||
// Asynchronous download of PDF
|
||||
var loadingTask = PDFJS.getDocument(url);
|
||||
loadingTask.promise.then(function (pdf) {
|
||||
console.log('PDF loaded');
|
||||
|
||||
editor.pdf = pdf;
|
||||
editor.pdf_page_count = pdf.numPages;
|
||||
@@ -422,7 +418,6 @@ var editor = {
|
||||
}
|
||||
|
||||
editor._fabric_loaded = true;
|
||||
console.log("Fabric loaded");
|
||||
if (editor._window_loaded) {
|
||||
editor._ready();
|
||||
}
|
||||
@@ -430,7 +425,6 @@ var editor = {
|
||||
|
||||
_window_load_event: function () {
|
||||
editor._window_loaded = true;
|
||||
console.log("Window loaded");
|
||||
if (editor._fabric_loaded) {
|
||||
editor._ready();
|
||||
}
|
||||
@@ -520,7 +514,7 @@ var editor = {
|
||||
}
|
||||
},
|
||||
|
||||
_update_values_from_toolbox: function () {
|
||||
_update_values_from_toolbox: function (e) {
|
||||
var o = editor.fabric.getActiveObject();
|
||||
if (!o) {
|
||||
o = editor.fabric.getActiveGroup();
|
||||
@@ -553,8 +547,16 @@ var editor = {
|
||||
$("#toolbox-content-other-help").toggle($("#toolbox-content").val() === "other" || $("#toolbox-content").val() === "other_i18n");
|
||||
o.content = $("#toolbox-content").val();
|
||||
if ($("#toolbox-content").val() === "other") {
|
||||
if (e.target.id === "toolbox-content") {
|
||||
// user used dropdown to switch content-type, update value with value from i18n textarea
|
||||
$("#toolbox-content-other").val($("#toolbox-content-other-i18n textarea").val());
|
||||
}
|
||||
o.text = $("#toolbox-content-other").val();
|
||||
} else if ($("#toolbox-content").val() === "other_i18n") {
|
||||
if (e.target.id === "toolbox-content") {
|
||||
// user used dropdown to switch content-type, update value with value from "other" textarea
|
||||
$("#toolbox-content-other-i18n textarea").val($("#toolbox-content-other").val());
|
||||
}
|
||||
o.text_i18n = {}
|
||||
$("#toolbox-content-other-i18n textarea").each(function () {
|
||||
o.text_i18n[$(this).attr("lang")] = $(this).val();
|
||||
@@ -608,8 +610,16 @@ var editor = {
|
||||
$("#toolbox-content-other-help").toggle($("#toolbox-content").val() === "other" || $("#toolbox-content").val() === "other_i18n");
|
||||
o.content = $("#toolbox-content").val();
|
||||
if ($("#toolbox-content").val() === "other") {
|
||||
if (e.target.id === "toolbox-content") {
|
||||
// user used dropdown to switch content-type, update value with value from i18n textarea
|
||||
$("#toolbox-content-other").val($("#toolbox-content-other-i18n textarea").val());
|
||||
}
|
||||
o.setText($("#toolbox-content-other").val());
|
||||
} else if ($("#toolbox-content").val() === "other_i18n") {
|
||||
if (e.target.id === "toolbox-content") {
|
||||
// user used dropdown to switch content-type, update value with value from "other" textarea
|
||||
$("#toolbox-content-other-i18n textarea").val($("#toolbox-content-other").val());
|
||||
}
|
||||
o.text_i18n = {}
|
||||
$("#toolbox-content-other-i18n textarea").each(function () {
|
||||
o.text_i18n[$(this).attr("lang")] = $(this).val();
|
||||
@@ -620,6 +630,14 @@ var editor = {
|
||||
}
|
||||
}
|
||||
|
||||
// empty text-inputs if not in use
|
||||
if ($("#toolbox-content").val() !== "other") {
|
||||
$("#toolbox-content-other").val("");
|
||||
}
|
||||
if ($("#toolbox-content").val() !== "other_i18n") {
|
||||
$("#toolbox-content-other-i18n textarea").val("");
|
||||
}
|
||||
|
||||
o.setCoords();
|
||||
editor.fabric.renderAll();
|
||||
},
|
||||
@@ -1055,14 +1073,14 @@ var editor = {
|
||||
$("#toolbox label.btn").bind('click change', editor._update_values_from_toolbox);
|
||||
$("#toolbox select").bind('change', editor._update_values_from_toolbox);
|
||||
$("#toolbox select").bind('change', editor._create_savepoint);
|
||||
$("#toolbox button.toggling").bind('click change', function () {
|
||||
$("#toolbox button.toggling").bind('click change', function (e) {
|
||||
if ($(this).is(".option")) {
|
||||
$(this).addClass("active");
|
||||
$(this).parent().siblings().find("button").removeClass("active");
|
||||
} else {
|
||||
$(this).toggleClass("active");
|
||||
}
|
||||
editor._update_values_from_toolbox();
|
||||
editor._update_values_from_toolbox(e);
|
||||
editor._create_savepoint();
|
||||
});
|
||||
$("#toolbox .colorpickerfield").bind('changeColor', editor._update_values_from_toolbox);
|
||||
|
||||
Reference in New Issue
Block a user