Skip to content

Commit c6e84ae

Browse files
authored
Merge pull request #84 from dhis2/DHIS2-19426
feat: Add support for d2:inUserGroup function[DHIS2-19426]
2 parents 705b865 + fe34d86 commit c6e84ae

8 files changed

Lines changed: 56 additions & 6 deletions

File tree

‎api/expression-parser.api‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ public final class org/hisp/dhis/lib/expression/ast/NamedFunction : java/lang/En
116116
public static final field d2_hasUserRole Lorg/hisp/dhis/lib/expression/ast/NamedFunction;
117117
public static final field d2_hasValue Lorg/hisp/dhis/lib/expression/ast/NamedFunction;
118118
public static final field d2_inOrgUnitGroup Lorg/hisp/dhis/lib/expression/ast/NamedFunction;
119+
public static final field d2_inUserGroup Lorg/hisp/dhis/lib/expression/ast/NamedFunction;
119120
public static final field d2_lastEventDate Lorg/hisp/dhis/lib/expression/ast/NamedFunction;
120121
public static final field d2_left Lorg/hisp/dhis/lib/expression/ast/NamedFunction;
121122
public static final field d2_length Lorg/hisp/dhis/lib/expression/ast/NamedFunction;
@@ -1383,6 +1384,7 @@ public abstract interface class org/hisp/dhis/lib/expression/spi/ExpressionFunct
13831384
public abstract fun d2_hasUserRole (Ljava/lang/String;Ljava/util/List;)Z
13841385
public abstract fun d2_hasValue (Lorg/hisp/dhis/lib/expression/spi/VariableValue;)Z
13851386
public abstract fun d2_inOrgUnitGroup (Ljava/lang/String;Lorg/hisp/dhis/lib/expression/spi/VariableValue;Ljava/util/Map;)Z
1387+
public abstract fun d2_inUserGroup (Ljava/lang/String;Ljava/util/List;)Z
13861388
public abstract fun d2_lastEventDate (Lorg/hisp/dhis/lib/expression/spi/VariableValue;)Lkotlinx/datetime/LocalDate;
13871389
public abstract fun d2_left (Ljava/lang/String;Ljava/lang/Integer;)Ljava/lang/String;
13881390
public abstract fun d2_length (Ljava/lang/String;)I
@@ -1444,6 +1446,7 @@ public final class org/hisp/dhis/lib/expression/spi/ExpressionFunctions$DefaultI
14441446
public static fun d2_hasUserRole (Lorg/hisp/dhis/lib/expression/spi/ExpressionFunctions;Ljava/lang/String;Ljava/util/List;)Z
14451447
public static fun d2_hasValue (Lorg/hisp/dhis/lib/expression/spi/ExpressionFunctions;Lorg/hisp/dhis/lib/expression/spi/VariableValue;)Z
14461448
public static fun d2_inOrgUnitGroup (Lorg/hisp/dhis/lib/expression/spi/ExpressionFunctions;Ljava/lang/String;Lorg/hisp/dhis/lib/expression/spi/VariableValue;Ljava/util/Map;)Z
1449+
public static fun d2_inUserGroup (Lorg/hisp/dhis/lib/expression/spi/ExpressionFunctions;Ljava/lang/String;Ljava/util/List;)Z
14471450
public static fun d2_lastEventDate (Lorg/hisp/dhis/lib/expression/spi/ExpressionFunctions;Lorg/hisp/dhis/lib/expression/spi/VariableValue;)Lkotlinx/datetime/LocalDate;
14481451
public static fun d2_left (Lorg/hisp/dhis/lib/expression/spi/ExpressionFunctions;Ljava/lang/String;Ljava/lang/Integer;)Ljava/lang/String;
14491452
public static fun d2_length (Lorg/hisp/dhis/lib/expression/spi/ExpressionFunctions;Ljava/lang/String;)I

‎build.gradle.kts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ repositories {
99
mavenCentral()
1010
}
1111

12-
version = "1.1.11-SNAPSHOT"
12+
version = "1.1.12-SNAPSHOT"
1313
group = "org.hisp.dhis.lib.expression"
1414

1515
if (project.hasProperty("removeSnapshotSuffix")) {

‎src/commonMain/kotlin/org/hisp/dhis/lib/expression/ast/NamedFunction.kt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ enum class NamedFunction(
5858
d2_extractDataMatrixValue("d2:extractDataMatrixValue", ValueType.STRING, ValueType.STRING, ValueType.STRING),
5959
d2_floor("d2:floor", ValueType.NUMBER, ValueType.NUMBER),
6060
d2_hasUserRole("d2:hasUserRole", ValueType.BOOLEAN, ValueType.STRING),
61+
d2_inUserGroup("d2:inUserGroup", ValueType.BOOLEAN, ValueType.STRING),
6162
d2_hasValue("d2:hasValue", ValueType.BOOLEAN, ValueType.MIXED),
6263
d2_inOrgUnitGroup("d2:inOrgUnitGroup", ValueType.BOOLEAN, ValueType.STRING),
6364
d2_lastEventDate("d2:lastEventDate", ValueType.DATE, ValueType.STRING),

‎src/commonMain/kotlin/org/hisp/dhis/lib/expression/eval/Calculator.kt‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ internal class Calculator(
9292
NamedFunction.d2_floor -> functions.d2_floor(evalToNumber(fn.child(0)))
9393
NamedFunction.d2_hasUserRole -> functions.d2_hasUserRole(
9494
evalToString(fn.child(0)),
95-
data.supplementaryValues["USER"])
95+
data.supplementaryValues["USER_ROLES"])
96+
NamedFunction.d2_inUserGroup -> functions.d2_inUserGroup(
97+
evalToString(fn.child(0)),
98+
data.supplementaryValues["USER_GROUPS"])
9699
NamedFunction.d2_hasValue -> try {
97100
functions.d2_hasValue(evalToVar(fn.child(0)))
98101
} catch (e: IllegalExpressionException) {

‎src/commonMain/kotlin/org/hisp/dhis/lib/expression/spi/ExpressionFunctions.kt‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,11 @@ fun interface ExpressionFunctions {
221221
return roles.contains(role)
222222
}
223223

224+
fun d2_inUserGroup(userGroup: String?, userGroups: List<String?>?): Boolean {
225+
if (userGroups == null) throw IllegalExpressionException("Supplementary data for user needs to be provided")
226+
return userGroups.contains(userGroup)
227+
}
228+
224229
fun d2_hasValue(value: VariableValue?): Boolean {
225230
return value?.value != null
226231
}

‎src/commonMain/kotlin/org/hisp/dhis/lib/expression/syntax/ExpressionGrammar.kt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ object ExpressionGrammar {
116116
fn(NamedFunction.d2_extractDataMatrixValue, expr, expr),
117117
fn(NamedFunction.d2_floor, expr),
118118
fn(NamedFunction.d2_hasUserRole, expr),
119+
fn(NamedFunction.d2_inUserGroup, expr),
119120
fn(NamedFunction.d2_inOrgUnitGroup, expr),
120121
fn(NamedFunction.d2_lastEventDate, expr),
121122
fn(NamedFunction.d2_left, expr, expr),

‎src/commonTest/kotlin/org/hisp/dhis/lib/expression/function/HasUserRoleTest.kt‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ internal class HasUserRoleTest {
1515

1616
@Test
1717
fun testHasUserRole_Null() {
18-
assertFalse(evaluate("d2:hasUserRole(null)", mapOf("USER" to listOf("admin"))))
18+
assertFalse(evaluate("d2:hasUserRole(null)", mapOf("USER_ROLES" to listOf("admin"))))
1919
}
2020

2121
@Test
@@ -26,9 +26,9 @@ internal class HasUserRoleTest {
2626

2727
@Test
2828
fun testHasUserRole() {
29-
assertTrue(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER" to listOf("admin"))))
30-
assertFalse(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER" to listOf("guest"))))
31-
assertTrue(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER" to listOf("foo","admin"))))
29+
assertTrue(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER_ROLES" to listOf("admin"))))
30+
assertFalse(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER_ROLES" to listOf("guest"))))
31+
assertTrue(evaluate("d2:hasUserRole(\"admin\")", mapOf("USER_ROLES" to listOf("foo","admin"))))
3232
}
3333

3434
private fun evaluate(expression: String, supplementaryValues: Map<String, List<String>>): Boolean {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.hisp.dhis.lib.expression.function
2+
3+
import org.hisp.dhis.lib.expression.Expression
4+
import org.hisp.dhis.lib.expression.ExpressionMode
5+
import org.hisp.dhis.lib.expression.spi.ExpressionData
6+
import org.hisp.dhis.lib.expression.spi.IllegalExpressionException
7+
import kotlin.test.*
8+
9+
/**
10+
* Test of the `d2:inUserGroup` function.
11+
*
12+
* @author Zubair Asghar
13+
*/
14+
internal class InUserGroupTest {
15+
16+
@Test
17+
fun testInUserGroup_Null() {
18+
assertFalse(evaluate("d2:inUserGroup(null)", mapOf("USER_GROUPS" to listOf("uidusgroup0"))))
19+
}
20+
21+
@Test
22+
fun testInUserGroup_NoData() {
23+
val ex = assertFailsWith(IllegalExpressionException::class) { evaluate("d2:inUserGroup(\"uidougroup1\")", mapOf()) }
24+
assertEquals("Supplementary data for user needs to be provided", ex.message)
25+
}
26+
27+
@Test
28+
fun testInUserGroup() {
29+
assertTrue(evaluate("d2:inUserGroup(\"uidusgroup0\")", mapOf("USER_GROUPS" to listOf("uidusgroup0"))))
30+
assertFalse(evaluate("d2:inUserGroup(\"uidusgroup0\")", mapOf("USER_GROUPS" to listOf("uidusgroup1"))))
31+
}
32+
33+
private fun evaluate(expression: String, supplementaryValues: Map<String, List<String>>): Boolean {
34+
val data: ExpressionData = ExpressionData().copy(supplementaryValues = supplementaryValues)
35+
return Expression(expression, ExpressionMode.RULE_ENGINE_ACTION).evaluate( { _: String -> null }, data) as Boolean
36+
}
37+
}

0 commit comments

Comments
 (0)