From 4e7d539b323374217fd16d016692d350ab7d5a50 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sun, 30 Mar 2025 16:32:34 +0200 Subject: [PATCH] Support for CheckResult.locale and check(useOrderLocale) --- .../java/eu/pretix/libpretixsync/api/PretixApi.kt | 12 +++++++----- .../java/eu/pretix/libpretixsync/api/ProxyApi.kt | 1 + .../pretix/libpretixsync/check/AsyncCheckProvider.kt | 2 ++ .../libpretixsync/check/OnlineCheckProvider.kt | 7 ++++++- .../pretix/libpretixsync/check/ProxyCheckProvider.kt | 4 +++- .../libpretixsync/check/TicketCheckProvider.kt | 3 ++- .../java/eu/pretix/libpretixsync/models/Order.kt | 1 + .../pretix/libpretixsync/models/db/OrderExensions.kt | 10 ++++++++++ .../eu/pretix/libpretixsync/sync/SyncManager.java | 4 ++-- .../pretixscan/scanproxy/tests/test/FakePretixApi.kt | 6 ++++-- 10 files changed, 38 insertions(+), 12 deletions(-) diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/PretixApi.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/PretixApi.kt index 66715694..b41f6623 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/PretixApi.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/PretixApi.kt @@ -43,16 +43,16 @@ open class PretixApi(url: String, key: String, orgaSlug: String, version: Int, h inner class ApiResponse(val data: JSONObject?, val response: Response) @Throws(ApiException::class, JSONException::class) - fun redeem(eventSlug: String, secret: String, datetime: Date?, force: Boolean, nonce: String?, answers: List?, listId: Long, ignore_unpaid: Boolean, pdf_data: Boolean, type: String?, source_type: String?, callTimeout: Long? = null, questions_supported: Boolean = true): ApiResponse { + fun redeem(eventSlug: String, secret: String, datetime: Date?, force: Boolean, nonce: String?, answers: List?, listId: Long, ignore_unpaid: Boolean, pdf_data: Boolean, type: String?, source_type: String?, callTimeout: Long? = null, questions_supported: Boolean = true, use_order_locale: Boolean = false): ApiResponse { var dt: String? = null if (datetime != null) { dt = QueuedCheckIn.formatDatetime(datetime) } - return redeem(eventSlug, secret, dt, force, nonce, answers, listId, ignore_unpaid, pdf_data, type, source_type, callTimeout, questions_supported) + return redeem(eventSlug, secret, dt, force, nonce, answers, listId, ignore_unpaid, pdf_data, type, source_type, callTimeout, questions_supported, use_order_locale) } @Throws(ApiException::class, JSONException::class) - open fun redeem(eventSlug: String, secret: String, datetime: String?, force: Boolean, nonce: String?, answers: List?, listId: Long, ignore_unpaid: Boolean, pdf_data: Boolean, type: String?, source_type: String?, callTimeout: Long? = null, questions_supported: Boolean=true): ApiResponse { + open fun redeem(eventSlug: String, secret: String, datetime: String?, force: Boolean, nonce: String?, answers: List?, listId: Long, ignore_unpaid: Boolean, pdf_data: Boolean, type: String?, source_type: String?, callTimeout: Long? = null, questions_supported: Boolean = true, use_order_locale: Boolean = false): ApiResponse { val body = JSONObject() if (datetime != null) { body.put("datetime", datetime) @@ -82,6 +82,7 @@ open class PretixApi(url: String, key: String, orgaSlug: String, version: Int, h body.put("answers", answerbody) body.put("questions_supported", questions_supported) body.put("canceled_supported", true) + body.put("use_order_locale", use_order_locale) var pd = "" if (pdf_data) { pd = "?pdf_data=true" @@ -90,7 +91,7 @@ open class PretixApi(url: String, key: String, orgaSlug: String, version: Int, h } @Throws(ApiException::class, JSONException::class) - fun redeem(lists: List, secret: String, datetime: Date?, force: Boolean, nonce: String?, answers: List?, ignore_unpaid: Boolean, pdf_data: Boolean, type: String?, source_type: String?, callTimeout: Long? = null, questions_supported: Boolean = true): ApiResponse { + fun redeem(lists: List, secret: String, datetime: Date?, force: Boolean, nonce: String?, answers: List?, ignore_unpaid: Boolean, pdf_data: Boolean, type: String?, source_type: String?, callTimeout: Long? = null, questions_supported: Boolean = true, use_order_locale: Boolean = false): ApiResponse { var dt: String? = null if (datetime != null) { dt = QueuedCheckIn.formatDatetime(datetime) @@ -99,7 +100,7 @@ open class PretixApi(url: String, key: String, orgaSlug: String, version: Int, h } @Throws(ApiException::class, JSONException::class) - open fun redeem(lists: List, secret: String, datetime: String?, force: Boolean, nonce: String?, answers: List?, ignore_unpaid: Boolean, pdf_data: Boolean, type: String?, source_type: String?, callTimeout: Long? = null, questions_supported: Boolean = true): ApiResponse { + open fun redeem(lists: List, secret: String, datetime: String?, force: Boolean, nonce: String?, answers: List?, ignore_unpaid: Boolean, pdf_data: Boolean, type: String?, source_type: String?, callTimeout: Long? = null, questions_supported: Boolean = true, use_order_locale: Boolean = false): ApiResponse { val body = JSONObject() if (datetime != null) { body.put("datetime", datetime) @@ -129,6 +130,7 @@ open class PretixApi(url: String, key: String, orgaSlug: String, version: Int, h body.put("answers", answerbody) body.put("questions_supported", questions_supported) body.put("canceled_supported", true) + body.put("use_order_locale", use_order_locale) body.put("secret", secret) val jlists = JSONArray() for (l in lists) { diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/ProxyApi.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/ProxyApi.kt index 3021f0bb..37b8688e 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/ProxyApi.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/ProxyApi.kt @@ -25,6 +25,7 @@ data class MultiCheckInput( // TODO: Check unused values val allowQuestions: Boolean, + val useOrderLocale: Boolean, val nonce: String? ) diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt index aef58196..f84e1a8d 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt @@ -544,6 +544,7 @@ class AsyncCheckProvider(private val config: ConfigStore, private val db: SyncDa type: TicketCheckProvider.CheckInType, nonce: String?, allowQuestions: Boolean, + useOrderLocale: Boolean ): TicketCheckProvider.CheckResult { val ticketid_cleaned = cleanInput(ticketid, source_type) @@ -697,6 +698,7 @@ class AsyncCheckProvider(private val config: ConfigStore, private val db: SyncDa res.variation = variation.stringValue } + res.locale = order.locale res.attendee_name = position.attendeeName res.seat = position.seatName res.orderCode = order.code diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/OnlineCheckProvider.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/OnlineCheckProvider.kt index 9aae8628..1ed091ab 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/OnlineCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/OnlineCheckProvider.kt @@ -47,7 +47,8 @@ class OnlineCheckProvider( with_badge_data: Boolean, type: TicketCheckProvider.CheckInType, nonce: String?, - allowQuestions: Boolean + allowQuestions: Boolean, + useOrderLocale: Boolean ): TicketCheckProvider.CheckResult { val ticketid_cleaned = cleanInput(ticketid, source_type) val nonce_cleaned = nonce ?: NonceGenerator.nextNonce() @@ -70,6 +71,7 @@ class OnlineCheckProvider( source_type, callTimeout = if (fallback != null) fallbackTimeout.toLong() else null, questions_supported = allowQuestions, + use_order_locale = useOrderLocale, ) } else { if (eventsAndCheckinLists.size != 1) throw CheckException("Multi-event scan not supported by server.") @@ -188,6 +190,9 @@ class OnlineCheckProvider( } res.orderCode = posjson.optString("order") res.positionId = posjson.optLong("positionid") + if (posjson.has("order__locale")) { + res.locale = posjson.getString("order__locale") + } res.position = posjson val checkins = posjson.getJSONArray("checkins") for (i in 0 until checkins.length()) { diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/ProxyCheckProvider.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/ProxyCheckProvider.kt index 2671eeac..01407ab3 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/ProxyCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/ProxyCheckProvider.kt @@ -109,7 +109,8 @@ class ProxyCheckProvider(private val config: ConfigStore, httpClientFactory: Htt with_badge_data: Boolean, type: TicketCheckProvider.CheckInType, nonce: String?, - allowQuestions: Boolean + allowQuestions: Boolean, + useOrderLocale: Boolean ): TicketCheckProvider.CheckResult { val answersInput = answers?.map { val questionModel = it.question as Question // TODO: Can we avoid the cast? @@ -129,6 +130,7 @@ class ProxyCheckProvider(private val config: ConfigStore, httpClientFactory: Htt source_type = source_type, type = type.name, allowQuestions = allowQuestions, + useOrderLocale = useOrderLocale, nonce = nonce, ) diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/TicketCheckProvider.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/TicketCheckProvider.kt index d2229836..f9ac0858 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/TicketCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/TicketCheckProvider.kt @@ -80,6 +80,7 @@ interface TicketCheckProvider { var position: JSONObject? = null var eventSlug: String? = null var offline: Boolean = false + var locale: String? = null constructor(type: Type?, message: String?, offline: Boolean = false) { this.type = type @@ -157,7 +158,7 @@ interface TicketCheckProvider { class StatusResult(var eventName: String?, var totalTickets: Int, var alreadyScanned: Int, var currentlyInside: Int?, var items: List?) { } - fun check(eventsAndCheckinLists: Map, ticketid: String, source_type: String, answers: List?, ignore_unpaid: Boolean, with_badge_data: Boolean, type: CheckInType, nonce: String? = null, allowQuestions: Boolean = true): CheckResult + fun check(eventsAndCheckinLists: Map, ticketid: String, source_type: String, answers: List?, ignore_unpaid: Boolean, with_badge_data: Boolean, type: CheckInType, nonce: String? = null, allowQuestions: Boolean = true, useOrderLocale: Boolean = false): CheckResult fun check(eventsAndCheckinLists: Map, ticketid: String): CheckResult @Throws(CheckException::class) fun search(eventsAndCheckinLists: Map, query: String, page: Int): List diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/models/Order.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/models/Order.kt index 640694db..b3c677d7 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/models/Order.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/models/Order.kt @@ -18,6 +18,7 @@ class Order( val pendingTotal: BigDecimal? = null, val payments: JSONArray = JSONArray(), val refunds: JSONArray = JSONArray(), + val locale: String? = null, ) { val hasValidStatus = when (status) { diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/models/db/OrderExensions.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/models/db/OrderExensions.kt index eace5152..82d163fb 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/models/db/OrderExensions.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/models/db/OrderExensions.kt @@ -25,6 +25,7 @@ fun Orders.toModel(): Order { pendingTotal = parsePendingTotal(json), payments = parsePayments(json), refunds = parseRefunds(json), + locale = parseLocale(json), ) } @@ -103,3 +104,12 @@ private fun parseRefunds(json: JSONObject): JSONArray { return JSONArray() } } + +private fun parseLocale(json: JSONObject): String? { + try { + return json.getString("locale") + } catch (e: JSONException) { + e.printStackTrace() + return null + } +} diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/sync/SyncManager.java b/libpretixsync/src/main/java/eu/pretix/libpretixsync/sync/SyncManager.java index 4cfb987b..9f9a3062 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/sync/SyncManager.java +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/sync/SyncManager.java @@ -728,9 +728,9 @@ protected void uploadCheckins(ProgressFeedback feedback) throws SyncException { } if (qci.getDatetime_string() == null || qci.getDatetime_string().equals("")) { // Backwards compatibility - ar = api.redeem(qci.getEvent_slug(), qci.getSecret(), qci.getDatetime(), true, qci.getNonce(), answers, qci.getCheckinListId(), false, false, qci.getType(), st, null, false); + ar = api.redeem(qci.getEvent_slug(), qci.getSecret(), qci.getDatetime(), true, qci.getNonce(), answers, qci.getCheckinListId(), false, false, qci.getType(), st, null, false, false); } else { - ar = api.redeem(qci.getEvent_slug(), qci.getSecret(), qci.getDatetime_string(), true, qci.getNonce(), answers, qci.getCheckinListId(), false, false, qci.getType(), st, null, false); + ar = api.redeem(qci.getEvent_slug(), qci.getSecret(), qci.getDatetime_string(), true, qci.getNonce(), answers, qci.getCheckinListId(), false, false, qci.getType(), st, null, false, false); } if (connectivityFeedback != null) { connectivityFeedback.recordSuccess(System.currentTimeMillis() - startedAt); diff --git a/libpretixsync/src/testFixtures/java/eu/pretix/pretixscan/scanproxy/tests/test/FakePretixApi.kt b/libpretixsync/src/testFixtures/java/eu/pretix/pretixscan/scanproxy/tests/test/FakePretixApi.kt index 284b4182..6b1c7d6f 100644 --- a/libpretixsync/src/testFixtures/java/eu/pretix/pretixscan/scanproxy/tests/test/FakePretixApi.kt +++ b/libpretixsync/src/testFixtures/java/eu/pretix/pretixscan/scanproxy/tests/test/FakePretixApi.kt @@ -42,7 +42,8 @@ class FakePretixApi : PretixApi("http://1.1.1.1/", "a", "demo", 1, DefaultHttpCl type: String?, source_type: String?, callTimeout: Long?, - questions_supported: Boolean + questions_supported: Boolean, + use_order_locale: Boolean ): ApiResponse { redeemRequestSecret = secret redeemRequestDatetime = datetime @@ -68,7 +69,8 @@ class FakePretixApi : PretixApi("http://1.1.1.1/", "a", "demo", 1, DefaultHttpCl type: String?, source_type: String?, callTimeout: Long?, - questions_supported: Boolean + questions_supported: Boolean, + use_order_locale: Boolean ): ApiResponse { redeemRequestSecret = secret redeemRequestDatetime = datetime