Skip to content

Commit 0d07741

Browse files
authored
O3-5253: Create flags domain in Initializer (#309)
1 parent 5655e86 commit 0d07741

27 files changed

Lines changed: 1061 additions & 0 deletions

File tree

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ configuration/
8484
├── orderfrequencies/
8585
├── ordertypes/
8686
├── paymentmodes/
87+
├── flags/
88+
├── flagpriorities/
89+
├── flagtags/
8790
├── patientidentifiertypes/
8891
├── personattributetypes/
8992
├── privileges/
@@ -140,6 +143,9 @@ This is the list of currently supported domains in their loading order:
140143
1. [Billable Services (CSV files)](readme/billableservices.md)
141144
1. [Cash Points (CSV files)](readme/cashpoints.md)
142145
1. [Payment Modes (CSV files)](readme/paymentmodes.md)
146+
1. [Flags (CSV files)](readme/flags.md)
147+
1. [Flag Priorities (CSV files)](readme/flagpriorities.md)
148+
1. [Flag Tags (CSV files)](readme/flagtags.md)
143149
1. [Concept Sets and Answers (CSV files)](readme/conceptsets.md)
144150
1. [Concept Reference Ranges (CSV files)](readme/conceptreferencerange.md)
145151
1. [Programs (CSV files)](readme/prog.md)
@@ -183,6 +189,7 @@ mvn clean package
183189
* Bahmni I.e Apps 1.1.0 (*compatible*)
184190
* Billing 1.1.0 (*compatible*)
185191
* Data Filter 1.0.0 (*compatible*)
192+
* Flags 3.0.9 (*compatible*)
186193
* HTML Form Entry 4.0.0 (*compatible*)
187194
* ID Gen 4.3 (*compatible*)
188195
* Metadata Sharing 1.2.2 (*compatible*)
@@ -223,6 +230,9 @@ See the [documentation on Initializer's logging properties](readme/rtprops.md#lo
223230
* Removed support for Billing V1 (1.x) versions
224231
* Support for system tasks with openmrs-module-tasks
225232

233+
#### Version 2.11.0
234+
* Added support for patient flags (flags, flagpriorities, flagtags) domains
235+
226236
#### Version 2.10.0
227237
* Support enhanced methods for loading htmlforms when running htmlformentry 5.5.0+
228238
* Support loading drug ingredients within the drug domain, for compatible OpenMRS versions.

api-2.3/src/test/java/org/openmrs/module/initializer/api/loaders/LoadersOrderTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ protected boolean matchesSafely(List<Loader> loaders, Description mismatchDescri
7474
exclude.add(Domain.BILLABLE_SERVICES.getName());
7575
exclude.add(Domain.CASH_POINTS.getName());
7676
exclude.add(Domain.CONCEPT_REFERENCE_RANGE.getName());
77+
exclude.add(Domain.FLAGS.getName());
78+
exclude.add(Domain.FLAG_PRIORITIES.getName());
79+
exclude.add(Domain.FLAG_TAGS.getName());
7780

7881
boolean result = true;
7982
Set<String> loaderDomains = loaders.stream().map(Loader::getDomainName).collect(Collectors.toSet());

api/src/main/java/org/openmrs/module/initializer/Domain.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public enum Domain {
3131
BILLABLE_SERVICES,
3232
PAYMENT_MODES,
3333
CASH_POINTS,
34+
FLAG_PRIORITIES,
35+
FLAG_TAGS,
36+
FLAGS,
3437
PROGRAMS,
3538
PROGRAM_WORKFLOWS,
3639
PROGRAM_WORKFLOW_STATES,
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.openmrs.module.initializer.api.patientflags;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
import org.openmrs.annotation.OpenmrsProfile;
5+
import org.openmrs.module.patientflags.DisplayPoint;
6+
import org.openmrs.module.patientflags.api.FlagService;
7+
import org.openmrs.module.initializer.api.utils.ListParser;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.beans.factory.annotation.Qualifier;
10+
11+
/**
12+
* Parses a list of DisplayPoint identifiers (UUID or name) and fetches the corresponding
13+
* DisplayPoint entities.
14+
*/
15+
@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" })
16+
public class DisplayPointListParser extends ListParser<DisplayPoint> {
17+
18+
private FlagService flagService;
19+
20+
@Autowired
21+
public DisplayPointListParser(@Qualifier("flagService") FlagService flagService) {
22+
this.flagService = flagService;
23+
}
24+
25+
@Override
26+
protected DisplayPoint fetch(String id) {
27+
if (StringUtils.isBlank(id)) {
28+
return null;
29+
}
30+
31+
// Try UUID first
32+
DisplayPoint displayPoint = flagService.getDisplayPointByUuid(id);
33+
if (displayPoint != null) {
34+
return displayPoint;
35+
}
36+
37+
// Try name
38+
displayPoint = flagService.getDisplayPoint(id);
39+
if (displayPoint != null) {
40+
return displayPoint;
41+
}
42+
43+
return null;
44+
}
45+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.openmrs.module.initializer.api.patientflags;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
import org.openmrs.annotation.OpenmrsProfile;
5+
import org.openmrs.module.patientflags.Flag;
6+
import org.openmrs.module.patientflags.api.FlagService;
7+
import org.openmrs.module.initializer.Domain;
8+
import org.openmrs.module.initializer.api.BaseLineProcessor;
9+
import org.openmrs.module.initializer.api.CsvLine;
10+
import org.openmrs.module.initializer.api.CsvParser;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.beans.factory.annotation.Qualifier;
13+
14+
/**
15+
* Parses CSV files for Flag entities.
16+
*/
17+
@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" })
18+
public class FlagsCsvParser extends CsvParser<Flag, BaseLineProcessor<Flag>> {
19+
20+
private final FlagService flagService;
21+
22+
@Autowired
23+
public FlagsCsvParser(@Qualifier("flagService") FlagService flagService, FlagsLineProcessor processor) {
24+
super(processor);
25+
this.flagService = flagService;
26+
}
27+
28+
@Override
29+
public Domain getDomain() {
30+
return Domain.FLAGS;
31+
}
32+
33+
@Override
34+
public Flag bootstrap(CsvLine line) throws IllegalArgumentException {
35+
String uuid = line.getUuid();
36+
Flag flag = null;
37+
if (uuid != null && uuid != "") {
38+
flag = flagService.getFlagByUuid(uuid);
39+
}
40+
if (flag == null) {
41+
flag = new Flag();
42+
if (StringUtils.isNotBlank(uuid)) {
43+
flag.setUuid(uuid);
44+
}
45+
}
46+
return flag;
47+
}
48+
49+
@Override
50+
public Flag save(Flag instance) {
51+
flagService.saveFlag(instance);
52+
return instance;
53+
}
54+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package org.openmrs.module.initializer.api.patientflags;
2+
3+
import java.util.HashSet;
4+
import java.util.Set;
5+
6+
import org.apache.commons.lang3.StringUtils;
7+
import org.openmrs.annotation.OpenmrsProfile;
8+
import org.openmrs.module.patientflags.Flag;
9+
import org.openmrs.module.patientflags.Priority;
10+
import org.openmrs.module.patientflags.Tag;
11+
import org.openmrs.module.patientflags.api.FlagService;
12+
import org.openmrs.module.initializer.api.BaseLineProcessor;
13+
import org.openmrs.module.initializer.api.CsvLine;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.beans.factory.annotation.Qualifier;
16+
17+
/**
18+
* Processes CSV lines for Flag entities.
19+
*/
20+
@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" })
21+
public class FlagsLineProcessor extends BaseLineProcessor<Flag> {
22+
23+
protected static final String HEADER_CRITERIA = "criteria";
24+
25+
protected static final String HEADER_EVALUATOR = "evaluator";
26+
27+
protected static final String HEADER_MESSAGE = "message";
28+
29+
protected static final String HEADER_PRIORITY = "priority";
30+
31+
protected static final String HEADER_ENABLED = "enabled";
32+
33+
protected static final String HEADER_TAGS = "tags";
34+
35+
private FlagService flagService;
36+
37+
private TagListParser tagListParser;
38+
39+
@Autowired
40+
public FlagsLineProcessor(@Qualifier("flagService") FlagService flagService, TagListParser tagListParser) {
41+
this.flagService = flagService;
42+
this.tagListParser = tagListParser;
43+
}
44+
45+
@Override
46+
public Flag fill(Flag flag, CsvLine line) throws IllegalArgumentException {
47+
flag.setName(line.get(HEADER_NAME, true));
48+
flag.setDescription(line.get(HEADER_DESC));
49+
50+
// Required fields
51+
flag.setCriteria(line.get(HEADER_CRITERIA, true));
52+
flag.setEvaluator(line.get(HEADER_EVALUATOR, true));
53+
flag.setMessage(line.get(HEADER_MESSAGE, true));
54+
55+
// Optional priority
56+
String priorityId = line.getString(HEADER_PRIORITY, "");
57+
if (StringUtils.isNotBlank(priorityId)) {
58+
Priority priority = fetchPriority(priorityId);
59+
if (priority == null) {
60+
throw new IllegalArgumentException(
61+
"The priority referenced by '" + priorityId + "' does not point to any known priority.");
62+
}
63+
flag.setPriority(priority);
64+
} else {
65+
flag.setPriority(null);
66+
}
67+
68+
// Optional enabled flag (defaults to true if not specified)
69+
String enabledStr = line.getString(HEADER_ENABLED, "");
70+
if (StringUtils.isNotBlank(enabledStr)) {
71+
flag.setEnabled(Boolean.parseBoolean(enabledStr.trim()));
72+
} else {
73+
flag.setEnabled(true); // Default to enabled
74+
}
75+
76+
// Optional tags
77+
String tagsStr = line.getString(HEADER_TAGS, "");
78+
if (StringUtils.isNotBlank(tagsStr)) {
79+
Set<Tag> tags = new HashSet<Tag>(tagListParser.parseList(tagsStr));
80+
flag.setTags(tags);
81+
} else if (flag.getTags() != null) {
82+
// Clear tags if not specified (only if tags were previously set)
83+
flag.getTags().clear();
84+
}
85+
86+
return flag;
87+
}
88+
89+
/**
90+
* Fetches a Priority by UUID or name.
91+
*/
92+
private Priority fetchPriority(String id) {
93+
if (StringUtils.isBlank(id)) {
94+
return null;
95+
}
96+
97+
// Try UUID first
98+
Priority priority = flagService.getPriorityByUuid(id);
99+
if (priority != null) {
100+
return priority;
101+
}
102+
103+
// Try name
104+
priority = flagService.getPriorityByName(id);
105+
if (priority != null) {
106+
return priority;
107+
}
108+
109+
return null;
110+
}
111+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.openmrs.module.initializer.api.patientflags;
2+
3+
import org.openmrs.annotation.OpenmrsProfile;
4+
import org.openmrs.module.patientflags.Flag;
5+
import org.openmrs.module.initializer.api.loaders.BaseCsvLoader;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
8+
/**
9+
* Loads Flags from CSV files.
10+
*/
11+
@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" })
12+
public class FlagsLoader extends BaseCsvLoader<Flag, FlagsCsvParser> {
13+
14+
@Autowired
15+
public void setParser(FlagsCsvParser parser) {
16+
this.parser = parser;
17+
}
18+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.openmrs.module.initializer.api.patientflags;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
import org.openmrs.annotation.OpenmrsProfile;
5+
import org.openmrs.module.patientflags.Priority;
6+
import org.openmrs.module.patientflags.api.FlagService;
7+
import org.openmrs.module.initializer.Domain;
8+
import org.openmrs.module.initializer.api.BaseLineProcessor;
9+
import org.openmrs.module.initializer.api.CsvLine;
10+
import org.openmrs.module.initializer.api.CsvParser;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.beans.factory.annotation.Qualifier;
13+
14+
/**
15+
* Parses CSV files for Priority entities.
16+
*/
17+
@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" })
18+
public class PrioritiesCsvParser extends CsvParser<Priority, BaseLineProcessor<Priority>> {
19+
20+
private final FlagService flagService;
21+
22+
@Autowired
23+
public PrioritiesCsvParser(@Qualifier("flagService") FlagService flagService, PriorityLineProcessor processor) {
24+
super(processor);
25+
this.flagService = flagService;
26+
}
27+
28+
@Override
29+
public Domain getDomain() {
30+
return Domain.FLAG_PRIORITIES;
31+
}
32+
33+
@Override
34+
public Priority bootstrap(CsvLine line) throws IllegalArgumentException {
35+
String uuid = line.getUuid();
36+
Priority priority = flagService.getPriorityByUuid(uuid);
37+
38+
if (priority == null && StringUtils.isEmpty(uuid)) {
39+
String name = line.getName();
40+
if (StringUtils.isNotBlank(name)) {
41+
priority = flagService.getPriorityByName(name);
42+
}
43+
}
44+
45+
if (priority == null) {
46+
priority = new Priority();
47+
if (StringUtils.isNotBlank(uuid)) {
48+
priority.setUuid(uuid);
49+
}
50+
}
51+
52+
return priority;
53+
}
54+
55+
@Override
56+
public Priority save(Priority instance) {
57+
flagService.savePriority(instance);
58+
return instance;
59+
}
60+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.openmrs.module.initializer.api.patientflags;
2+
3+
import org.openmrs.annotation.OpenmrsProfile;
4+
import org.openmrs.module.patientflags.Priority;
5+
import org.openmrs.module.initializer.api.loaders.BaseCsvLoader;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
8+
/**
9+
* Loads Priorities from CSV files.
10+
*/
11+
@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" })
12+
public class PrioritiesLoader extends BaseCsvLoader<Priority, PrioritiesCsvParser> {
13+
14+
@Autowired
15+
public void setParser(PrioritiesCsvParser parser) {
16+
this.parser = parser;
17+
}
18+
}

0 commit comments

Comments
 (0)