← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 14640: Made DataApprovalLevel an IdentifiableObject. Made it available through the web api at api/dataAp...

 

------------------------------------------------------------
revno: 14640
committer: Lars Helge Øverland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Thu 2014-04-03 18:03:26 +0200
message:
  Made DataApprovalLevel an IdentifiableObject. Made it available through the web api at api/dataApprovalLevels.json
added:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/descriptors/DataApprovalLevelSchemaDescriptor.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataApprovalLevelController.java
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevel.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevelService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevelStore.java
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DefaultDataApprovalLevelService.java
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/hibernate/HibernateDataApprovalLevelStore.java
  dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/dataapproval/hibernate/DataApprovalLevel.hbm.xml
  dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalLevelServiceTest.java
  dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalServiceTest.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ExchangeClasses.java
  dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/MetaData.java
  dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/TextUtils.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/AddApprovalLevelAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/ValidateApprovalLevelAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/resources/META-INF/dhis/beans.xml


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevel.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevel.java	2014-04-03 13:57:45 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevel.java	2014-04-03 16:03:26 +0000
@@ -28,28 +28,32 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-import java.io.Serializable;
 import java.util.Date;
 
+import org.hisp.dhis.common.BaseIdentifiableObject;
+import org.hisp.dhis.common.DxfNamespaces;
+import org.hisp.dhis.common.view.DetailedView;
+import org.hisp.dhis.common.view.ExportView;
 import org.hisp.dhis.dataelement.CategoryOptionGroupSet;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonView;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
 /**
  * Records the approval of DataSet values for a given OrganisationUnit and
  * Period.
  *
  * @author Jim Grace
  */
+@JacksonXmlRootElement( localName = "dataApprovalLevel", namespace = DxfNamespaces.DXF_2_0 )
 public class DataApprovalLevel
-    implements Serializable
+    extends BaseIdentifiableObject
 {
     private static final long serialVersionUID = -8424400562969386167L;
 
     /**
-     * Identifies the data approval level instance.
-     */
-    private int id;
-
-    /**
      * The data approval level, 1=highest level, max=lowest level.
      */
     private int level;
@@ -65,16 +69,6 @@
     private CategoryOptionGroupSet categoryOptionGroupSet;
 
     /**
-     * The Date (including time) when the data approval level was created.
-     */
-    private Date created;
-
-    /**
-     * The Date (including time) when the data approval level was last updated.
-     */
-    private Date updated;
-
-    /**
      * The name of the organisation unit level (derived through the service.)
      */
     private String orgUnitLevelName;
@@ -87,22 +81,22 @@
     {
     }
 
-    public DataApprovalLevel( int orgUnitLevel,
-                              CategoryOptionGroupSet categoryOptionGroupSet )
+    public DataApprovalLevel( String name, int orgUnitLevel, CategoryOptionGroupSet categoryOptionGroupSet )
     {
+        this.name = name;
         this.orgUnitLevel = orgUnitLevel;
         this.categoryOptionGroupSet = categoryOptionGroupSet;
     }
 
-    public DataApprovalLevel( int level, int orgUnitLevel,
-                              CategoryOptionGroupSet categoryOptionGroupSet,
-                              Date created, Date updated )
+    public DataApprovalLevel( String name, int level, int orgUnitLevel, CategoryOptionGroupSet categoryOptionGroupSet,
+        Date created, Date lastUpdated )
     {
+        this.name = name;
         this.level = level;
         this.orgUnitLevel = orgUnitLevel;
         this.categoryOptionGroupSet = categoryOptionGroupSet;
         this.created = created;
-        this.updated = updated;
+        this.lastUpdated = lastUpdated;
     }
 
     // -------------------------------------------------------------------------
@@ -145,16 +139,9 @@
     // Getters and Setters
     // -------------------------------------------------------------------------
 
-    public int getId()
-    {
-        return id;
-    }
-
-    public void setId( int id )
-    {
-        this.id = id;
-    }
-
+    @JsonProperty
+    @JsonView( { DetailedView.class, ExportView.class } )
+    @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
     public int getLevel()
     {
         return level;
@@ -165,6 +152,9 @@
         this.level = level;
     }
 
+    @JsonProperty
+    @JsonView( { DetailedView.class, ExportView.class } )
+    @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
     public int getOrgUnitLevel()
     {
         return orgUnitLevel;
@@ -175,6 +165,9 @@
         this.orgUnitLevel = orgUnitLevel;
     }
 
+    @JsonProperty
+    @JsonView( { DetailedView.class, ExportView.class } )
+    @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
     public CategoryOptionGroupSet getCategoryOptionGroupSet()
     {
         return categoryOptionGroupSet;
@@ -185,26 +178,6 @@
         this.categoryOptionGroupSet = categoryOptionGroupSet;
     }
 
-    public Date getCreated()
-    {
-        return created;
-    }
-
-    public void setCreated( Date created )
-    {
-        this.created = created;
-    }
-
-    public Date getUpdated()
-    {
-        return updated;
-    }
-
-    public void setUpdated( Date updated )
-    {
-        this.updated = updated;
-    }
-
     public String getOrgUnitLevelName()
     {
         return orgUnitLevelName;

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevelService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevelService.java	2014-04-03 13:49:39 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevelService.java	2014-04-03 16:03:26 +0000
@@ -135,4 +135,12 @@
      * @return level number of the lowest level the user can view.
      */
     int getLowestUserDataApprovalLevel();
+    
+    /**
+     * Gets the data approval level with the given name.
+     * 
+     * @param name the name.
+     * @return a data approval level.
+     */
+    DataApprovalLevel getDataApprovalLevelByName( String name );
 }

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevelStore.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevelStore.java	2014-04-03 12:01:11 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataapproval/DataApprovalLevelStore.java	2014-04-03 16:03:26 +0000
@@ -30,7 +30,7 @@
 
 import java.util.List;
 
-import org.hisp.dhis.common.GenericStore;
+import org.hisp.dhis.common.GenericIdentifiableObjectStore;
 
 /**
  * Defines the functionality for persisting DataApproval objects.
@@ -38,7 +38,7 @@
  * @author Jim Grace
  */
 public interface DataApprovalLevelStore
-    extends GenericStore<DataApprovalLevel>
+    extends GenericIdentifiableObjectStore<DataApprovalLevel>
 {
     String ID = DataApprovalLevelStore.class.getName();
 

=== added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/descriptors/DataApprovalLevelSchemaDescriptor.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/descriptors/DataApprovalLevelSchemaDescriptor.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/schema/descriptors/DataApprovalLevelSchemaDescriptor.java	2014-04-03 16:03:26 +0000
@@ -0,0 +1,54 @@
+package org.hisp.dhis.schema.descriptors;
+
+/*
+ * Copyright (c) 2004-2014, University of Oslo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of the HISP project nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import org.hisp.dhis.dataapproval.DataApprovalLevel;
+import org.hisp.dhis.schema.Authority;
+import org.hisp.dhis.schema.AuthorityType;
+import org.hisp.dhis.schema.Schema;
+import org.hisp.dhis.schema.SchemaDescriptor;
+import org.springframework.stereotype.Component;
+
+import com.google.common.collect.Lists;
+
+@Component
+public class DataApprovalLevelSchemaDescriptor implements SchemaDescriptor
+{
+    @Override
+    public Schema getSchema()
+    {
+        Schema schema = new Schema( DataApprovalLevel.class, "dataApprovalLevel", "dataApprovalLevels" );
+        
+        schema.setShareable( false );
+        
+        schema.getAuthorities().add( new Authority( AuthorityType.CREATE, Lists.newArrayList( "F_SYSTEM_SETTING" ) ) );
+        
+        return schema;
+    }
+}

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DefaultDataApprovalLevelService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DefaultDataApprovalLevelService.java	2014-04-03 13:49:39 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/DefaultDataApprovalLevelService.java	2014-04-03 16:03:26 +0000
@@ -271,6 +271,11 @@
 
         return 0;
     }
+    
+    public DataApprovalLevel getDataApprovalLevelByName( String name )
+    {
+        return dataApprovalLevelStore.getByName( name );
+    }
 
     // -------------------------------------------------------------------------
     // Supportive methods

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/hibernate/HibernateDataApprovalLevelStore.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/hibernate/HibernateDataApprovalLevelStore.java	2014-04-03 12:01:11 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataapproval/hibernate/HibernateDataApprovalLevelStore.java	2014-04-03 16:03:26 +0000
@@ -32,15 +32,15 @@
 
 import org.hibernate.criterion.Order;
 import org.hibernate.criterion.Restrictions;
+import org.hisp.dhis.common.hibernate.HibernateIdentifiableObjectStore;
 import org.hisp.dhis.dataapproval.DataApprovalLevel;
 import org.hisp.dhis.dataapproval.DataApprovalLevelStore;
-import org.hisp.dhis.hibernate.HibernateGenericStore;
 
 /**
  * @author Jim Grace
  */
 public class HibernateDataApprovalLevelStore
-    extends HibernateGenericStore<DataApprovalLevel>
+    extends HibernateIdentifiableObjectStore<DataApprovalLevel>
     implements DataApprovalLevelStore
 {
     // -------------------------------------------------------------------------

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/dataapproval/hibernate/DataApprovalLevel.hbm.xml'
--- dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/dataapproval/hibernate/DataApprovalLevel.hbm.xml	2014-03-30 04:37:39 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/dataapproval/hibernate/DataApprovalLevel.hbm.xml	2014-04-03 16:03:26 +0000
@@ -10,6 +10,9 @@
     <id name="id" column="dataapprovallevelid">
       <generator class="native" />
     </id>
+    &identifiableProperties;
+
+    <property name="name" column="name" not-null="true" unique="true" length="230" />
 
     <property name="level" column="level" not-null="true" />
 
@@ -18,9 +21,5 @@
       <many-to-one name="categoryOptionGroupSet" class="org.hisp.dhis.dataelement.CategoryOptionGroupSet" column="categoryoptiongroupsetid" foreign-key="fK_dataapprovallevel_categoryoptiongroupsetid" />
     </properties>
 
-    <property name="created" column="created" not-null="true" type="timestamp" />
-
-    <property name="updated" column="updated" type="timestamp" />
-
     </class>
 </hibernate-mapping>

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalLevelServiceTest.java'
--- dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalLevelServiceTest.java	2014-03-31 10:24:23 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalLevelServiceTest.java	2014-04-03 16:03:26 +0000
@@ -113,29 +113,29 @@
         categoryService.saveCategoryOptionGroupSet( setC );
         categoryService.saveCategoryOptionGroupSet( setD );
 
-        level1 = new DataApprovalLevel( 1, null );
-        level1A = new DataApprovalLevel( 1, setA );
-        level1B = new DataApprovalLevel( 1, setB );
-        level1C = new DataApprovalLevel( 1, setC );
-        level1D = new DataApprovalLevel( 1, setD );
-
-        level2 = new DataApprovalLevel( 2, null );
-        level2A = new DataApprovalLevel( 2, setA );
-        level2B = new DataApprovalLevel( 2, setB );
-        level2C = new DataApprovalLevel( 2, setC );
-        level2D = new DataApprovalLevel( 2, setD );
-
-        level3 = new DataApprovalLevel( 3, null );
-        level3A = new DataApprovalLevel( 3, setA );
-        level3B = new DataApprovalLevel( 3, setB );
-        level3C = new DataApprovalLevel( 3, setC );
-        level3D = new DataApprovalLevel( 3, setD );
-
-        level4 = new DataApprovalLevel( 4, null );
-        level4A = new DataApprovalLevel( 4, setA );
-        level4B = new DataApprovalLevel( 4, setB );
-        level4C = new DataApprovalLevel( 4, setC );
-        level4D = new DataApprovalLevel( 4, setD );
+        level1 = new DataApprovalLevel( "1", 1, null );
+        level1A = new DataApprovalLevel( "1A", 1, setA );
+        level1B = new DataApprovalLevel( "1B", 1, setB );
+        level1C = new DataApprovalLevel( "1C", 1, setC );
+        level1D = new DataApprovalLevel( "1D", 1, setD );
+
+        level2 = new DataApprovalLevel( "2", 2, null );
+        level2A = new DataApprovalLevel( "2A", 2, setA );
+        level2B = new DataApprovalLevel( "2B", 2, setB );
+        level2C = new DataApprovalLevel( "2C", 2, setC );
+        level2D = new DataApprovalLevel( "2D", 2, setD );
+
+        level3 = new DataApprovalLevel( "3", 3, null );
+        level3A = new DataApprovalLevel( "3A", 3, setA );
+        level3B = new DataApprovalLevel( "3B", 3, setB );
+        level3C = new DataApprovalLevel( "3C", 3, setC );
+        level3D = new DataApprovalLevel( "3D", 3, setD );
+
+        level4 = new DataApprovalLevel( "4", 4, null );
+        level4A = new DataApprovalLevel( "4A", 4, setA );
+        level4B = new DataApprovalLevel( "4B", 4, setB );
+        level4C = new DataApprovalLevel( "4C", 4, setC );
+        level4D = new DataApprovalLevel( "4D", 4, setD );
     }
 
     // -------------------------------------------------------------------------

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalServiceTest.java'
--- dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalServiceTest.java	2014-04-01 19:50:22 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/dataapproval/DataApprovalServiceTest.java	2014-04-03 16:03:26 +0000
@@ -284,10 +284,10 @@
         organisationUnitService.addOrganisationUnit( organisationUnitE );
         organisationUnitService.addOrganisationUnit( organisationUnitF );
 
-        dataApprovalLevel1 = new DataApprovalLevel( 1, null );
-        dataApprovalLevel2 = new DataApprovalLevel( 2, null );
-        dataApprovalLevel3 = new DataApprovalLevel( 3, null );
-        dataApprovalLevel4 = new DataApprovalLevel( 4, null );
+        dataApprovalLevel1 = new DataApprovalLevel( "1", 1, null );
+        dataApprovalLevel2 = new DataApprovalLevel( "2", 2, null );
+        dataApprovalLevel3 = new DataApprovalLevel( "3", 3, null );
+        dataApprovalLevel4 = new DataApprovalLevel( "4", 4, null );
 
         userA = createUser( 'A' );
         userB = createUser( 'B' );
@@ -387,14 +387,14 @@
         groupSetB.addCategoryOptionGroup( groupC );
         groupSetB.addCategoryOptionGroup( groupD );
 
-        dataApprovalLevel1A = new DataApprovalLevel( 1, groupSetA );
-        dataApprovalLevel1B = new DataApprovalLevel( 1, groupSetB );
-        dataApprovalLevel2A = new DataApprovalLevel( 2, groupSetA );
-        dataApprovalLevel2B = new DataApprovalLevel( 2, groupSetB );
-        dataApprovalLevel3A = new DataApprovalLevel( 3, groupSetA );
-        dataApprovalLevel3B = new DataApprovalLevel( 3, groupSetB );
-        dataApprovalLevel4A = new DataApprovalLevel( 4, groupSetA );
-        dataApprovalLevel4B = new DataApprovalLevel( 4, groupSetB );
+        dataApprovalLevel1A = new DataApprovalLevel( "1A", 1, groupSetA );
+        dataApprovalLevel1B = new DataApprovalLevel( "1B",1, groupSetB );
+        dataApprovalLevel2A = new DataApprovalLevel( "2A", 2, groupSetA );
+        dataApprovalLevel2B = new DataApprovalLevel( "2B", 2, groupSetB );
+        dataApprovalLevel3A = new DataApprovalLevel( "3A", 3, groupSetA );
+        dataApprovalLevel3B = new DataApprovalLevel( "3B", 3, groupSetB );
+        dataApprovalLevel4A = new DataApprovalLevel( "4A", 4, groupSetA );
+        dataApprovalLevel4B = new DataApprovalLevel( "4B", 4, groupSetB );
     }
 
     // -------------------------------------------------------------------------

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ExchangeClasses.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ExchangeClasses.java	2014-03-27 15:10:38 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/ExchangeClasses.java	2014-04-03 16:03:26 +0000
@@ -35,6 +35,7 @@
 import org.hisp.dhis.concept.Concept;
 import org.hisp.dhis.constant.Constant;
 import org.hisp.dhis.dashboard.Dashboard;
+import org.hisp.dhis.dataapproval.DataApprovalLevel;
 import org.hisp.dhis.datadictionary.DataDictionary;
 import org.hisp.dhis.dataelement.CategoryOptionGroup;
 import org.hisp.dhis.dataelement.CategoryOptionGroupSet;
@@ -156,6 +157,8 @@
         allExportClasses.put( Report.class, "reports" );
         allExportClasses.put( Chart.class, "charts" );
         allExportClasses.put( EventReport.class, "eventReports" );
+        
+        allExportClasses.put( DataApprovalLevel.class, "dataApprovalLevels" );
 
         allExportClasses.put( Dashboard.class, "dashboards" );
 

=== modified file 'dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/MetaData.java'
--- dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/MetaData.java	2014-03-27 15:10:38 +0000
+++ dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/MetaData.java	2014-04-03 16:03:26 +0000
@@ -42,6 +42,7 @@
 import org.hisp.dhis.concept.Concept;
 import org.hisp.dhis.constant.Constant;
 import org.hisp.dhis.dashboard.Dashboard;
+import org.hisp.dhis.dataapproval.DataApprovalLevel;
 import org.hisp.dhis.datadictionary.DataDictionary;
 import org.hisp.dhis.dataelement.CategoryOptionGroup;
 import org.hisp.dhis.dataelement.CategoryOptionGroupSet;
@@ -104,9 +105,11 @@
     private Date created;
 
     private List<Schema> schemas = Lists.newArrayList();
-
+    
     private List<Attribute> attributes = new ArrayList<Attribute>();
 
+    private List<DataApprovalLevel> dataApprovalLevels = new ArrayList<DataApprovalLevel>();
+    
     private List<Document> documents = new ArrayList<Document>();
 
     private List<Constant> constants = new ArrayList<Constant>();
@@ -256,6 +259,19 @@
     }
 
     @JsonProperty
+    @JacksonXmlElementWrapper( localName = "dataApprovalLevels", namespace = DxfNamespaces.DXF_2_0 )
+    @JacksonXmlProperty( localName = "dataApprovalLevel", namespace = DxfNamespaces.DXF_2_0 )
+    public List<DataApprovalLevel> getDataApprovalLevels()
+    {
+        return dataApprovalLevels;
+    }
+
+    public void setDataApprovalLevels( List<DataApprovalLevel> dataApprovalLevels )
+    {
+        this.dataApprovalLevels = dataApprovalLevels;
+    }
+
+    @JsonProperty
     @JacksonXmlElementWrapper( localName = "users", namespace = DxfNamespaces.DXF_2_0 )
     @JacksonXmlProperty( localName = "user", namespace = DxfNamespaces.DXF_2_0 )
     public List<User> getUsers()

=== modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/TextUtils.java'
--- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/TextUtils.java	2014-03-22 15:30:31 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/TextUtils.java	2014-04-03 16:03:26 +0000
@@ -42,6 +42,7 @@
 {
     public static final TextUtils INSTANCE = new TextUtils();
     public static final String EMPTY = "";
+    public static final String SPACE = "";
     public static final String LN = System.getProperty( "line.separator" );
     
     private static final Pattern LINK_PATTERN = Pattern.compile( "((http://|https://|www\\.).+?)($|\\n|\\r|\\r\\n| )" );

=== added file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataApprovalLevelController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataApprovalLevelController.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataApprovalLevelController.java	2014-04-03 16:03:26 +0000
@@ -0,0 +1,41 @@
+package org.hisp.dhis.api.controller;
+
+/*
+ * Copyright (c) 2004-2014, University of Oslo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of the HISP project nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import org.hisp.dhis.dataapproval.DataApprovalLevel;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping( value = DataApprovalLevelController.RESOURCE_PATH )
+public class DataApprovalLevelController
+    extends AbstractCrudController<DataApprovalLevel>
+{
+    public static final String RESOURCE_PATH = "/dataApprovalLevels";
+}

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/AddApprovalLevelAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/AddApprovalLevelAction.java	2014-03-31 11:43:23 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/AddApprovalLevelAction.java	2014-04-03 16:03:26 +0000
@@ -32,9 +32,14 @@
 import org.hisp.dhis.dataapproval.DataApprovalLevelService;
 import org.hisp.dhis.dataelement.CategoryOptionGroupSet;
 import org.hisp.dhis.dataelement.DataElementCategoryService;
+import org.hisp.dhis.organisationunit.OrganisationUnitLevel;
+import org.hisp.dhis.organisationunit.OrganisationUnitService;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import com.opensymphony.xwork2.Action;
 
+import static org.hisp.dhis.system.util.TextUtils.*;
+
 /**
  * @author Jim Grace
  */
@@ -45,20 +50,15 @@
     // Dependencies
     // -------------------------------------------------------------------------
 
+    @Autowired
     private DataApprovalLevelService dataApprovalLevelService;
 
-    public void setDataApprovalLevelService( DataApprovalLevelService dataApprovalLevelService )
-    {
-        this.dataApprovalLevelService = dataApprovalLevelService;
-    }
-
+    @Autowired
     private DataElementCategoryService categoryService;
 
-    public void setCategoryService( DataElementCategoryService categoryService )
-    {
-        this.categoryService = categoryService;
-    }
-
+    @Autowired
+    private OrganisationUnitService organisationUnitService;
+    
     // -------------------------------------------------------------------------
     // Input
     // -------------------------------------------------------------------------
@@ -83,14 +83,18 @@
 
     public String execute()
     {
-        CategoryOptionGroupSet catOptGroupSet = null;
+        CategoryOptionGroupSet groupSet = null;
 
         if ( categoryOptionGroupSet != 0 )
         {
-            catOptGroupSet = categoryService.getCategoryOptionGroupSet( categoryOptionGroupSet );
+            groupSet = categoryService.getCategoryOptionGroupSet( categoryOptionGroupSet );
         }
+        
+        OrganisationUnitLevel ouLevel = organisationUnitService.getOrganisationUnitLevelByLevel( organisationUnitLevel );
+        
+        String name = ouLevel.getName() + ( groupSet != null ? SPACE + groupSet.getName() : EMPTY ); 
 
-        DataApprovalLevel dataApprovalLevel = new DataApprovalLevel( organisationUnitLevel, catOptGroupSet );
+        DataApprovalLevel dataApprovalLevel = new DataApprovalLevel( name, organisationUnitLevel, groupSet );
 
         dataApprovalLevelService.addDataApprovalLevel( dataApprovalLevel );
 

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/ValidateApprovalLevelAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/ValidateApprovalLevelAction.java	2014-03-31 11:43:23 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/ValidateApprovalLevelAction.java	2014-04-03 16:03:26 +0000
@@ -64,7 +64,7 @@
     {
         CategoryOptionGroupSet catOptGroupSet = categoryService.getCategoryOptionGroupSet( categoryOptionGroupSet );
         
-        DataApprovalLevel level = new DataApprovalLevel( organisationUnitLevel, catOptGroupSet );
+        DataApprovalLevel level = new DataApprovalLevel( null, organisationUnitLevel, catOptGroupSet );
         
         boolean exists = dataApprovalLevelService.dataApprovalLevelExists( level );
 

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/resources/META-INF/dhis/beans.xml	2014-03-31 11:43:23 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/resources/META-INF/dhis/beans.xml	2014-04-03 16:03:26 +0000
@@ -76,8 +76,6 @@
   <bean id="org.hisp.dhis.settings.action.system.AddApprovalLevelAction"
       class="org.hisp.dhis.settings.action.system.AddApprovalLevelAction"
       scope="prototype">
-    <property name="dataApprovalLevelService" ref="org.hisp.dhis.dataapproval.DataApprovalLevelService" />
-    <property name="categoryService" ref="org.hisp.dhis.dataelement.DataElementCategoryService" />
   </bean>
 
   <bean id="org.hisp.dhis.settings.action.system.GetAddApprovalLevelFormParameters"