Index: main/waeup.kofa/trunk/CHANGES.txt
===================================================================
--- main/waeup.kofa/trunk/CHANGES.txt	(revision 14638)
+++ main/waeup.kofa/trunk/CHANGES.txt	(revision 14642)
@@ -4,4 +4,7 @@
 1.6.dev0 (unreleased)
 =======================
+
+* Add `course_category` attribute to course tickets. In the base package,
+  this attribute is omitted from display and manage pages.
 
 * Add `course_category` attribute to certificate courses.
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py	(revision 14638)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py	(revision 14642)
@@ -658,5 +658,5 @@
             'student_id','reg_number','matric_number',
             'mandatory', 'score', 'carry_over', 'automatic',
-            'outstanding', 'level_session',
+            'outstanding', 'course_category', 'level_session',
             'title', 'credits', 'passmark', 'semester'
             ] + self.additional_fields
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 14638)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 14642)
@@ -132,4 +132,6 @@
         value_dict['outstanding'] = translate(str(value.outstanding), 'zope',
             target_language=lang)
+        value_dict['course_category'] = translate(str(value.course_category), 
+            'zope', target_language=lang)
         value_dict['automatic'] = translate(str(value.automatic), 'zope',
             target_language=lang)
@@ -1658,5 +1660,5 @@
     grok.name('index')
     grok.require('waeup.viewStudent')
-    form_fields = grok.AutoFields(ICourseTicket)
+    form_fields = grok.AutoFields(ICourseTicket).omit('course_category')
     grok.template('courseticketpage')
     pnav = 4
@@ -1674,5 +1676,5 @@
     grok.name('manage')
     grok.require('waeup.manageStudent')
-    form_fields = grok.AutoFields(ICourseTicket)
+    form_fields = grok.AutoFields(ICourseTicket).omit('course_category')
     form_fields['title'].for_display = True
     form_fields['fcode'].for_display = True
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 14638)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 14642)
@@ -34,5 +34,6 @@
     IPaymentsContainer, IOnlinePayment)
 from waeup.kofa.university.vocabularies import (
-    CourseSource, StudyModeSource, CertificateSource, SemesterSource,
+    CourseSource, StudyModeSource, CertificateSource,
+    SemesterSource, CourseCategorySource
     )
 
@@ -697,4 +698,10 @@
         )
 
+    course_category = schema.Choice(
+        title = _(u'Course Category'),
+        source = CourseCategorySource(),
+        required = False,
+        )
+
     score = schema.Int(
         title = _(u'Score'),
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py	(revision 14638)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py	(revision 14642)
@@ -264,4 +264,5 @@
                 ticket.mandatory = val.mandatory
                 ticket.carry_over = False
+                ticket.course_category = val.course_category
                 self.addCourseTicket(ticket, val.course)
         return
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 14638)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 14642)
@@ -2519,4 +2519,6 @@
         self.assertTrue(
             self.student['studycourse']['200']['COURSE1'].carry_over is True)
+        self.assertTrue(
+            self.student['studycourse']['200']['COURSE1'].course_category is None)
         # Students can open the pdf course registration slip
         self.browser.open(self.student_path + '/studycourse/200')
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 14638)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py	(revision 14642)
@@ -613,8 +613,8 @@
         self.assertEqual(
             result,
-            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
+            'automatic,carry_over,code,course_category,credits,dcode,fcode,level,level_session,'
             'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
             'display_fullname\r\n'
-            '0,0,,,,,,,0,0,,,,,,,\r\n'
+            '0,0,,,,,,,,0,0,,,,,,,\r\n'
             )
         return
@@ -632,8 +632,8 @@
         self.assertEqual(
             result,
-            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
+            'automatic,carry_over,code,course_category,credits,dcode,fcode,level,level_session,'
             'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
             'display_fullname\r\n'
-            '1,1,CRS1,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
+            '1,1,CRS1,,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
             'Anna M. Tester\r\n'
             )
@@ -649,8 +649,8 @@
         self.assertEqual(
             result,
-            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
+            'automatic,carry_over,code,course_category,credits,dcode,fcode,level,level_session,'
             'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
             'display_fullname\r\n'
-            '1,1,CRS1,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
+            '1,1,CRS1,,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
             'Anna M. Tester\r\n'
             )
@@ -665,8 +665,8 @@
         self.assertEqual(
             result,
-            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
+            'automatic,carry_over,code,course_category,credits,dcode,fcode,level,level_session,'
             'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
             'display_fullname\r\n'
-            '1,1,CRS1,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
+            '1,1,CRS1,,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
             'Anna M. Tester\r\n'
             )
@@ -685,8 +685,8 @@
         self.assertEqual(
             result,
-            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
+            'automatic,carry_over,code,course_category,credits,dcode,fcode,level,level_session,'
             'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
             'display_fullname\r\n'
-            '1,1,CRS1,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
+            '1,1,CRS1,,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
             'Anna M. Tester\r\n'
             )
@@ -699,8 +699,8 @@
         self.assertEqual(
             result,
-            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
+            'automatic,carry_over,code,course_category,credits,dcode,fcode,level,level_session,'
             'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
             'display_fullname\r\n'
-            '1,1,CRS1,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
+            '1,1,CRS1,,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
             'Anna M. Tester\r\n'
             )
@@ -710,5 +710,5 @@
         self.assertEqual(
             result,
-            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
+            'automatic,carry_over,code,course_category,credits,dcode,fcode,level,level_session,'
             'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
             'display_fullname\r\n'
@@ -723,8 +723,8 @@
         self.assertEqual(
             result,
-            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
+            'automatic,carry_over,code,course_category,credits,dcode,fcode,level,level_session,'
             'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
             'display_fullname\r\n'
-            '1,1,CRS1,100,DEP1,FAC1,110,2012,0,0,100,,2,Course 1,A111111,CERT1,'
+            '1,1,CRS1,,100,DEP1,FAC1,110,2012,0,0,100,,2,Course 1,A111111,CERT1,'
             'Anna M. Tester\r\n'
             )
