Index: main/waeup.kofa/trunk/CHANGES.txt
===================================================================
--- main/waeup.kofa/trunk/CHANGES.txt	(revision 16811)
+++ main/waeup.kofa/trunk/CHANGES.txt	(revision 16812)
@@ -4,4 +4,6 @@
 1.7.2.dev0 (unreleased)
 =======================
+
+* Add 'Modules Level'.
 
 * Ease customization of portrait upload conditions.
Index: main/waeup.kofa/trunk/src/waeup/kofa/doctests/pages.txt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/doctests/pages.txt	(revision 16811)
+++ main/waeup.kofa/trunk/src/waeup/kofa/doctests/pages.txt	(revision 16812)
@@ -611,8 +611,8 @@
   >>> ctrl = browser.getControl(name='form.semester')
   >>> ctrl.options
-  ['1', '2', '3', '9']
+  ['1', '4', '2', '5', '6', '3', '11', '12', '13', '9']
 
   >>> ctrl.displayOptions
-  ['1st Semester', '2nd Semester', 'Combined', 'N/A']
+  ['1st Semester', '1st Term', '2nd Semester', '2nd Term', '3rd Term', 'Combined', 'Module I', 'Module II', 'Module III', 'N/A']
 
   >>> ctrl.value = ['1']
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 16811)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 16812)
@@ -3694,5 +3694,5 @@
 
     def _searchCatalog(self, session, level):
-        if level not in (10, 999, None):
+        if level not in (10, 999, 1000, None):
             start_level = 100 * (level // 100)
             end_level = start_level + 90
@@ -3745,5 +3745,5 @@
 
     def _searchCatalog(self, session, level):
-        if level not in (10, 999, None):
+        if level not in (10, 999, 1000, None):
             start_level = 100 * (level // 100)
             end_level = start_level + 90
@@ -3774,5 +3774,5 @@
 
     def _searchCatalog(self, session, level):
-        if level not in (10, 999, None):
+        if level not in (10, 999, 1000, None):
             start_level = 100 * (level // 100)
             end_level = start_level + 90
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/export.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/export.py	(revision 16811)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/export.py	(revision 16812)
@@ -81,5 +81,5 @@
             for ticket in level_obj.values():
                 if ct_level not in ('all', None):
-                    if level_obj.level in (10, 999, None)  \
+                    if level_obj.level in (10, 999, 1000, None)  \
                         and int(ct_level) != level_obj.level:
                         continue
@@ -100,5 +100,5 @@
                     continue
                 if level not in ('all', None):
-                    if level_obj.level in (10, 999, None)  \
+                    if level_obj.level in (10, 999, 1000, None)  \
                         and int(level) != level_obj.level:
                         continue
@@ -130,5 +130,5 @@
             #    continue
             if level not in ('all', None):
-                if level_obj.level in (10, 999, None)  \
+                if level_obj.level in (10, 999, 1000, None)  \
                     and int(level) != level_obj.level:
                     continue
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_batching.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_batching.py	(revision 16811)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_batching.py	(revision 16812)
@@ -794,4 +794,7 @@
         errs, inv_errs, conv_dict = self.processor.checkConversion(
             dict(reg_number='1', level='1000'))
+        self.assertEqual(len(errs),0)
+        errs, inv_errs, conv_dict = self.processor.checkConversion(
+            dict(reg_number='1', level='1100'))
         self.assertEqual(len(errs),1)
         self.assertTrue(('level', u'Invalid value') in errs)
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py	(revision 16811)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py	(revision 16812)
@@ -1570,7 +1570,7 @@
              'entry_session,current_level,current_session,'
              '0,10,100,110,120,200,210,220,300,310,320,400,410,420,500,'
-             '510,520,600,610,620,700,710,720,800,810,820,900,910,920,999\r\n'
+             '510,520,600,610,620,700,710,720,800,810,820,900,910,920,999,1000\r\n'
              'A111111,created,CERT1,NA,NA,0,2010,200,2012,,,2012'
-             ',,,,,,,,,,,,,,,,,,,,,,,,,,,\r\n',
+             ',,,,,,,,,,,,,,,,,,,,,,,,,,,,\r\n',
             result
             )
@@ -1586,7 +1586,7 @@
             'entry_session,current_level,current_session,'
             '0,10,100,110,120,200,210,220,300,310,320,400,410,420,500,'
-            '510,520,600,610,620,700,710,720,800,810,820,900,910,920,999\r\n'
+            '510,520,600,610,620,700,710,720,800,810,820,900,910,920,999,1000\r\n'
             'A111111,created,CERT1,NA,NA,0,2010,200,2012,,,2012'
-            ',,,,,,,,,,,,,,,,,,,,,,,,,,,\r\n',
+            ',,,,,,,,,,,,,,,,,,,,,,,,,,,,\r\n',
             result
             )
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_vocabularies.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_vocabularies.py	(revision 16811)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_vocabularies.py	(revision 16812)
@@ -31,5 +31,5 @@
              100, 110, 120, 200, 210, 220, 300, 310, 320, 400, 410, 420,
              500, 510, 520, 600, 610, 620, 700, 710, 720, 800, 810, 820,
-             900, 910, 920, 999,])
+             900, 910, 920, 999, 1000,])
         # edge-case: level 10
         self.assertEqual(
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/vocabularies.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/vocabularies.py	(revision 16811)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/vocabularies.py	(revision 16812)
@@ -49,8 +49,10 @@
     if 999 in (start_level, end_level):
         return [999]
+    if 1000 in (start_level, end_level):
+        return [1000]
     levels = [10,] + [
         level for level in range(100,1000,10) if level % 100 < 30]
     if start_level is None and end_level is None:
-        return levels + [999]
+        return levels + [999, 1000]
     if start_level == 10 == end_level:
         return [10,]
@@ -105,8 +107,14 @@
                 return _('Error: wrong level id ${value}',
                     mapping={'value': value})
+        if value == 0:
+            return _('Level Zero')
         if value == 999:
             return course_levels.by_value[999].title
-        if value == 0:
-            return _('Level Zero')
+        if 1000 in (start_level, end_level):
+            if value != 1000:
+                return _('Error: wrong level id ${value}',
+                    mapping={'value': value})
+        if value == 1000:
+            return course_levels.by_value[1000].title
         if start_level == 10 and end_level == 10 and value != 10:
             return _('Error: level id ${value} out of range',
Index: main/waeup.kofa/trunk/src/waeup/kofa/university/vocabularies.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/university/vocabularies.py	(revision 16811)
+++ main/waeup.kofa/trunk/src/waeup/kofa/university/vocabularies.py	(revision 16812)
@@ -40,4 +40,5 @@
     (_('900 (Year 9)'),900),
     (_('Postgraduate Level'),999),
+    (_('Modules Level'),1000),
     )
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py	(revision 16811)
+++ main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py	(revision 16812)
@@ -158,5 +158,11 @@
         2: '2nd Semester',
         3: 'Combined',
-        9: 'N/A'
+        4: '1st Term',
+        5: '2nd Term',
+        6: '3rd Term',
+        9: 'N/A',
+        11: 'Module I',
+        12: 'Module II',
+        13: 'Module III',
         }
 
