From b7813d35150fcc13c5d7f366b59829b4f42606c7 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 | 11 +++++++---- .../main/java/eu/pretix/libpretixsync/api/ProxyApi.kt | 1 + .../pretix/libpretixsync/check/AsyncCheckProvider.kt | 2 ++ .../pretix/libpretixsync/check/OnlineCheckProvider.kt | 5 +++++ .../pretix/libpretixsync/check/ProxyCheckProvider.kt | 2 ++ .../pretix/libpretixsync/check/TicketCheckProvider.kt | 2 ++ .../main/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 | 4 +++- 10 files changed, 35 insertions(+), 7 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 d000dad7..84b589b5 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) @@ -112,6 +113,7 @@ open class PretixApi(url: String, key: String, orgaSlug: String, version: Int, h source_type: String?, callTimeout: Long? = null, questions_supported: Boolean = true, + use_order_locale: Boolean = false, exchange_medium_type: String? = null, exchange_medium_identifier: String? = null, ): ApiResponse { @@ -144,6 +146,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 800512b6..a467d840 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?, val exchange_medium_type: String?, val exchange_medium_identifier: 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 41290e63..6fbc0c51 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt @@ -556,6 +556,7 @@ class AsyncCheckProvider(private val config: ConfigStore, private val db: SyncDa type: TicketCheckProvider.CheckInType, nonce: String?, allowQuestions: Boolean, + useOrderLocale: Boolean, exchange_medium_type: String?, exchange_medium_identifier: String?, ): TicketCheckProvider.CheckResult { @@ -903,6 +904,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 7af71942..8713e630 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/OnlineCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/OnlineCheckProvider.kt @@ -50,6 +50,7 @@ class OnlineCheckProvider( type: TicketCheckProvider.CheckInType, nonce: String?, allowQuestions: Boolean, + useOrderLocale: Boolean, exchange_medium_type: String?, exchange_medium_identifier: String?, ): TicketCheckProvider.CheckResult { @@ -74,6 +75,7 @@ class OnlineCheckProvider( source_type, callTimeout = if (fallback != null) fallbackTimeout.toLong() else null, questions_supported = allowQuestions, + use_order_locale = useOrderLocale, exchange_medium_type = exchange_medium_type, exchange_medium_identifier = exchange_medium_identifier, ) @@ -216,6 +218,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 b70c4e6d..550d59ea 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/ProxyCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/ProxyCheckProvider.kt @@ -110,6 +110,7 @@ class ProxyCheckProvider(private val config: ConfigStore, httpClientFactory: Htt type: TicketCheckProvider.CheckInType, nonce: String?, allowQuestions: Boolean, + useOrderLocale: Boolean, exchange_medium_type: String?, exchange_medium_identifier: String?, ): TicketCheckProvider.CheckResult { @@ -131,6 +132,7 @@ class ProxyCheckProvider(private val config: ConfigStore, httpClientFactory: Htt source_type = source_type, type = type.name, allowQuestions = allowQuestions, + useOrderLocale = useOrderLocale, nonce = nonce, exchange_medium_type = exchange_medium_type, exchange_medium_identifier = exchange_medium_identifier, 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 791ffa97..971d30f2 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/TicketCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/TicketCheckProvider.kt @@ -83,6 +83,7 @@ interface TicketCheckProvider { var position: JSONObject? = null var eventSlug: String? = null var offline: Boolean = false + var locale: String? = null var requiredMediaPolicy: MediaPolicy? = null var requiredMediaType: ReusableMediaType? = null @@ -172,6 +173,7 @@ interface TicketCheckProvider { type: CheckInType, nonce: String? = null, allowQuestions: Boolean = true, + useOrderLocale: Boolean = false, exchange_medium_type: String? = null, exchange_medium_identifier: String? = null, ): CheckResult 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 de7351a9..579597dc 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 @@ -43,6 +43,7 @@ class FakePretixApi(var orgaSlug: String = "demo") : PretixApi("http://1.1.1.1/" source_type: String?, callTimeout: Long?, questions_supported: Boolean, + use_order_locale: Boolean, exchange_medium_type: String?, exchange_medium_identifier: String?, ): ApiResponse { @@ -70,7 +71,8 @@ class FakePretixApi(var orgaSlug: String = "demo") : PretixApi("http://1.1.1.1/" type: String?, source_type: String?, callTimeout: Long?, - questions_supported: Boolean + questions_supported: Boolean, + use_order_locale: Boolean ): ApiResponse { redeemRequestSecret = secret redeemRequestDatetime = datetime