Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 40a10e2

Browse files
MateStrysewskeMartin Wahnschaffe
andauthored
SORMAS-Foundation#3552 - Added feature configuration for tasks (SORMAS-Foundation#3641)
* SORMAS-Foundation#3552 - Added feature configuration for tasks * SORMAS-Foundation#3552 removed tasks columns from contacts and events when disabled Added code comment for app Co-authored-by: Martin Wahnschaffe <[email protected]>
1 parent ff4957c commit 40a10e2

16 files changed

Lines changed: 199 additions & 118 deletions

File tree

sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package de.symeda.sormas.api.feature;
22

33
import java.util.ArrayList;
4-
import java.util.Arrays;
54
import java.util.List;
65

76
import de.symeda.sormas.api.i18n.I18nProperties;
@@ -17,10 +16,23 @@ public enum FeatureType {
1716
WEEKLY_REPORTING(true, true, null),
1817
CLINICAL_MANAGEMENT(true, true, null),
1918
NATIONAL_CASE_SHARING(true, false, null),
20-
TASK_GENERATION_CASE_SURVEILLANCE(true, true, null),
21-
TASK_GENERATION_CONTACT_TRACING(true, true, null),
22-
TASK_GENERATION_EVENT_SURVEILLANCE(true, true, null),
23-
TASK_GENERATION_GENERAL(true, true, null),
19+
TASK_MANAGEMENT(true, true, null),
20+
TASK_GENERATION_CASE_SURVEILLANCE(true,
21+
true,
22+
new FeatureType[] {
23+
TASK_MANAGEMENT }),
24+
TASK_GENERATION_CONTACT_TRACING(true,
25+
true,
26+
new FeatureType[] {
27+
TASK_MANAGEMENT }),
28+
TASK_GENERATION_EVENT_SURVEILLANCE(true,
29+
true,
30+
new FeatureType[] {
31+
TASK_MANAGEMENT }),
32+
TASK_GENERATION_GENERAL(true,
33+
true,
34+
new FeatureType[] {
35+
TASK_MANAGEMENT }),
2436
CAMPAIGNS(true, false, null),
2537
CASE_SURVEILANCE(true, true, null),
2638
CONTACT_TRACING(true,
@@ -34,7 +46,10 @@ public enum FeatureType {
3446
CONTACT_TRACING }),
3547
INFRASTRUCTURE_TYPE_AREA(true, false, null),
3648
CASE_FOLLOWUP(true, false, null),
37-
TASK_NOTIFICATIONS(true, true, null),
49+
TASK_NOTIFICATIONS(true,
50+
true,
51+
new FeatureType[] {
52+
TASK_MANAGEMENT }),
3853
OTHER_NOTIFICATIONS(true, true, null),
3954
DOCUMENTS(true, false, null),
4055
OUTBREAKS(true, true, null);
@@ -50,7 +65,7 @@ public enum FeatureType {
5065
*/
5166
private final boolean enabledDefault;
5267

53-
private FeatureType[] dependentFeatures;
68+
private final FeatureType[] dependentFeatures;
5469

5570
FeatureType(boolean serverFeature, boolean enabledDefault, FeatureType[] dependentFeatures) {
5671
this.serverFeature = serverFeature;
@@ -85,26 +100,8 @@ public boolean isDependent() {
85100
return dependentFeatures != null;
86101
}
87102

88-
public boolean dependencyTriggered() {
89-
List<FeatureType> featureDependencyList = Arrays.asList(dependentFeatures);
90-
List<FeatureType> listOfEnabledDependentFeatures = new ArrayList<>();
91-
92-
listOfEnabledDependentFeatures.addAll(checkDependency(featureDependencyList));
93-
return listOfEnabledDependentFeatures.isEmpty();
94-
}
95-
96-
public List<FeatureType> checkDependency(List<FeatureType> featureTypeList) {
97-
List<FeatureType> listOfEnabledDependentFeatures = new ArrayList<>();
98-
for (FeatureType featureType : featureTypeList) {
99-
if (featureType.isDependent()) {
100-
listOfEnabledDependentFeatures.addAll(checkDependency(Arrays.asList(featureType.dependentFeatures)));
101-
}
102-
103-
if (featureType.isEnabledDefault() && !featureType.isDependent()) {
104-
listOfEnabledDependentFeatures.add(featureType);
105-
}
106-
} ;
107-
return listOfEnabledDependentFeatures;
103+
public FeatureType[] getDependentFeatures() {
104+
return dependentFeatures;
108105
}
109106

110107
}

sormas-app/app/src/main/java/de/symeda/sormas/app/BaseActivity.java

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,16 @@
1515

1616
package de.symeda.sormas.app;
1717

18+
import static de.symeda.sormas.app.core.notification.NotificationType.ERROR;
19+
20+
import java.lang.ref.WeakReference;
21+
import java.util.ArrayList;
22+
import java.util.List;
23+
24+
import org.apache.commons.lang3.StringUtils;
25+
26+
import com.google.android.material.navigation.NavigationView;
27+
1828
import android.app.ProgressDialog;
1929
import android.content.Context;
2030
import android.content.Intent;
@@ -40,14 +50,6 @@
4050
import androidx.drawerlayout.widget.DrawerLayout;
4151
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
4252

43-
import com.google.android.material.navigation.NavigationView;
44-
45-
import org.apache.commons.lang3.StringUtils;
46-
47-
import java.lang.ref.WeakReference;
48-
import java.util.ArrayList;
49-
import java.util.List;
50-
5153
import de.symeda.sormas.api.feature.FeatureType;
5254
import de.symeda.sormas.api.user.UserRight;
5355
import de.symeda.sormas.api.utils.ValidationException;
@@ -74,8 +76,6 @@
7476
import de.symeda.sormas.app.util.Callback;
7577
import de.symeda.sormas.app.util.NavigationHelper;
7678

77-
import static de.symeda.sormas.app.core.notification.NotificationType.ERROR;
78-
7979
public abstract class BaseActivity extends BaseLocalizedActivity implements NotificationContext {
8080

8181
public static final String TAG = BaseActivity.class.getSimpleName();
@@ -403,10 +403,13 @@ private void setupDrawer(NavigationView navView) {
403403
dashboardMenu.setVisible(false);
404404

405405
if (taskMenu != null)
406-
taskMenu.setVisible(ConfigProvider.hasUserRight(UserRight.TASK_VIEW));
406+
taskMenu.setVisible(
407+
ConfigProvider.hasUserRight(UserRight.TASK_VIEW)
408+
&& !DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.TASK_MANAGEMENT));
407409

408410
if (caseMenu != null)
409-
caseMenu.setVisible(ConfigProvider.hasUserRight(UserRight.CASE_VIEW)
411+
caseMenu.setVisible(
412+
ConfigProvider.hasUserRight(UserRight.CASE_VIEW)
410413
&& !DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.CASE_SURVEILANCE));
411414

412415
if (aggregateReportsMenu != null)
@@ -415,7 +418,8 @@ private void setupDrawer(NavigationView navView) {
415418
&& !DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.AGGREGATE_REPORTING));
416419

417420
if (sampleMenu != null)
418-
sampleMenu.setVisible(ConfigProvider.hasUserRight(UserRight.SAMPLE_VIEW)
421+
sampleMenu.setVisible(
422+
ConfigProvider.hasUserRight(UserRight.SAMPLE_VIEW)
419423
&& !DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.SAMPLES_LAB));
420424

421425
if (eventMenu != null)
@@ -424,7 +428,8 @@ private void setupDrawer(NavigationView navView) {
424428
&& !DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.EVENT_SURVEILLANCE));
425429

426430
if (contactMenu != null)
427-
contactMenu.setVisible(ConfigProvider.hasUserRight(UserRight.CONTACT_VIEW)
431+
contactMenu.setVisible(
432+
ConfigProvider.hasUserRight(UserRight.CONTACT_VIEW)
428433
&& !DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.CONTACT_TRACING));
429434

430435
if (reportMenu != null)

sormas-app/app/src/main/java/de/symeda/sormas/app/caze/edit/CaseEditActivity.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ public List<PageMenuItem> getPageMenuData() {
103103
List<PageMenuItem> menuItems = PageMenuItem.fromEnum(CaseSection.values(), getContext());
104104
Case caze = getStoredRootEntity();
105105
// Sections must be removed in reverse order
106+
if (DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.TASK_MANAGEMENT)) {
107+
menuItems.set(CaseSection.TASKS.ordinal(), null);
108+
}
106109
if (!ConfigProvider.hasUserRight(UserRight.CLINICAL_COURSE_VIEW)
107110
|| (caze != null && caze.isUnreferredPortHealthCase())
108111
|| (caze != null && caze.getClinicalCourse() == null)

sormas-app/app/src/main/java/de/symeda/sormas/app/caze/read/CaseReadActivity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import de.symeda.sormas.api.Disease;
2525
import de.symeda.sormas.api.caze.CaseClassification;
2626
import de.symeda.sormas.api.caze.CaseOrigin;
27+
import de.symeda.sormas.api.feature.FeatureType;
2728
import de.symeda.sormas.api.user.UserRight;
2829
import de.symeda.sormas.api.user.UserRole;
2930
import de.symeda.sormas.api.utils.DataHelper;
@@ -71,6 +72,9 @@ public List<PageMenuItem> getPageMenuData() {
7172
List<PageMenuItem> menuItems = PageMenuItem.fromEnum(CaseSection.values(), getContext());
7273
Case caze = getStoredRootEntity();
7374
// Sections must be removed in reverse order
75+
if (DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.TASK_MANAGEMENT)) {
76+
menuItems.set(CaseSection.TASKS.ordinal(), null);
77+
}
7478
if (!ConfigProvider.hasUserRight(UserRight.CLINICAL_COURSE_VIEW)
7579
|| (caze != null && caze.isUnreferredPortHealthCase())
7680
|| (caze != null && caze.getClinicalCourse() == null)) {

sormas-app/app/src/main/java/de/symeda/sormas/app/contact/edit/ContactEditActivity.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import android.view.Menu;
2626

2727
import de.symeda.sormas.api.contact.ContactClassification;
28+
import de.symeda.sormas.api.feature.FeatureType;
2829
import de.symeda.sormas.api.utils.DataHelper;
2930
import de.symeda.sormas.api.utils.ValidationException;
3031
import de.symeda.sormas.app.BaseActivity;
@@ -74,7 +75,12 @@ protected Contact buildRootEntity() {
7475

7576
@Override
7677
public List<PageMenuItem> getPageMenuData() {
77-
return PageMenuItem.fromEnum(ContactSection.values(), getContext());
78+
List<PageMenuItem> menuItems = PageMenuItem.fromEnum(ContactSection.values(), getContext());
79+
// Sections must be removed in reverse order
80+
if (DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.TASK_MANAGEMENT)) {
81+
menuItems.set(ContactSection.TASKS.ordinal(), null);
82+
}
83+
return menuItems;
7884
}
7985

8086
@Override

sormas-app/app/src/main/java/de/symeda/sormas/app/contact/read/ContactReadActivity.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import de.symeda.sormas.api.ReferenceDto;
2525
import de.symeda.sormas.api.contact.ContactClassification;
2626
import de.symeda.sormas.api.contact.ContactReferenceDto;
27+
import de.symeda.sormas.api.feature.FeatureType;
2728
import de.symeda.sormas.api.utils.DataHelper;
2829
import de.symeda.sormas.app.BaseReadActivity;
2930
import de.symeda.sormas.app.BaseReadFragment;
@@ -53,7 +54,12 @@ protected Contact queryRootEntity(String recordUuid) {
5354

5455
@Override
5556
public List<PageMenuItem> getPageMenuData() {
56-
return PageMenuItem.fromEnum(ContactSection.values(), getContext());
57+
List<PageMenuItem> menuItems = PageMenuItem.fromEnum(ContactSection.values(), getContext());
58+
// Sections must be removed in reverse order
59+
if (DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.TASK_MANAGEMENT)) {
60+
menuItems.set(ContactSection.TASKS.ordinal(), null);
61+
}
62+
return menuItems;
5763
}
5864

5965
@Override
@@ -81,7 +87,7 @@ protected BaseReadFragment buildReadFragment(PageMenuItem menuItem, Contact acti
8187
case EPIDEMIOLOGICAL_DATA:
8288
fragment = EpidemiologicalDataReadFragment.newInstance(activityRootData);
8389
break;
84-
default:
90+
default:
8591
throw new IndexOutOfBoundsException(DataHelper.toStringNullable(section));
8692
}
8793
return fragment;

sormas-app/app/src/main/java/de/symeda/sormas/app/event/edit/EventEditActivity.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import android.view.Menu;
2626

2727
import de.symeda.sormas.api.event.EventStatus;
28+
import de.symeda.sormas.api.feature.FeatureType;
2829
import de.symeda.sormas.api.utils.DataHelper;
2930
import de.symeda.sormas.api.utils.ValidationException;
3031
import de.symeda.sormas.app.BaseEditActivity;
@@ -69,7 +70,12 @@ protected Event buildRootEntity() {
6970

7071
@Override
7172
public List<PageMenuItem> getPageMenuData() {
72-
return PageMenuItem.fromEnum(EventSection.values(), getContext());
73+
List<PageMenuItem> menuItems = PageMenuItem.fromEnum(EventSection.values(), getContext());
74+
// Sections must be removed in reverse order
75+
if (DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.TASK_MANAGEMENT)) {
76+
menuItems.set(EventSection.TASKS.ordinal(), null);
77+
}
78+
return menuItems;
7379
}
7480

7581
@Override

sormas-app/app/src/main/java/de/symeda/sormas/app/event/read/EventReadActivity.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import de.symeda.sormas.api.ReferenceDto;
2525
import de.symeda.sormas.api.event.EventReferenceDto;
2626
import de.symeda.sormas.api.event.EventStatus;
27+
import de.symeda.sormas.api.feature.FeatureType;
2728
import de.symeda.sormas.api.utils.DataHelper;
2829
import de.symeda.sormas.app.BaseReadActivity;
2930
import de.symeda.sormas.app.BaseReadFragment;
@@ -59,7 +60,12 @@ public EventStatus getPageStatus() {
5960

6061
@Override
6162
public List<PageMenuItem> getPageMenuData() {
62-
return PageMenuItem.fromEnum(EventSection.values(), getContext());
63+
List<PageMenuItem> menuItems = PageMenuItem.fromEnum(EventSection.values(), getContext());
64+
// Sections must be removed in reverse order
65+
if (DatabaseHelper.getFeatureConfigurationDao().isFeatureDisabled(FeatureType.TASK_MANAGEMENT)) {
66+
menuItems.set(EventSection.TASKS.ordinal(), null);
67+
}
68+
return menuItems;
6369
}
6470

6571
@Override

sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,15 @@
4848
import javax.persistence.EntityManager;
4949
import javax.persistence.PersistenceContext;
5050

51-
import de.symeda.sormas.api.externaljournal.PatientDiaryConfig;
52-
import de.symeda.sormas.api.externaljournal.SymptomJournalConfig;
53-
import de.symeda.sormas.api.externaljournal.UserConfig;
54-
import de.symeda.sormas.backend.user.event.MockPasswordUpdateEvent;
55-
import de.symeda.sormas.backend.user.event.MockUserCreateEvent;
56-
import de.symeda.sormas.backend.user.event.PasswordResetEvent;
57-
import de.symeda.sormas.backend.user.event.UserCreateEvent;
5851
import org.apache.commons.lang3.StringUtils;
5952
import org.slf4j.Logger;
6053
import org.slf4j.LoggerFactory;
6154

6255
import de.symeda.sormas.api.Disease;
6356
import de.symeda.sormas.api.Language;
57+
import de.symeda.sormas.api.externaljournal.PatientDiaryConfig;
58+
import de.symeda.sormas.api.externaljournal.SymptomJournalConfig;
59+
import de.symeda.sormas.api.externaljournal.UserConfig;
6460
import de.symeda.sormas.api.facility.FacilityCriteria;
6561
import de.symeda.sormas.api.facility.FacilityType;
6662
import de.symeda.sormas.api.i18n.Captions;
@@ -69,33 +65,31 @@
6965
import de.symeda.sormas.api.infrastructure.PointOfEntryType;
7066
import de.symeda.sormas.api.user.UserRole;
7167
import de.symeda.sormas.api.utils.DataHelper;
72-
import de.symeda.sormas.backend.caze.CaseService;
7368
import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal;
7469
import de.symeda.sormas.backend.contact.Contact;
7570
import de.symeda.sormas.backend.contact.ContactService;
7671
import de.symeda.sormas.backend.disease.DiseaseConfiguration;
77-
import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal;
7872
import de.symeda.sormas.backend.disease.DiseaseConfigurationService;
79-
import de.symeda.sormas.backend.epidata.EpiDataService;
80-
import de.symeda.sormas.backend.event.EventParticipantService;
8173
import de.symeda.sormas.backend.facility.Facility;
8274
import de.symeda.sormas.backend.facility.FacilityFacadeEjb.FacilityFacadeEjbLocal;
8375
import de.symeda.sormas.backend.facility.FacilityService;
8476
import de.symeda.sormas.backend.feature.FeatureConfigurationService;
8577
import de.symeda.sormas.backend.importexport.ImportFacadeEjb.ImportFacadeEjbLocal;
8678
import de.symeda.sormas.backend.infrastructure.PointOfEntry;
8779
import de.symeda.sormas.backend.infrastructure.PointOfEntryService;
88-
import de.symeda.sormas.backend.person.PersonService;
8980
import de.symeda.sormas.backend.region.Community;
9081
import de.symeda.sormas.backend.region.CommunityService;
9182
import de.symeda.sormas.backend.region.District;
9283
import de.symeda.sormas.backend.region.DistrictService;
9384
import de.symeda.sormas.backend.region.Region;
9485
import de.symeda.sormas.backend.region.RegionService;
9586
import de.symeda.sormas.backend.sormastosormas.ServerAccessDataService;
96-
import de.symeda.sormas.backend.symptoms.SymptomsService;
9787
import de.symeda.sormas.backend.user.User;
9888
import de.symeda.sormas.backend.user.UserService;
89+
import de.symeda.sormas.backend.user.event.MockPasswordUpdateEvent;
90+
import de.symeda.sormas.backend.user.event.MockUserCreateEvent;
91+
import de.symeda.sormas.backend.user.event.PasswordResetEvent;
92+
import de.symeda.sormas.backend.user.event.UserCreateEvent;
9993
import de.symeda.sormas.backend.util.MockDataGenerator;
10094
import de.symeda.sormas.backend.util.ModelConstants;
10195
import de.symeda.sormas.backend.util.PasswordHelper;
@@ -195,6 +189,7 @@ public void startup() {
195189
createMissingDiseaseConfigurations();
196190

197191
featureConfigurationService.createMissingFeatureConfigurations();
192+
featureConfigurationService.updateFeatureConfigurations();
198193

199194
configFacade.validateAppUrls();
200195
configFacade.validateExternalUrls();
@@ -491,7 +486,7 @@ private void createOrUpdatePatientDiaryUser() {
491486

492487
private void createOrUpdateDefaultUser(Set<UserRole> userRoles, String username, String password, String firstName, String lastName) {
493488

494-
if(StringUtils.isAnyBlank(username, password)) {
489+
if (StringUtils.isAnyBlank(username, password)) {
495490
logger.debug("Invalid user details. Will not create/update default user");
496491
return;
497492
}
@@ -506,8 +501,7 @@ private void createOrUpdateDefaultUser(Set<UserRole> userRoles, String username,
506501
userService.persist(newUser);
507502
userCreateEvent.fire(new MockUserCreateEvent(newUser, password));
508503
}
509-
} else if (!DataHelper
510-
.equal(existingUser.getPassword(), PasswordHelper.encodePassword(password, existingUser.getSeed()))) {
504+
} else if (!DataHelper.equal(existingUser.getPassword(), PasswordHelper.encodePassword(password, existingUser.getSeed()))) {
511505
existingUser.setSeed(PasswordHelper.createPass(16));
512506
existingUser.setPassword(PasswordHelper.encodePassword(password, existingUser.getSeed()));
513507

0 commit comments

Comments
 (0)