Index: WAeUP_SRP/base/Academics.py
===================================================================
--- WAeUP_SRP/base/Academics.py	(revision 2281)
+++ WAeUP_SRP/base/Academics.py	(revision 2282)
@@ -687,7 +687,7 @@
         export = []
         heading = '"code","review_state","faculty_code","department_code",'
-        heading += '"certificate_code","level","semester","core_or_elective"'
+        heading += '"certificate_code","level","core_or_elective"'
         dataline = '"%(code)s","%(review_state)s","%(faculty_code)s","%(department_code)s",'
-        dataline += '"%(certificate_code)s","%(level)s","%(semester)s","%(core_or_elective)s"'
+        dataline += '"%(certificate_code)s","%(level)s","%(core_or_elective)s"'
         export.append(heading)
         #import pdb;pdb.set_trace()
@@ -702,19 +702,15 @@
                     for level in certificate.objectValues():
                         di['level'] = level.id
-                        for sem in semesters:
-                            semester = getattr(level,sem,None)
-                            if semester is not None:
-                                di['semester'] = semesters.index(sem) + 1
-                                for course in semester.objectValues():
-                                    di['code'] = course.getId()
-                                    course_d = course.getContent()
-                                    di['core_or_elective'] = getattr(course_d,'core_or_elective',None)
-                                    di['review_state'] = self.portal_workflow.getInfoFor(course,'review_state','no_state')
-                                    try:
-                                        export.append(dataline % di)
-                                        logger.info('Exporting %s %s ' % (certificate.id, certificate.title))
-                                    except:
-                                        logger.info('Could not export %s %s ' % (certificate.id, certificate.title))
-                                        continue
+                        for course in level.objectValues():
+                            di['code'] = course.getId()
+                            course_d = course.getContent()
+                            di['core_or_elective'] = getattr(course_d,'core_or_elective',None)
+                            di['review_state'] = self.portal_workflow.getInfoFor(course,'review_state','no_state')
+                            try:
+                                export.append(dataline % di)
+                                logger.info('Exporting %s %s ' % (certificate.id, certificate.title))
+                            except:
+                                logger.info('Could not export %s %s ' % (certificate.id, certificate.title))
+                                continue
         open("%s/export/%s-%s.csv" % (i_home,name,current),"w+").write('\n'.join(export))
         return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
Index: WAeUP_SRP/base/WAeUPTool.py
===================================================================
--- WAeUP_SRP/base/WAeUPTool.py	(revision 2281)
+++ WAeUP_SRP/base/WAeUPTool.py	(revision 2282)
@@ -998,9 +998,9 @@
             self._v_departments = {}
             for d in res:
-                self._v_departments[d.getId] = d.getObject()
+                self._v_departments[d.getId] = getattr(d.getObject(),"courses",None)
         did = mapping['department_code']
         d = self._v_departments.get(did,None)
         if d is None:
-            return '', "No Department with ID: %s" % fid
+            return '', "No Department with ID: %s" % did
         course_id = mapping.get('code')
         if course_id in self._v_course_list:
@@ -1014,4 +1014,85 @@
         c.getContent().edit(mapping=mapping)
         return course_id,''
+    ###)
+
+    security.declareProtected(ModifyPortalContent,'mass_edit_course') ###(
+    def mass_edit_course(self,mapping):
+        #import pdb;pdb.set_trace()
+        course_id = mapping.get('code')
+        res = self.portal_catalog(id=course_id)
+        if not res:
+            return '', "No Course with ID: %s" % did
+        c = res[0].getObject()
+        c.getContent().edit(mapping=mapping)
+        return course_id,''
+    ###)
+
+    security.declareProtected(ModifyPortalContent,'mass_create_certificate') ###(
+    def mass_create_certificate(self,mapping):
+        if getattr(self,'_v_certificate_list',None) is None:
+            self._v_certificate_list = []
+        if getattr(self,'_v_departments',None) is None:
+            res = self.portal_catalog(portal_type = "Department")
+            self._v_departments = {}
+            for d in res:
+                self._v_departments[d.getId] = getattr(d.getObject(),"certificates",None)
+        did = mapping['department_code']
+        d = self._v_departments.get(did,None)
+        if d is None:
+            return '', "No Department with ID: %s" % did
+        certificate_id = mapping.get('code')
+        if certificate_id in self._v_certificate_list:
+            return '', "Duplicate Department ID: %s" % did
+        c = getattr(d,certificate_id,None)
+        if c is not None:
+            return '', "Duplicate Department ID: %s" % did
+        d.invokeFactory('Certificate', certificate_id)
+        self._v_certificate_list.append(certificate_id)
+        c = getattr(d,certificate_id)
+        c.getContent().edit(mapping=mapping)
+        return certificate_id,''
+    ###)
+
+    security.declareProtected(ModifyPortalContent,'mass_edit_certificate') ###(
+    def mass_edit_certificate(self,mapping):
+        #import pdb;pdb.set_trace()
+        certificate_id = mapping.get('code')
+        res = self.portal_catalog(id=certificate_id)
+        if not res:
+            return '', "No Certificate with ID: %s" % did
+        c = res[0].getObject()
+        c.getContent().edit(mapping=mapping)
+        return certificate_id,''
+    ###)
+
+    security.declareProtected(ModifyPortalContent,'mass_create_certificate_course') ###(
+    def mass_create_certificate_course(self,mapping):
+        if getattr(self,'_v_certificate_course_list',None) is None:
+            self._v_certificate_course_list = []
+        if getattr(self,'_v_ceritficates',None) is None:
+            res = self.portal_catalog(portal_type = "Certificate")
+            self._v_certificates = {}
+            for cert in res:
+                self._v_certificates[cert.getId] = cert.getObject()
+        cert_id = mapping['certificate_code']
+        cert = self._v_certificates.get(cert_id,None)
+        if cert is None:
+            return '', "No Certificate with ID: %s" % did
+        certificate_course_id = mapping.get('code')
+        if certificate_course_id in self._v_certificate_course_list:
+            return '', "Duplicate CertificateCourse ID: %s" % certificate_course_id
+        level_id = mapping.get('level')
+        level = getattr(cert,level_id,None)
+        if level is None:
+            cert.invokeFactory('StudyLevel', level_id)
+            level = getattr(cert,level_id,None)
+        elif hasattr(level,certificate_course_id):
+            return '', "Duplicate CertificateCourse ID: %s in %s/ %s" %\
+            (certificate_course_id,cert_id,level_id)
+        level.invokeFactory('CertificateCourse', certificate_course_id)
+        self._v_certificate_course_list.append(certificate_course_id)
+        c = getattr(level,certificate_course_id)
+        c.getContent().edit(mapping=mapping)
+        return certificate_course_id,''
     ###)
 
@@ -1300,5 +1381,5 @@
                 diff2layout = set(import_keys).difference(set(layout.keys()))
                 if diff2schema:
-                    em = "not ignorable key(s) %s found in heading" % diff2schema
+                    em = 'not ignorable key(s): "%s" found in heading' % ", ".join(diff2schema)
                     return em
                 s = ','.join(['"%s"' % fn for fn in import_keys])
Index: WAeUP_SRP/base/Widgets.py
===================================================================
--- WAeUP_SRP/base/Widgets.py	(revision 2281)
+++ WAeUP_SRP/base/Widgets.py	(revision 2282)
@@ -165,5 +165,5 @@
             value = datastructure[widget_id].upper()
             err = 0
-            res = self.portal_catalog(meta_type= "Course",id = value)
+            res = self.courses_catalog(code = value)
             if len(res) > 0:
                 err = 'Course already exists'
Index: WAeUP_SRP/base/skins/waeup_academics/getFacultiesInfo.py
===================================================================
--- WAeUP_SRP/base/skins/waeup_academics/getFacultiesInfo.py	(revision 2281)
+++ WAeUP_SRP/base/skins/waeup_academics/getFacultiesInfo.py	(revision 2282)
@@ -43,5 +43,4 @@
     except AttributeError:
         continue
-            
 items.sort(cmp_id)
 info['items'] = items
Index: WAeUP_SRP/base/skins/waeup_default/get_csv_names.py
===================================================================
--- WAeUP_SRP/base/skins/waeup_default/get_csv_names.py	(revision 2281)
+++ WAeUP_SRP/base/skins/waeup_default/get_csv_names.py	(revision 2282)
@@ -7,5 +7,7 @@
 files = context.waeup_tool.get_csv_filenames()
 if key is None:
-    return [(f[:-4],f) for f in files]
+    l = [(f[:-4],f) for f in files]
+    l.sort(cmp=lambda x,y: cmp(x[0].lower(), y[0].lower()))
+    return l
 
 return files[files.index("%s.csv" % key)]
