Index: /waeup_product/trunk/CHANGES
===================================================================
--- /waeup_product/trunk/CHANGES	(revision 19)
+++ /waeup_product/trunk/CHANGES	(revision 19)
@@ -0,0 +1,12 @@
+Requires:
+~~~~~~~~~
+-
+New features:
+~~~~~~~~~~~~~
+-
+Bug fixes:
+~~~~~~~~~~
+-
+New internal features:
+~~~~~~~~~~~~~~~~~~~~~~
+-
Index: /waeup_product/trunk/Extensions/install.py
===================================================================
--- /waeup_product/trunk/Extensions/install.py	(revision 19)
+++ /waeup_product/trunk/Extensions/install.py	(revision 19)
@@ -0,0 +1,144 @@
+from Products.CPSInstaller.CPSInstaller import CPSInstaller
+from Products.CMFCore.CMFCorePermissions import View
+try:
+  from Products.CPSSubscriptions.CPSSubscriptionsPermissions import \
+     CanNotifyContent
+  CPSSubscriptions = True
+except ImportError:
+  CPSSubscriptions = False
+try:
+  from Products.CPSForum.CPSForumPermissions import \
+     ForumManageComments
+  CPSForum = True
+except ImportError:
+  CPSForum = False
+
+class WAeUPInstaller(CPSInstaller):
+    """
+    WAeUP Installer
+    """
+    product_name = "WAeUP"
+
+    def install(self,portal):
+        "install"
+
+        product_name = self.product_name
+        self.log("Starting %(product_name)s install" % vars() )
+    
+        ##########################################
+        # Actions
+        ##########################################
+        if CPSSubscriptions:
+            ptypes = "('Portal', 'CPSMailAccess Message', 'CPSMailAccess Box', 'CPSMailAccess Folder',"\
+                     +  "'StudentFolder', 'Student', 'Jamb')"
+            condition = "object.portal_type not in %s" % ptypes
+    
+            action = {'id' : 'notify_content',
+                      'name' : 'action_notify_content',
+                      'action' : 'string:${object_url}/content_notify_email_form',
+                      'condition' : 'python:%s' % condition,
+                      'permission' :  (CanNotifyContent,),
+                      'category' : 'object',
+                      }
+            self.deleteActions({'portal_subscriptions': ['notify_content',]})
+            self.verifyAction('portal_subscriptions', **action)
+        if CPSForum:
+            ptypes = "('StudentFolder', 'Student', 'Jamb')"
+            condition = "object.portal_type not in %s" % ptypes
+    
+            action = {'id' : 'activate_comments',
+                      'name': 'action_activate_comments',
+                      'action': 'string:${object/absolute_url}/set_comment_mode?mode=1',
+                      'condition' : 'python:%s' % condition,
+                      'permission': (ForumManageComments,),
+                      'category' : 'object',
+                      }
+            self.deleteActions({'portal_discussion': ['activate_comments',]})
+            self.verifyAction('portal_subscriptions', **action)
+        
+        ##########################################
+        # SKINS
+        ##########################################
+        self.log("Verifying %(product_name)s skinss" % vars())
+        wskins = { 'waeup_default' : 'Products/WAeUP/skins/waeup_default',
+                   'waeup_student' : 'Products/WAeUP/skins/waeup_student',
+                 }
+        self.verifySkins(wskins)
+        self.resetSkinCache()
+        ##########################################
+        # PORTAL TYPES
+        ##########################################
+        dtypes = portal.getWAeUPTypes()
+        self.verifyFlexibleTypes(dtypes)
+        self.allowContentTypes('StudentFolder', ('Workspace','Section',))
+        #self.allowContentTypes('Student', ('Workspace', 'Section'))
+        ptypes = {
+                  'StudentFolder' : {
+                  'allowed_content_types': ('Student',),
+                  'typeinfo_name': 'WAeUP: StudentFolder',
+                  'add_meta_type': 'Factory-based Type Information',
+                  },
+                  'Student' : {
+                  'allowed_content_types': ('Jamb',),
+                  'typeinfo_name': 'WAeUP: Student',
+                  'add_meta_type': 'Factory-based Type Information',
+                  },
+                 }
+        self.verifyContentTypes(ptypes)
+        ##########################################
+        # PORTAL Schemas
+        ##########################################
+        self.log("Verifying %(product_name)s schemas" % vars())
+        self.verifySchemas(portal.getWAeUPSchemas())
+        ##########################################
+        # PORTAL layouts
+        ##########################################
+        self.log("Verifying %(product_name)s layouts" % vars())
+        self.verifyLayouts(portal.getWAeUPLayouts())
+        ##########################################
+        # PORTAL Vocabularies
+        ##########################################
+        self.log("Verifying %(product_name)s vocabularies" % vars())
+        self.verifyVocabularies(portal.getWAeUPVocabularies())
+    
+        self.installCustomWorkflows()
+        self.verifyWorkflowAssociation()
+        
+        self.log("End of specific %(product_name)s install" % vars())
+        self.finalize()
+        
+
+    def installCustomWorkflows(self):
+        """Installs custom workflows
+        """
+        from Products.WAeUP.Workflows.WAeUPWorkflow import \
+             waeupWorkflowsInstall
+
+        waeupWorkflowsInstall(self.context)
+
+
+    def verifyWorkflowAssociation(self):
+        """Verify workflow association
+        """
+        ws_chains = { 
+                      'Student': 'waeup_workspace_wf',
+                      'Jamb': 'waeup_workspace_wf',
+                      }
+
+        se_chains = { 'StudentFolder': 'waeup_section_wf',
+                      'Student': 'waeup_section_wf',
+                      'Jamb': 'waeup_section_wf',
+                      }
+
+        self.verifyLocalWorkflowChains(self.portal['workspaces'],
+                                       ws_chains,
+                                       destructive=1)
+        self.verifyLocalWorkflowChains(self.portal['sections'],
+                                       se_chains,
+                                       destructive=1)
+
+
+def install(self):
+    installer = WAeUPInstaller(self)
+    installer.install(self)
+    return installer.logResult()
Index: /waeup_product/trunk/Extensions/install.py.260905
===================================================================
--- /waeup_product/trunk/Extensions/install.py.260905	(revision 19)
+++ /waeup_product/trunk/Extensions/install.py.260905	(revision 19)
@@ -0,0 +1,54 @@
+from Products.CPSInstaller.CPSInstaller import CPSInstaller
+from Products.CMFCore.CMFCorePermissions import View
+
+
+WAEUP_SKINS = { 'waeup_student' : 'Products/WAeUP/skins/waeup_student',
+                  }
+
+WAEUP_TYPES = { 'Student':
+                    { 'typeinfo_name': 'WAeUP: Student (Student)',
+                      'add_meta_type': 'Factory-based Type Information',
+                    },
+                  }
+
+WAEUP_ACTIONS = ( { 'tool'      : 'portal_actions',
+                        'id'        : 'jambadmission',
+                        'name'      : 'action_jambadmission',
+                        'action'    : 'string:${portal_url}/jambadmission_input_form',
+                        'permission': (View, ),
+                        'condition' : '',
+                        'category'  : 'global',
+                        'visible'   : 1,
+                      },
+                    )
+
+
+def install(self):
+    product_name = "WAeUP"
+    installer = CPSInstaller(self, product_name)
+    installer.log("Starting %(product_name)s install" % vars() )
+
+    installer.log("Verifying %(product_name)s permissions" % vars())
+    installer.verifySkins(WAEUP_SKINS)
+    installer.resetSkinCache()
+
+    installer.log("Verifying %(product_name)s schemas" % vars())
+    installer.verifySchemas(self.WAeUPSchemas())
+
+    installer.log("Verifying %(product_name)s layouts" % vars())
+    installer.verifyLayouts(self.WAeUPLayouts())
+    installer.verifyPortalTypes(WAEUP_TYPES)
+
+##    installer.log("Verifying %(product_name)s types" % vars())
+##    installer.verifyContentTypes(WAEUP_TYPES)
+
+    installer.log("Verifying %(product_name)s actions" % vars())
+    installer.verifyActions(WAEUP_ACTIONS) 
+    
+    # This installs the *.po files in the i18n directory of the WAeUPStudent
+    # product.
+    installer.log("Installing translations")
+    
+    installer.finalize()
+    installer.log("End of specific %(product_name)s install" % vars())
+    return installer.logResult()
Index: /waeup_product/trunk/Extensions/updateDirectories.py
===================================================================
--- /waeup_product/trunk/Extensions/updateDirectories.py	(revision 19)
+++ /waeup_product/trunk/Extensions/updateDirectories.py	(revision 19)
@@ -0,0 +1,95 @@
+from zLOG import LOG, DEBUG, INFO
+import re
+
+def update(self):
+
+    _log = []
+    def pr(bla, _log=_log):
+        if bla == 'flush':
+            return '\n'.join(_log)
+        _log.append(bla)
+        if (bla):
+            LOG('csvupdate:', INFO, bla)
+
+    pr("Directories update - started")
+    pr("")
+
+    portal = self.portal_url.getPortalObject()
+
+    csv_dir_name = 'csv'
+    csv_dir = getattr(portal,csv_dir_name)
+
+    members_file = 'Utilisateurs.csv'
+
+    try:
+        members_data = str(portal.restrictedTraverse("%s/%s" % (csv_dir_name, members_file)))
+    except KeyError:
+        members_data = ""
+        pr(" Warning: file %s not found. Directory members was not updated." % members_file)
+
+    if members_data:
+        members = []
+        pr("Updating Members directory")
+        member_schema_fields = ['id', 'password', 'givenName', 'sn', 'email', 'groups', 'roles']
+        lines = members_data.splitlines()
+       
+        CSV_SEPARATOR = ';'
+
+        for line in lines:
+            # Some items might contain the csv separator...
+            # Try to handle this gracefully, detecting separator
+            # followed by a space.
+           
+            member_items = line.split(CSV_SEPARATOR)
+
+            if member_items and not (len(member_items) == 1):
+                member_data = {}
+                for field in member_schema_fields:
+                    try:
+                        raw_field = member_items.pop(0).strip()
+                    except IndexError:
+                        raw_field = ''
+                        member_data['bad_entry'] = 1
+                    # Many fields are enclosed in double quotes 
+                    if raw_field and raw_field[0] == '"' and raw_field[-1] == '"':
+                        raw_field = raw_field[1:-1]
+                    member_data[field] = raw_field
+
+                member_data['confirm'] = member_data['password']
+                member_data['roles'] = member_data['roles'].capitalize()
+                if member_data['roles'] == 'Manager':
+                    member_data['roles'] = ('Manager', 'Member')
+                else:
+                    member_data['roles'] = ('Member',)
+                member_data['groups'] = tuple(member_data['groups'].split(','))
+
+                if not member_data.has_key('bad_entry'):
+                    # declare user as member of the portal
+                    members.append(member_data)
+                else:
+                    pr("** Bad entry detected **")
+                    pr("A data field might contain the csv separator not followed by a space.")
+                    pr("The id of this entry was %s."%member_data['id'])
+                    pr("The entry will NOT be added to the members directory.")
+
+
+        # create members in member directory
+        directory = portal.portal_directories.members
+        for member in members:
+            m_id = member.get('id')
+            pr('Directories update: checking entry '+m_id)
+            if not directory.hasEntry(m_id):
+                # member login does not exist, create
+                pr('Directories update:  creating entry '+m_id)
+                for gr in member['groups']:
+                    if not portal.portal_directories.groups.hasEntry(gr):
+                         portal.portal_directories.groups.createEntry({'group':gr})
+                directory.createEntry(member)
+            else:
+                # member login already exists
+                pr('Directories update:  entry '+m_id+' exists')
+    
+    pr("")
+    pr("Directories update - end")
+
+    return pr("flush")
Index: /waeup_product/trunk/README.txt
===================================================================
--- /waeup_product/trunk/README.txt	(revision 19)
+++ /waeup_product/trunk/README.txt	(revision 19)
@@ -0,0 +1,1 @@
+This is the Student Product for the WAeUP.
Index: /waeup_product/trunk/Student.py
===================================================================
--- /waeup_product/trunk/Student.py	(revision 19)
+++ /waeup_product/trunk/Student.py	(revision 19)
@@ -0,0 +1,70 @@
+from Globals import InitializeClass
+from AccessControl import ClassSecurityInfo
+
+from Products.CMFCore.utils import getToolByName
+from Products.CMFCore.permissions import View
+from Products.CMFCore.permissions import ModifyPortalContent
+from Products.CPSCore.CPSBase import CPSBase_adder, CPSBaseFolder 
+from Products.CPSCore.CPSBase import CPSBaseDocument as BaseDocument 
+#from Products.CMFCore.PortalContent import PortalContent
+#from Products.CMFCore.PortalFolder import PortalFolder
+#from Products.CMFCore.CMFCatalogAware import CMFCatalogAware
+
+#from Products.CMFCore.interfaces.Contentish import Contentish as IContentish
+#from Products.CMFCore.interfaces.Dynamic import DynamicType as IDynamicType
+from Products.CPSDocument.CPSDocument import CPSDocument
+
+factory_type_information = (
+    {'id': 'Student',
+     'meta_type': 'Student',
+     'description': 'The WAeUP Student',
+     'title': 'WAeUP Student',
+     'icon': 'student.gif',
+     'product': 'WAeUP',
+     'factory': 'addStudent',
+     'immediate_view': 'student_edit_form',
+     'filter_content_types': 1,
+     'allowed_content_types': ('JAMB'),
+     'allow_discussion': 0,
+     'actions': ({'id': 'view',
+                  'name': 'View',
+                  'action': 'student_view',
+                  'permissions': (View,)},
+                 {'id': 'addJamb',
+                  'name': 'new JAMB',
+                  'action': 'folder_factories',
+                  'permissions': (ModifyPortalContent,)},
+                 {'id': 'edit',
+                  'name': 'Edit',
+                  'action': 'student_edit_form',
+                  'permissions': (ModifyPortalContent,)},
+                 ),
+     # additionnal cps stuff
+      'cps_display_as_document_in_listing' : 1,
+     },
+    )
+
+class Student(BaseDocument):
+    """
+    WAeUP Student container for the various student data 
+    """
+##    meta_type = 'Student'
+##    portal_type = meta_type
+##    security = ClassSecurityInfo()
+
+##    _properties = BaseDocument._properties + (
+##        {'id': 'jamb_is_admitted', 'type': 'boolean'},
+##        {'id': 'jamb_where_admitted', 'type': 'string'},
+##        )
+
+##    allow_discussion = 0
+##    jamb_is_admitted = False
+##    jamb_where_admitted = ''
+    
+    
+InitializeClass(Student)
+
+def addStudent(container, id, REQUEST=None, **kw):
+    """Add a Student."""
+    ob = Student(id, **kw)
+    return CPSBase_adder(container, ob, REQUEST=REQUEST)
Index: /waeup_product/trunk/VERSION
===================================================================
--- /waeup_product/trunk/VERSION	(revision 19)
+++ /waeup_product/trunk/VERSION	(revision 19)
@@ -0,0 +1,1 @@
+0.1
Index: /waeup_product/trunk/WAeUPStudentWidgets.py
===================================================================
--- /waeup_product/trunk/WAeUPStudentWidgets.py	(revision 19)
+++ /waeup_product/trunk/WAeUPStudentWidgets.py	(revision 19)
@@ -0,0 +1,156 @@
+from Globals import InitializeClass
+from Products.CPSSchemas.Widget import CPSWidgetType
+from Products.CPSSchemas.BasicWidgets import CPSStringWidget, CPSEmailWidget
+from Products.CPSSchemas.ExtendedWidgets import CPSDateTimeWidget
+from Products.CPSSchemas.WidgetTypesTool import WidgetTypeRegistry
+from AccessControl import getSecurityManager
+
+from re import compile
+
+from zLOG import LOG, DEBUG
+
+class MyProjectWeekDateTimeWidget(CPSDateTimeWidget):
+    """ """
+    meta_type = "MyProject Week Date Time Widget"
+    
+    def validate(self, datastructure, **kw):
+        """Validate datastructure and update datamodel."""
+        
+        valid = CPSDateTimeWidget.validate(self, datastructure, **kw)
+        if not valid:
+            return 0
+        else:
+            widget_id = self.getWidgetId()
+            value = datastructure[widget_id]
+            err = 0
+            if value.dow() in (6, 0):
+                err = 'Cette date ne correspond pas à un jour de semaine'
+
+            if err:
+                datastructure.setError(widget_id, err)
+
+            return not err
+
+InitializeClass(MyProjectWeekDateTimeWidget)
+
+class MyProjectWeekDateTimeWidgetType(CPSWidgetType):
+    """MyProject Week DateTime widget type."""
+    meta_type = "MyProject Week Date Time Widget Type"
+    cls = MyProjectWeekDateTimeWidget
+
+InitializeClass(MyProjectWeekDateTimeWidgetType)
+
+class MyProjectRestrictedStringWidget(CPSStringWidget):
+    """ """
+    meta_type = "MyProject Restricted String Widget"
+    
+    def validate(self, datastructure, **kw):
+        """Validate datastructure and update datamodel."""
+        
+        valid = CPSStringWidget.validate(self, datastructure, **kw)
+        if not valid:
+            return 0
+        else:
+            widget_id = self.getWidgetId()
+            value = datastructure[widget_id]
+            err = 0
+            if not (len(value) == 5 and value.isupper() and value.isalpha()):
+                err = 'Cette chaîne ne correspond pas au format imposé'
+
+            if err:
+                datastructure.setError(widget_id, err)
+            else:
+                datamodel = datastructure.getDataModel()
+                datamodel[self.fields[0]] = value
+            
+            return not err
+
+InitializeClass(MyProjectRestrictedStringWidget)
+
+class MyProjectRestrictedStringWidgetType(CPSWidgetType):
+    """MyProject Restricted String widget type."""
+    meta_type = "MyProject Restricted String Widget Type"
+    cls = MyProjectRestrictedStringWidget
+
+InitializeClass(MyProjectRestrictedStringWidgetType)
+
+
+class MyProjectRestrictedEmailWidget(CPSEmailWidget):
+    """ """
+    meta_type = "MyProject Restricted Email Widget"
+
+    email_myproject_pat = compile(r"^([-\w_+])+\.([-\w_+])+@myproject\.fr$")
+
+    def validate(self, datastructure, **kw):
+        """Validate datastructure and update datamodel."""
+        
+        valid = CPSEmailWidget.validate(self, datastructure, **kw)
+        if not valid:
+            return 0
+        else:
+            widget_id = self.getWidgetId()
+            err, v = self._extractValue(datastructure[widget_id])
+            LOG('MyProject: MyProjectWidgets.py', DEBUG, "Valeur de v : %s" % v)
+            if not err and kw.get('layout_mode') != 'search' and \
+              v and not self.email_myproject_pat.match(v):
+                err = 'cpsschemas_err_email'
+
+            if err:
+                datastructure.setError(widget_id, err)
+            else:
+                datamodel = datastructure.getDataModel()
+                datamodel[self.fields[0]] = v
+            
+            return not err
+
+    def render(self, mode, datastructure, **kw):
+        """Render in mode from datastructure."""
+        return CPSStringWidget.render(self, mode, datastructure, **kw)
+
+InitializeClass(MyProjectRestrictedEmailWidget)
+
+class MyProjectRestrictedEmailWidgetType(CPSWidgetType):
+    """MyProject Restricted String widget type."""
+    meta_type = "MyProject Restricted Email Widget Type"
+    cls = MyProjectRestrictedEmailWidget
+
+InitializeClass(MyProjectRestrictedEmailWidgetType)
+
+class MyProjectVisitTitleWidget(CPSStringWidget):
+    """ """
+    meta_type = "MyProject Visit Title Widget"
+    
+    def validate(self, datastructure, **kw):
+        """Validate datastructure and update datamodel."""
+        
+        widget_id = self.getWidgetId()
+        err = 0
+        curr_date = DateTime()
+        date = "%d.%d.%d" % (curr_date.day(), curr_date.month(), curr_date.year())
+        user = getSecurityManager().getUser()
+        value = 'Demande de visite du %s par %s' % (date, 
+             self.portal_directories.members.getEntry(user.getId()).get('fullname'))
+        datamodel = datastructure.getDataModel()
+        datamodel[self.fields[0]] = value
+            
+        return not err
+
+    def render(self, mode, datastructure, **kw):
+        return ''
+
+InitializeClass(MyProjectVisitTitleWidget)
+
+class MyProjectVisitTitleWidgetType(CPSWidgetType):
+    """MyProject Visit Title widget type."""
+    meta_type = "MyProject Visit Title Widget Type"
+    cls = MyProjectVisitTitleWidget
+
+InitializeClass(MyProjectVisitTitleWidgetType)
+
+#####################################################################################
+
+WidgetTypeRegistry.register(MyProjectWeekDateTimeWidgetType)
+WidgetTypeRegistry.register(MyProjectRestrictedStringWidgetType)
+WidgetTypeRegistry.register(MyProjectRestrictedEmailWidgetType)
+WidgetTypeRegistry.register(MyProjectVisitTitleWidgetType)
+
Index: /waeup_product/trunk/Workflows/WAeUPWorkflow.py
===================================================================
--- /waeup_product/trunk/Workflows/WAeUPWorkflow.py	(revision 19)
+++ /waeup_product/trunk/Workflows/WAeUPWorkflow.py	(revision 19)
@@ -0,0 +1,457 @@
+""" WAeUP Workflfow
+"""
+
+__author__ = "Joachim Schmitz <js@aixtraware.de>"
+
+import os, sys
+from zLOG import LOG, INFO, DEBUG
+
+from Products.CMFCore.permissions import View, ModifyPortalContent
+#from Products.WAeUP.permissions import 
+
+from Products.CPSWorkflow.transitions import \
+     TRANSITION_INITIAL_CREATE, \
+     TRANSITION_ALLOWSUB_CHECKOUT, \
+     TRANSITION_ALLOWSUB_CREATE, \
+     TRANSITION_ALLOWSUB_DELETE, \
+     TRANSITION_ALLOWSUB_MOVE, \
+     TRANSITION_ALLOWSUB_COPY
+
+from Products.DCWorkflow.Transitions import \
+     TRIGGER_USER_ACTION
+
+def waeupWorkflowsInstall(self):
+    """Install the workflow for the WAeUP Types
+    """
+
+    portal = self.portal_url.getPortalObject()
+    wftool = portal.portal_workflow
+
+    wfids = wftool.objectIds()
+    wfid = 'waeup_section_wf'
+
+    if wfid in wfids:
+        wftool.manage_delObjects([wfid])
+
+    wftool.manage_addWorkflow(id=wfid,
+                              workflow_type='cps_workflow (Web-configurable workflow for CPS)')
+
+    wf = wftool[wfid]
+
+    for p in (View,
+              ModifyPortalContent,
+             ):
+        wf.addManagedPermission(p)
+
+    ###########################################################################
+    ###########################################################################
+
+    #                                  STATES
+
+    ###########################################################################
+    ###########################################################################
+
+    for s in ('work',
+             ):
+        wf.states.addState(s)
+
+    ##########################################################################
+    #                                  WORK
+    ##########################################################################
+
+    s = wf.states.get('work')
+
+    s.setPermission(View, 1, ('Student',))
+    s.setPermission(ModifyPortalContent, 1, ('StudentAdmin',))
+
+    s.setInitialState('work')
+    s.setProperties(title='Work',
+                    description='',
+                    transitions=('create_content',
+                                 'cut_copy_paste',
+                                 'close',),)
+
+    ##########################################################################
+    #                                  CLOSED
+    ##########################################################################
+
+##    s = wf.states.get('closed')
+##
+##    s.setPermission(View, 1, ('ChatPoster',))
+##    s.setPermission(ModifyPortalContent, 1, ('ChatModerator',))
+##    s.setPermission(chatReply, 1, ('ChatModerator',))
+##    s.setPermission(chatPost, 1, ('ChatModerator',))
+##    s.setPermission(chatModerate, 1, ('ChatModerator',))
+
+##    s.setProperties(title='Closed',
+##                    description='',
+##                    transitions=('unclose',
+##                                 'cut_copy_paste',),)
+##
+    ###########################################################################
+    ###########################################################################
+
+    #                               TRANSITIONS
+
+    ###########################################################################
+    ###########################################################################
+
+    for t in ('create',
+              'create_content',
+              'cut_copy_paste',
+              ):
+        wf.transitions.addTransition(t)
+
+
+    ###########################################################################
+    #                                 CREATE
+    ###########################################################################
+
+    t = wf.transitions.get('create')
+    t.setProperties(title='Initial creation',
+                    description='Intial transition like',
+                    new_state_id='work',
+                    transition_behavior=(TRANSITION_INITIAL_CREATE, ),
+                    clone_allowed_transitions=None,
+                    actbox_name='', actbox_category='workflow', actbox_url='',
+                    props={'guard_permissions':'',
+                           'guard_roles':'Manager; SectionManager',
+                           'guard_expr':''},)
+
+    ###########################################################################
+    #                                  CREATE CONTENT
+    ###########################################################################
+
+    t = wf.transitions.get('create_content')
+    t.setProperties(title='Create content',
+                    description='Allow sub Object Create',
+                    new_state_id='work',
+                    transition_behavior=(TRANSITION_ALLOWSUB_CREATE,
+                                         TRANSITION_ALLOWSUB_CHECKOUT,),
+                    trigger_type=TRIGGER_USER_ACTION,
+                    actbox_name='New',
+                    actbox_category='',
+                    actbox_url='',
+                    props={'guard_permissions':'',
+                           'guard_roles':'Manager; SectionManager; SectionReviewer; SectionReader',
+                           'guard_expr':''},)
+
+    ##########################################################################
+    #                                  CUT/COPY/PASTE
+    ##########################################################################
+
+    t = wf.transitions.get('cut_copy_paste')
+    t.setProperties(title='Cut/Copy/Paste',
+                    new_state_id='work',
+                    transition_behavior=(TRANSITION_ALLOWSUB_DELETE,
+                                         TRANSITION_ALLOWSUB_MOVE,
+                                         TRANSITION_ALLOWSUB_COPY),
+                    clone_allowed_transitions=None,
+                    trigger_type=TRIGGER_USER_ACTION,
+                    actbox_name='New',
+                    actbox_category='',
+                    actbox_url='',
+                    props={'guard_permissions':'',
+                           'guard_roles':'Manager; SectionManager',
+                           'guard_expr':''},)
+
+    ##########################################################################
+    #                                  CLOSE
+    ##########################################################################
+
+##    t = wf.transitions.get('close')
+##    t.setProperties(title='close',
+##                    new_state_id='closed',
+##                    transition_behavior=(),
+##                    clone_allowed_transitions=None,
+##                    trigger_type=TRIGGER_USER_ACTION,
+##                    actbox_name='label_chat_close',
+##                    actbox_category='workflow',
+##                    actbox_url='%(content_url)s/cps_chat_close',
+##                    props={'guard_permissions':'',
+##                           'guard_roles':'Manager; SectionManager; SectionReviewer',
+##                           'guard_expr':''},)
+##
+##    ##########################################################################
+##    #                                  UNCLOSE
+##    ##########################################################################
+##
+##    t = wf.transitions.get('unclose')
+##    t.setProperties(title='unclose',
+##                    new_state_id='work',
+##                    transition_behavior=(),
+##                    clone_allowed_transitions=None,
+##                    trigger_type=TRIGGER_USER_ACTION,
+##                    actbox_name='label_chat_unclose',
+##                    actbox_category='workflow',
+##                    actbox_url='%(content_url)s/cps_chat_unclose',
+##                    props={'guard_permissions':'',
+##                           'guard_roles':'Manager; SectionManager; SectionReviewer',
+##                           'guard_expr':''},)
+
+    ################################################################
+    #                 VARIABLES
+    ################################################################
+
+    for v in ('action',
+              'actor',
+              'comments',
+              'review_history',
+              'time',
+              'dest_container',
+              ):
+        wf.variables.addVariable(v)
+
+
+    wf.variables.setStateVar('review_state')
+
+    vdef = wf.variables['action']
+    vdef.setProperties(description='The last transition',
+                       default_expr='transition/getId|nothing',
+                       for_status=1, update_always=1)
+
+    vdef = wf.variables['actor']
+    vdef.setProperties(description='The ID of the user who performed '
+                       'the last transition',
+                       default_expr='user/getId',
+                       for_status=1, update_always=1)
+
+    vdef = wf.variables['comments']
+    vdef.setProperties(description='Comments about the last transition',
+                       default_expr="python:state_change.kwargs.get('comment', '')",
+                       for_status=1, update_always=1)
+
+    vdef = wf.variables['review_history']
+    vdef.setProperties(description='Provides access to workflow history',
+                       default_expr="state_change/getHistory",
+                       props={'guard_permissions':'',
+                              'guard_roles':'Manager; WorkspaceManager; WorkspaceMember; WorkspaceReader; Member',
+                              'guard_expr':''})
+
+    vdef = wf.variables['time']
+    vdef.setProperties(description='Time of the last transition',
+                       default_expr="state_change/getDateTime",
+                       for_status=1, update_always=1)
+
+    vdef = wf.variables['dest_container']
+    vdef.setProperties(description='Destination container for the last paste/publish',
+                       default_expr="python:state_change.kwargs.get('dest_container', '')",
+                       for_status=1, update_always=1)
+
+
+    ######################################################################################
+    ######################################################################################
+    wfid = 'waeup_workspace_wf'
+
+    if wfid in wfids:
+        wftool.manage_delObjects([wfid])
+
+    wftool.manage_addWorkflow(id=wfid,
+                              workflow_type='cps_workflow (Web-configurable workflow for CPS)')
+
+    wf = wftool[wfid]
+
+    for p in (View,
+              ModifyPortalContent,
+              ):
+        wf.addManagedPermission(p)
+
+    ###########################################################################
+    ###########################################################################
+
+    #                                  STATES
+
+    ###########################################################################
+    ###########################################################################
+
+    for s in ('work',
+              'closed'):
+        wf.states.addState(s)
+
+    ##########################################################################
+    #                                  WORK
+    ##########################################################################
+
+    s = wf.states.get('work')
+
+##    s.setPermission(View, 1, ('ChatPoster',))
+##    s.setPermission(ModifyPortalContent, 1, ('ChatModerator',))
+##    s.setPermission(chatReply, 1, ('ChatModerator', 'ChatGuest',))
+##    s.setPermission(chatPost, 1, ('ChatModerator', 'ChatPoster', 'ChatGuest',))
+##    s.setPermission(chatModerate, 1, ('ChatModerator',))
+
+    s.setInitialState('work')
+    s.setProperties(title='Work',
+                    description='',
+                    transitions=('create_content',
+                                 'cut_copy_paste',
+                                 'close',),)
+
+
+    ##########################################################################
+    #                                  CLOSED
+    ##########################################################################
+
+    s = wf.states.get('closed')
+
+##    s.setPermission(View, 1, ('ChatPoster',))
+##    s.setPermission(ModifyPortalContent, 1, ('ChatModerator',))
+##    s.setPermission(chatReply, 1, ('ChatModerator',))
+##    s.setPermission(chatPost, 1, ('ChatModerator',))
+##    s.setPermission(chatModerate, 1, ('ChatModerator',))
+
+    s.setProperties(title='Closed',
+                    description='',
+                    transitions=('unclose',
+                                 'cut_copy_paste',),)
+
+    ###########################################################################
+    ###########################################################################
+
+    #                               TRANSITIONS
+
+    ###########################################################################
+    ###########################################################################
+
+    for t in ('create',
+              'create_content',
+              'cut_copy_paste',
+              'close',
+              'unclose',):
+        wf.transitions.addTransition(t)
+
+
+    ###########################################################################
+    #                                 CREATE
+    ###########################################################################
+
+    t = wf.transitions.get('create')
+    t.setProperties(title='Initial creation',
+                    description='Intial transition like',
+                    new_state_id='work',
+                    transition_behavior=(TRANSITION_INITIAL_CREATE, ),
+                    clone_allowed_transitions=None,
+                    actbox_name='', actbox_category='workflow', actbox_url='',
+                    props={'guard_permissions':'',
+                           'guard_roles':'Manager; WorkspaceManager',
+                           'guard_expr':''},)
+
+    ###########################################################################
+    #                                  CREATE CONTENT
+    ###########################################################################
+
+    t = wf.transitions.get('create_content')
+    t.setProperties(title='Create content',
+                    description='Allow sub Object Create',
+                    new_state_id='work',
+                    transition_behavior=(TRANSITION_ALLOWSUB_CREATE,
+                                         TRANSITION_ALLOWSUB_CHECKOUT,),
+                    trigger_type=TRIGGER_USER_ACTION,
+                    actbox_name='New',
+                    actbox_category='',
+                    actbox_url='',
+                    props={'guard_permissions':'',
+                           'guard_roles':'Manager; WorkspaceManager; WorkspaceMember; WorkspaceReader',
+                           'guard_expr':''},)
+
+    ##########################################################################
+    #                                  CUT/COPY/PASTE
+    ##########################################################################
+
+    t = wf.transitions.get('cut_copy_paste')
+    t.setProperties(title='Cut/Copy/Paste',
+                    new_state_id='work',
+                    transition_behavior=(TRANSITION_ALLOWSUB_DELETE,
+                                         TRANSITION_ALLOWSUB_MOVE,
+                                         TRANSITION_ALLOWSUB_COPY),
+                    clone_allowed_transitions=None,
+                    trigger_type=TRIGGER_USER_ACTION,
+                    actbox_name='New',
+                    actbox_category='',
+                    actbox_url='',
+                    props={'guard_permissions':'',
+                           'guard_roles':'Manager; WorkspaceManager; WorkspaceMember',
+                           'guard_expr':''},)
+
+##    ##########################################################################
+##    #                                  CLOSE
+##    ##########################################################################
+##
+##    t = wf.transitions.get('close')
+##    t.setProperties(title='close',
+##                    new_state_id='closed',
+##                    transition_behavior=(),
+##                    clone_allowed_transitions=None,
+##                    trigger_type=TRIGGER_USER_ACTION,
+##                    actbox_name='label_chat_close',
+##                    actbox_category='workflow',
+##                    actbox_url='%(content_url)s/cps_chat_close',
+##                    props={'guard_permissions':'',
+##                           'guard_roles':'Manager; WorkspaceManager',
+##                           'guard_expr':''},)
+##
+##    ##########################################################################
+##    #                                  UNCLOSE
+##    ##########################################################################
+##
+##    t = wf.transitions.get('unclose')
+##    t.setProperties(title='unclose',
+##                    new_state_id='work',
+##                    transition_behavior=(),
+##                    clone_allowed_transitions=None,
+##                    trigger_type=TRIGGER_USER_ACTION,
+##                    actbox_name='label_chat_unclose',
+##                    actbox_category='workflow',
+##                    actbox_url='%(content_url)s/cps_chat_unclose',
+##                    props={'guard_permissions':'',
+##                           'guard_roles':'Manager; WorkspaceManager; ChatModerator',
+##                           'guard_expr':''},)
+
+    ################################################################
+    #                 VARIABLES
+    ################################################################
+
+    for v in ('action',
+              'actor',
+              'comments',
+              'review_history',
+              'time',
+              'dest_container',
+              ):
+        wf.variables.addVariable(v)
+
+
+    wf.variables.setStateVar('review_state')
+
+    vdef = wf.variables['action']
+    vdef.setProperties(description='The last transition',
+                       default_expr='transition/getId|nothing',
+                       for_status=1, update_always=1)
+
+    vdef = wf.variables['actor']
+    vdef.setProperties(description='The ID of the user who performed '
+                       'the last transition',
+                       default_expr='user/getId',
+                       for_status=1, update_always=1)
+
+    vdef = wf.variables['comments']
+    vdef.setProperties(description='Comments about the last transition',
+                       default_expr="python:state_change.kwargs.get('comment', '')",
+                       for_status=1, update_always=1)
+
+    vdef = wf.variables['review_history']
+    vdef.setProperties(description='Provides access to workflow history',
+                       default_expr="state_change/getHistory",
+                       props={'guard_permissions':'',
+                              'guard_roles':'Manager; WorkspaceManager; WorkspaceMember; WorkspaceReader; Member',
+                              'guard_expr':''})
+
+    vdef = wf.variables['time']
+    vdef.setProperties(description='Time of the last transition',
+                       default_expr="state_change/getDateTime",
+                       for_status=1, update_always=1)
+
+    vdef = wf.variables['dest_container']
+    vdef.setProperties(description='Destination container for the last paste/publish',
+                       default_expr="python:state_change.kwargs.get('dest_container', '')",
+                       for_status=1, update_always=1)
Index: /waeup_product/trunk/Workflows/__init__.py
===================================================================
--- /waeup_product/trunk/Workflows/__init__.py	(revision 19)
+++ /waeup_product/trunk/Workflows/__init__.py	(revision 19)
@@ -0,0 +1,1 @@
+# Make this a module
Index: /waeup_product/trunk/__init__.py
===================================================================
--- /waeup_product/trunk/__init__.py	(revision 19)
+++ /waeup_product/trunk/__init__.py	(revision 19)
@@ -0,0 +1,27 @@
+from Products.CMFCore.DirectoryView import registerDirectory
+from Products.CMFCore import utils as cmfutils
+from Products.CMFCore.CMFCorePermissions import AddPortalContent
+
+registerDirectory('skins', globals())
+
+import Student
+#import JambData
+
+fti = ()
+fti += Student.factory_type_information 
+
+contentClasses = (Student.Student,)
+
+contentConstructors = ()
+contentConstructors += Student.addStudent,
+
+
+def initialize(registrar):
+    cmfutils.ContentInit(
+        'WAeUP Types',
+        content_types=contentClasses,
+        permission=AddPortalContent,
+        extra_constructors=contentConstructors,
+        fti=fti,
+        
+    ).initialize(registrar)
Index: /waeup_product/trunk/i18n/.config.pot
===================================================================
--- /waeup_product/trunk/i18n/.config.pot	(revision 19)
+++ /waeup_product/trunk/i18n/.config.pot	(revision 19)
@@ -0,0 +1,1 @@
+/var/lib/zope2.7/instance/test_madarche_HEAD/Products/MyProject/i18n/myproject.pot
Index: /waeup_product/trunk/i18n/custom.pot
===================================================================
--- /waeup_product/trunk/i18n/custom.pot	(revision 19)
+++ /waeup_product/trunk/i18n/custom.pot	(revision 19)
@@ -0,0 +1,18 @@
+# Gettext Message File for default.
+# Your Name <your@email>, Year
+msgid ""
+msgstr ""
+"Project-Id-Version: default\n"
+"POT-Creation-Date: 2005-06-17 10:47default\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Your Name <your@email>\n"
+"Language-Team: Name <email>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language-Code: LL\n"
+"Language-Name: Language\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: default\n"
+
Index: /waeup_product/trunk/i18n/en.po
===================================================================
--- /waeup_product/trunk/i18n/en.po	(revision 19)
+++ /waeup_product/trunk/i18n/en.po	(revision 19)
@@ -0,0 +1,106 @@
+# Gettext Message File for default.
+# Your Name <your@email>, Year
+msgid ""
+msgstr ""
+"Project-Id-Version: default\n"
+"POT-Creation-Date: 2005-06-17 10:47default\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Your Name <your@email>\n"
+"Language-Team: Name <email>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language-Code: en\n"
+"Language-Name: English\n"
+"Preferred-encodings: latin9 utf-8\n"
+"Domain: default\n"
+
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <option value="." content="widget/title_or_id" attributes="value widget/getWidgetId" condition="widget/is_i18n">Type</option>
+msgid "Type"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input name="addwidget_button" type="submit" class="context" value="button_add" />
+msgid "button_add"
+msgstr ""
+
+#: from ../skins/myproject_document/accepter_visite.pt
+#.   <input onclick="history.back()" type="button" class="context" value="button_cancel" />
+#: from ../skins/myproject_document/refuser_visite.pt
+msgid "button_cancel"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input name="cpsdocument_edit_button" type="submit" class="standalone" value="button_change" condition="not:creation" />
+msgid "button_change"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input name="cpsdocument_create_button" type="submit" class="standalone" value="button_create" condition="creation" />
+msgid "button_create"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input type="submit" class="destructive" value="button_delete" attributes="name string:deleterow_${repeat/row/index};
+#.                                 onclick python:'return window.confirm(\'%s\')' %
+#.                                   (cpsmcat('description_confirm_delete'), )" />
+msgid "button_delete"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input type="submit" class="context moveDown" value="button_move_down" attributes="name string:downrow_${repeat/row/index}" condition="not:repeat/row/end" />
+msgid "button_move_down"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input type="submit" class="context moveUp" value="button_move_up" attributes="name string:uprow_${repeat/row/index}" condition="not:repeat/row/start" />
+msgid "button_move_up"
+msgstr ""
+
+#: from ../skins/myproject_document/accepter_visite.pt
+#.   <input type="submit" class="standalone" value="button_publish" />
+#: from ../skins/myproject_document/refuser_visite.pt
+msgid "button_publish"
+msgstr ""
+
+#: from ../skins/myproject_document/widget_datetime_render.pt
+#.   <block>at</block>
+msgid "cpsschema_at"
+msgstr ""
+
+#: from ../skins/myproject_document/widget_datetime_render.pt
+#.   <label attributes="for elt_hour_id">h</label>
+msgid "cpsschema_hour"
+msgstr ""
+
+#: from ../skins/myproject_document/widget_datetime_render.pt
+#.   <label attributes="for elt_minute_id">mn</label>
+msgid "cpsschema_minute"
+msgstr ""
+
+#: from ../skins/myproject_document/accepter_visite.pt
+#.   <title fill-slot="title">
+#.     heading_accept_publication_of
+#.     ${item_id (tal replace="here/title_or_id")}
+#.   </title>
+#: from ../skins/myproject_document/refuser_visite.pt
+msgid "heading_accept_publication_of ${item_id}"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <block content="widget/help" condition="widget/is_i18n">i18_key-help_for_this_field</block>
+msgid "i18_key-help_for_this_field"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <span class="dlabel" content="widget/label" condition="widget/is_i18n">label</span>
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <b content="widget/label" condition="widget/is_i18n">label</b>
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <span content="widget/label_edit" condition="widget/is_i18n">label</span>
+msgid "label"
+msgstr ""
Index: /waeup_product/trunk/i18n/fr.po
===================================================================
--- /waeup_product/trunk/i18n/fr.po	(revision 19)
+++ /waeup_product/trunk/i18n/fr.po	(revision 19)
@@ -0,0 +1,106 @@
+# Gettext Message File for default.
+# Your Name <your@email>, Year
+msgid ""
+msgstr ""
+"Project-Id-Version: default\n"
+"POT-Creation-Date: 2005-06-17 10:47default\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Your Name <your@email>\n"
+"Language-Team: Name <email>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language-Code: fr\n"
+"Language-Name: French\n"
+"Preferred-encodings: latin9 utf-8\n"
+"Domain: default\n"
+
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <option value="." content="widget/title_or_id" attributes="value widget/getWidgetId" condition="widget/is_i18n">Type</option>
+msgid "Type"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input name="addwidget_button" type="submit" class="context" value="button_add" />
+msgid "button_add"
+msgstr ""
+
+#: from ../skins/myproject_document/accepter_visite.pt
+#.   <input onclick="history.back()" type="button" class="context" value="button_cancel" />
+#: from ../skins/myproject_document/refuser_visite.pt
+msgid "button_cancel"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input name="cpsdocument_edit_button" type="submit" class="standalone" value="button_change" condition="not:creation" />
+msgid "button_change"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input name="cpsdocument_create_button" type="submit" class="standalone" value="button_create" condition="creation" />
+msgid "button_create"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input type="submit" class="destructive" value="button_delete" attributes="name string:deleterow_${repeat/row/index};
+#.                                 onclick python:'return window.confirm(\'%s\')' %
+#.                                   (cpsmcat('description_confirm_delete'), )" />
+msgid "button_delete"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input type="submit" class="context moveDown" value="button_move_down" attributes="name string:downrow_${repeat/row/index}" condition="not:repeat/row/end" />
+msgid "button_move_down"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input type="submit" class="context moveUp" value="button_move_up" attributes="name string:uprow_${repeat/row/index}" condition="not:repeat/row/start" />
+msgid "button_move_up"
+msgstr ""
+
+#: from ../skins/myproject_document/accepter_visite.pt
+#.   <input type="submit" class="standalone" value="button_publish" />
+#: from ../skins/myproject_document/refuser_visite.pt
+msgid "button_publish"
+msgstr ""
+
+#: from ../skins/myproject_document/widget_datetime_render.pt
+#.   <block>at</block>
+msgid "cpsschema_at"
+msgstr ""
+
+#: from ../skins/myproject_document/widget_datetime_render.pt
+#.   <label attributes="for elt_hour_id">h</label>
+msgid "cpsschema_hour"
+msgstr ""
+
+#: from ../skins/myproject_document/widget_datetime_render.pt
+#.   <label attributes="for elt_minute_id">mn</label>
+msgid "cpsschema_minute"
+msgstr ""
+
+#: from ../skins/myproject_document/accepter_visite.pt
+#.   <title fill-slot="title">
+#.     heading_accept_publication_of
+#.     ${item_id (tal replace="here/title_or_id")}
+#.   </title>
+#: from ../skins/myproject_document/refuser_visite.pt
+msgid "heading_accept_publication_of ${item_id}"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <block content="widget/help" condition="widget/is_i18n">i18_key-help_for_this_field</block>
+msgid "i18_key-help_for_this_field"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <span class="dlabel" content="widget/label" condition="widget/is_i18n">label</span>
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <b content="widget/label" condition="widget/is_i18n">label</b>
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <span content="widget/label_edit" condition="widget/is_i18n">label</span>
+msgid "label"
+msgstr ""
Index: /waeup_product/trunk/i18n/myproject.pot
===================================================================
--- /waeup_product/trunk/i18n/myproject.pot	(revision 19)
+++ /waeup_product/trunk/i18n/myproject.pot	(revision 19)
@@ -0,0 +1,106 @@
+# Gettext Message File for default.
+# Your Name <your@email>, Year
+msgid ""
+msgstr ""
+"Project-Id-Version: default\n"
+"POT-Creation-Date: 2005-06-17 10:47default\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Your Name <your@email>\n"
+"Language-Team: Name <email>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language-Code: LL\n"
+"Language-Name: Language\n"
+"Preferred-encodings: utf-8 latin1\n"
+"Domain: default\n"
+
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <option value="." content="widget/title_or_id" attributes="value widget/getWidgetId" condition="widget/is_i18n">Type</option>
+msgid "Type"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input name="addwidget_button" type="submit" class="context" value="button_add" />
+msgid "button_add"
+msgstr ""
+
+#: from ../skins/myproject_document/accepter_visite.pt
+#.   <input onclick="history.back()" type="button" class="context" value="button_cancel" />
+#: from ../skins/myproject_document/refuser_visite.pt
+msgid "button_cancel"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input name="cpsdocument_edit_button" type="submit" class="standalone" value="button_change" condition="not:creation" />
+msgid "button_change"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input name="cpsdocument_create_button" type="submit" class="standalone" value="button_create" condition="creation" />
+msgid "button_create"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input type="submit" class="destructive" value="button_delete" attributes="name string:deleterow_${repeat/row/index};
+#.                                 onclick python:'return window.confirm(\'%s\')' %
+#.                                   (cpsmcat('description_confirm_delete'), )" />
+msgid "button_delete"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input type="submit" class="context moveDown" value="button_move_down" attributes="name string:downrow_${repeat/row/index}" condition="not:repeat/row/end" />
+msgid "button_move_down"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <input type="submit" class="context moveUp" value="button_move_up" attributes="name string:uprow_${repeat/row/index}" condition="not:repeat/row/start" />
+msgid "button_move_up"
+msgstr ""
+
+#: from ../skins/myproject_document/accepter_visite.pt
+#.   <input type="submit" class="standalone" value="button_publish" />
+#: from ../skins/myproject_document/refuser_visite.pt
+msgid "button_publish"
+msgstr ""
+
+#: from ../skins/myproject_document/widget_datetime_render.pt
+#.   <block>at</block>
+msgid "cpsschema_at"
+msgstr ""
+
+#: from ../skins/myproject_document/widget_datetime_render.pt
+#.   <label attributes="for elt_hour_id">h</label>
+msgid "cpsschema_hour"
+msgstr ""
+
+#: from ../skins/myproject_document/widget_datetime_render.pt
+#.   <label attributes="for elt_minute_id">mn</label>
+msgid "cpsschema_minute"
+msgstr ""
+
+#: from ../skins/myproject_document/accepter_visite.pt
+#.   <title fill-slot="title">
+#.     heading_accept_publication_of
+#.     ${item_id (tal replace="here/title_or_id")}
+#.   </title>
+#: from ../skins/myproject_document/refuser_visite.pt
+msgid "heading_accept_publication_of ${item_id}"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <block content="widget/help" condition="widget/is_i18n">i18_key-help_for_this_field</block>
+msgid "i18_key-help_for_this_field"
+msgstr ""
+
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <span class="dlabel" content="widget/label" condition="widget/is_i18n">label</span>
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <b content="widget/label" condition="widget/is_i18n">label</b>
+#: from ../skins/myproject_document/myproject_layout_lib.pt
+#.   <span content="widget/label_edit" condition="widget/is_i18n">label</span>
+msgid "label"
+msgstr ""
Index: /waeup_product/trunk/permissions.py
===================================================================
--- /waeup_product/trunk/permissions.py	(revision 19)
+++ /waeup_product/trunk/permissions.py	(revision 19)
@@ -0,0 +1,41 @@
+# (C) Copyright 2005 AixtraWare <http://aixtraware.de>
+# Author: Joachim Schmitz <js@aixtraware.de>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as published
+# by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+#
+# $Id$
+
+__author__ = "Joachim Schmitz <js@aixtraware.de>"
+
+"""WAeUP Student Permissions
+
+#  - 'Chat Moderate' : Permission you need to moderate the chat
+#
+#  - 'Chat Reply'    : Permission you need to answer question
+#
+#  - 'Chat Post'     : Permission you need to post question
+
+"""
+
+from Products.CMFCore.permissions import setDefaultRoles
+
+#chatModerate = 'Chat Moderate'
+#setDefaultRoles(chatModerate, ('Manager', 'Owner'))
+#
+#chatReply = 'Chat Reply'
+#setDefaultRoles(chatReply, ('Manager', 'Owner'))
+
+#chatPost = 'Chat Post'
+#setDefaultRoles(chatPost, ('Manager', 'Owner'))
Index: /waeup_product/trunk/skins/waeup_default/getWAeUPLayouts.py
===================================================================
--- /waeup_product/trunk/skins/waeup_default/getWAeUPLayouts.py	(revision 19)
+++ /waeup_product/trunk/skins/waeup_default/getWAeUPLayouts.py	(revision 19)
@@ -0,0 +1,309 @@
+##parameters=
+# $Id$
+"""Return custom layouts types."""
+
+student_layout = {
+    'widgets': {
+        'jamb_is_admitted': {
+            'type': 'Boolean Widget',
+            'data': {
+                'title': 'Jamb Admission',
+                'fields': ('jamb_where_admitted',),
+                'is_required': False,
+                'label': 'Jamb Admission',
+                'label_edit': 'Jamb Admission',
+                'description': '',
+                'help': '',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 10,
+                'size_max': 0,
+            },
+        },
+        'jamb_where_admitted': {
+            'type': 'String Widget',
+            'data': {
+                'title': 'Jamb Admission Location',
+                'fields': ('jamb_where_admitted',),
+                'is_required': False,
+                'label': 'University',
+                'label_edit': 'University',
+                'description': '',
+                'help': '',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 10,
+                'size_max': 0,
+            },
+        },
+        'faculty': {
+            'type': 'String Widget',
+            'data': {
+                'title': 'Faculty',
+                'fields': ('faculty',),
+                'is_required': False,
+                'label': 'Faculty',
+                'label_edit': 'Faculty',
+                'description': '',
+                'help': '',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 10,
+                'size_max': 0,
+            },
+        },
+    },
+    'layout': {
+        'style_prefix': 'layout_default_',
+        'flexible_widgets': (),
+        'ncols': 1,
+        'rows': [
+            [{'widget_id': 'jamb_is_admitted', 'ncols': 1},],
+            [{'widget_id': 'jamb_where_admitted', 'ncols': 1},],
+            [{'widget_id': 'faculty', 'ncols': 1},],
+        ]
+    },
+}
+
+jamb_layout = {
+    'widgets': {
+        'reg_nr': {
+            'type': 'String Widget',
+            'data': {
+                'title': 'Student ID',
+                'fields': ('reg_nr',),
+                'is_required': True,
+                'label': 'Student ID',
+                'label_edit': 'Student ID',
+                'description': '',
+                'help': '',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 10,
+                'size_max': 0,
+            },
+        },
+        'name': {
+            'type': 'String Widget',
+            'data': {
+                'title': '',
+                'fields': ('name',),
+                'is_required': False,
+                'label': 'Name',
+                'label_edit': 'Name',
+                'description': '',
+                'help': '',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 20,
+                'size_max': 0,
+            },
+        },
+        'age': {
+            'type': 'Int Widget',
+            'data': {
+                'title': '',
+                'fields': ('age',),
+                'is_required': False,
+                'label': 'Age',
+                'label_edit': 'Age',
+                'description': '',
+                'help': '',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 20,
+                'size_max': 0,
+            },
+        },
+        'sex': {
+            'type': 'String Widget',
+            'data': {
+                'title': '',
+                'fields': ('sex',),
+                'is_required': False,
+                'label': 'sex',
+                'label_edit': 'sex',
+                'description': '',
+                'help': '',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 20,
+                'size_max': 0,
+            },
+        },
+        'state': {
+            'type': 'String Widget',
+            'data': {
+                'title': '',
+                'fields': ('state_of_origin',),
+                'is_required': False,
+                'label': 'State',
+                'label_edit': 'State',
+                'description': '',
+                'help': '',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 20,
+                'size_max': 0,
+            },
+        },
+        'exam_results': {
+            'type': 'String Widget',
+            'data': {
+                'title': '',
+                'fields': ('exam_results',),
+                'is_required': False,
+                'label': 'Jamb Results',
+                'label_edit': 'Jamb Results',
+                'description': '',
+                'help': '',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 20,
+                'size_max': 0,
+            },
+        },
+        'aggregate': {
+            'type': 'String Widget',
+            'data': {
+                'title': 'Agregate',
+                'fields': ('aggregate',),
+                'is_required': False,
+                'label': 'Aggregate',
+                'label_edit': 'Aggregate',
+                'description': '',
+                'help': '',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 20,
+                'size_max': 0,
+            },
+        },
+        '2nd_choice': {
+            'type': 'String Widget',
+            'data': {
+                'title': 'Second choice',
+                'fields': ('2nd_choice',),
+                'is_required': False,
+                'label': 'Second choice',
+                'label_edit': 'Second choice',
+                'description': '',
+                'help': 'second_choice',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 20,
+                'size_max': 0,
+            },
+        },
+        '3rd_choice': {
+            'type': 'String Widget',
+            'data': {
+                'title': 'Third_choice',
+                'fields': ('3rd_choice',),
+                'is_required': False,
+                'label': 'Third choice',
+                'label_edit': 'Third choice',
+                'description': 'third_choice',
+                'help': 'third_choice',
+                'is_i18n': False,
+                'readonly_layout_modes': (),
+                'hidden_layout_modes': (),
+                'hidden_readonly_layout_modes': (),
+                'hidden_empty': False,
+                'hidden_if_expr': '',
+                'css_class': '',
+                'widget_mode_expr': '',
+                'display_width': 20,
+                'size_max': 0,
+            },
+        },
+    },
+    'layout': {
+        'style_prefix': 'layout_default_',
+        'flexible_widgets': (),
+        'ncols': 1,
+        'rows': [
+            [{'widget_id': 'reg_nr', 'ncols': 1},],
+            [{'widget_id': 'name', 'ncols': 1},],
+            [{'widget_id': 'age', 'ncols': 1},],
+            [{'widget_id': 'sex', 'ncols': 1},],
+            [{'widget_id': 'state', 'ncols': 1},],
+            [{'widget_id': 'exam_results', 'ncols': 1},],
+            [{'widget_id': 'aggregate', 'ncols': 1},],
+            [{'widget_id': '2nd_choice', 'ncols': 1},],
+            [{'widget_id': '3rd_choice', 'ncols': 1},],
+        ]
+    },
+}
+
+layouts = {}
+layouts['student'] = student_layout
+layouts['jamb'] = jamb_layout
+
+return layouts
Index: /waeup_product/trunk/skins/waeup_default/getWAeUPSchemas.py
===================================================================
--- /waeup_product/trunk/skins/waeup_default/getWAeUPSchemas.py	(revision 19)
+++ /waeup_product/trunk/skins/waeup_default/getWAeUPSchemas.py	(revision 19)
@@ -0,0 +1,241 @@
+student_schema = {
+   'allow_discussion': {
+        'type': 'CPS Int Field',
+        'data': {
+            'default_expr': 'python:0',
+            'is_searchabletext': 0,
+            },
+        },
+     'jamb_is_admitted': {
+        'type': 'CPS Boolean Field',
+        'data': {
+            'default_expr': 'python:False',
+            'is_searchabletext': 0,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+    'jamb_where_admitted': {
+        'type': 'CPS String Field',
+        'data': {
+            'default_expr': 'string:',
+            'is_searchabletext': True,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+    'faculty': {
+        'type': 'CPS String Field',
+        'data': {
+            'default_expr': 'string:',
+            'is_searchabletext': True,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+}
+#
+#
+jamb_schema = {
+   'allow_discussion': {
+        'type': 'CPS Int Field',
+        'data': {
+            'default_expr': 'python:0',
+            'is_searchabletext': 0,
+            },
+        },
+    'reg_nr': {
+        'type': 'CPS String Field',
+        'data': {
+            'default_expr': 'string:',
+            'is_searchabletext': True,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+    'name': {
+        'type': 'CPS String Field',
+        'data': {
+            'default_expr': 'string:',
+            'is_searchabletext': True,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+    'age': {
+        'type': 'CPS Int Field',
+        'data': {
+            'default_expr': 'python:20',
+            'is_searchabletext': False,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+    'sex': {
+        'type': 'CPS Boolean Field',
+        'data': {
+            'default_expr': 'python:False',
+            'is_searchabletext': False,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+    'state_of_origin': {
+        'type': 'CPS String Field',
+        'data': {
+            'default_expr': 'string:',
+            'is_searchabletext': True,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+    'exam_results': {
+        'type': 'CPS String Field',
+        'data': {
+            'default_expr': 'string:',
+            'is_searchabletext': True,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+    'aggregate': {
+        'type': 'CPS String Field',
+        'data': {
+            'default_expr': 'string:',
+            'is_searchabletext': False,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+    '2nd_choice': {
+        'type': 'CPS String Field',
+        'data': {
+            'default_expr': 'string:',
+            'is_searchabletext': False,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+    '3rd_choice': {
+        'type': 'CPS String Field',
+        'data': {
+            'default_expr': 'string:',
+            'is_searchabletext': True,
+            'acl_read_permissions': '',
+            'acl_read_roles': '',
+            'acl_read_expr': '',
+            'acl_write_permissions': '',
+            'acl_write_roles': '',
+            'acl_write_expr': '',
+            'read_ignore_storage': False,
+            'read_process_expr': '',
+            'read_process_dependent_fields': (),
+            'write_ignore_storage': False,
+            'write_process_expr': '',
+        },
+    },
+}
+schemas = {}
+schemas['student'] = student_schema
+schemas['jamb'] = jamb_schema
+
+return schemas
Index: /waeup_product/trunk/skins/waeup_default/getWAeUPTypes.py
===================================================================
--- /waeup_product/trunk/skins/waeup_default/getWAeUPTypes.py	(revision 19)
+++ /waeup_product/trunk/skins/waeup_default/getWAeUPTypes.py	(revision 19)
@@ -0,0 +1,139 @@
+##parameters=
+# $Id$
+"""Return custom document types."""
+# permissions
+from Products.CMFCore.permissions import View
+from Products.CMFCore.permissions import ModifyPortalContent
+from Products.CMFCore.permissions import AddPortalContent
+ChangePermissions = 'Change permissions'
+
+student_folder_type = {
+    'title': 'WAeUP Student Folder',
+    'description': 'The WAeUP Student Folder',
+    'content_icon': 'students_folder.gif',
+    'content_meta_type': 'Folder',
+    'product': 'CPSDefault',
+    'factory': 'addFolder',
+    'immediate_view': 'student_folder_view',
+    'global_allow': 1,
+    'filter_content_types': 1,
+    'allowed_content_types': ('Student',),
+    'allow_discussion': 0,
+    'cps_is_searchable': 1,
+    'cps_display_as_document_in_listing': 1,
+    'cps_proxy_type': 'folder',
+    'schemas': ['metadata', 'common', 'folder'],
+    'layouts': ['common', 'folder'],
+    'layout_clusters': ['metadata:metadata'],
+    'cps_section_wf': 'waeup_section_wf',
+    'actions': ({'id': 'view',
+                 'name': 'action_view',
+                 'action': 'student_folder_view',
+                 'permissions': (View,)},
+                {'id': 'new_content',
+                 'name': 'action_new_content',
+                 'action': 'folder_factories',
+                 'permissions': (AddPortalContent,)},
+                {'id': 'contents',
+                 'name': 'action_folder_contents',
+                 'action': 'folder_contents',
+                 'permissions': (ModifyPortalContent,)},
+                {'id': 'edit',
+                 'name': 'action_edit',
+                 'action': 'cpsdocument_edit_form',
+                 'permissions': (ModifyPortalContent,)},
+                {'id': 'metadata',
+                 'name': 'action_metadata',
+                 'action': 'cpsdocument_metadata',
+                 'condition': 'not:portal/portal_membership/isAnonymousUser',
+                 'permissions': (View,)},
+                {'id': 'localroles',
+                 'name': 'action_local_roles',
+                 'action': 'folder_localrole_form',
+                 'permissions': (ChangePermissions,)},
+    )
+}
+student_type = {
+    'title': 'WAeUP Student',
+    'description': '',
+    'content_icon': 'student.gif',
+    'content_meta_type': 'CPS Document',
+    'product': 'CPSDocument',
+    'factory': 'addCPSDocument',
+    'immediate_view': 'cpsdocument_view',
+    'global_allow': True,
+    'filter_content_types': True,
+    'allowed_content_types': ('Jamb',),
+    'allow_discussion': False,
+    'cps_is_searchable': True,
+    'cps_proxy_type': 'document',
+    'cps_display_as_document_in_listing': True,
+    'schemas': ('metadata', 'student'),
+    'layouts': ('common', 'student'),
+    'cps_workspace_wf': 'waeup_workspace_wf',
+    'cps_section_wf': 'waeup_section_wf',
+    'actions': (
+         {'id': 'view',
+          'name': 'action_view',
+          'action': 'string:${object_url}/student_view',
+          'condition': '',
+          'permission': ('View',),
+          'category': 'object',
+          'visible': True,},
+         {'id': 'new_content',
+          'name': 'Add Jamb Data',
+          'action': 'string:${object_url}/folder_factories',
+          'condition': "python:len(object.contentItems()) == 0 ",
+          'permission': ('Modify portal content',),
+          'category': 'object',
+          'visible': True,},
+         {'id': 'contents',
+          'name': 'action_folder_contents',
+          'action': 'string:${object_url}/folder_contents',
+          'condition': "python:object.getTypeInfo().cps_proxy_type != 'document'",
+          'permission': ('Modify portal content',),
+          'category': 'object',
+          'visible': True,},
+         {'id': 'edit',
+          'name': 'action_edit',
+          'action': 'string:${object_url}/cpsdocument_edit_form',
+          'condition': '',
+          'permission': ('Modify portal content',),
+          'category': 'object',
+          'visible': True,},
+    )
+}
+#
+#
+jamb_type = {
+    'title': "JAMB data",
+    'description': 'The data from JAMB',
+    'content_icon': '',
+    'content_meta_type': 'CPS Document',
+    'product': 'CPSDocument',
+    'factory': 'addCPSDocument',
+    'immediate_view': 'cpsdocument_view',
+    'global_allow': True,
+    'filter_content_types': True,
+    'allowed_content_types': (),
+    'allow_discussion': False,
+    'cps_is_searchable': True,
+    'cps_proxy_type': 'document',
+    'cps_display_as_document_in_listing': True,
+    'cps_is_portalbox': False,
+    #'schemas': ['common','metadata','jamb'],
+    'schemas': ['jamb'],
+    'layouts': ['jamb',],
+    'flexible_layouts': (),
+    'storage_methods': (),
+    'cps_workspace_wf': 'workspace_content_wf',
+    'cps_section_wf': 'section_content_wf',
+}
+
+types = {}
+types['StudentFolder'] = student_folder_type
+types['Student'] = student_type
+types['Jamb'] = jamb_type
+
+return types
+
Index: /waeup_product/trunk/skins/waeup_default/getWAeUPVocabularies.py
===================================================================
--- /waeup_product/trunk/skins/waeup_default/getWAeUPVocabularies.py	(revision 19)
+++ /waeup_product/trunk/skins/waeup_default/getWAeUPVocabularies.py	(revision 19)
@@ -0,0 +1,7 @@
+##parameters=
+# $Id$
+"""Return custom vocabularies."""
+
+vocabularies = {}
+
+return vocabularies
Index: /waeup_product/trunk/skins/waeup_default/getWAeUPWidgets.py
===================================================================
--- /waeup_product/trunk/skins/waeup_default/getWAeUPWidgets.py	(revision 19)
+++ /waeup_product/trunk/skins/waeup_default/getWAeUPWidgets.py	(revision 19)
@@ -0,0 +1,8 @@
+widgets = {
+##        'MyProject Week Date Time Widget': {
+##            'type': 'MyProject Week Date Time Widget Type',
+##            'data': {},
+##            },
+        }
+
+return widgets
Index: /waeup_product/trunk/skins/waeup_student/student_folder_view.py
===================================================================
--- /waeup_product/trunk/skins/waeup_student/student_folder_view.py	(revision 19)
+++ /waeup_product/trunk/skins/waeup_student/student_folder_view.py	(revision 19)
@@ -0,0 +1,8 @@
+##parameters=post_id=None, REQUEST=None
+
+# $Id$
+
+"""Default view for the forum. If post_id is not None, post with id = <post_id>
+will be displayed, otherwise first post will be displayed."""
+
+return context.student_folder_view_main()
Index: /waeup_product/trunk/skins/waeup_student/student_folder_view_main.pt
===================================================================
--- /waeup_product/trunk/skins/waeup_student/student_folder_view_main.pt	(revision 19)
+++ /waeup_product/trunk/skins/waeup_student/student_folder_view_main.pt	(revision 19)
@@ -0,0 +1,32 @@
+<html metal:use-macro="here/content_lib_master/macros/master">
+
+<metal:block fill-slot="head_slot">
+  <tal:block tal:define="student here/getContent">
+  </tal:block>
+</metal:block>
+
+<metal:block fill-slot="css_slot">
+  <link rel="Stylesheet" type="text/css" href=""
+    tal:attributes="href string:${base_url}student.css" />
+</metal:block>
+
+<metal:block fill-slot="main"
+             tal:define="student_folder here/getContent;
+             items here/contentValues">
+<span tal:condition="python: 0" tal:content="items" />
+<table cellspacing="0" cellpadding="0">
+    <tal:block condition="python: len(items)">
+      <tr tal:repeat="item items">
+        <td colspan="1">
+          <a href="student" tal:attributes="href item/absolute_url" tal:content="item/title_or_id"></a>
+      </td>
+      </tr>
+    </tal:block>
+    <tr tal:condition="python:not len(items)">
+      <td>
+        no Students yet !
+      </td>
+    </tr>
+  </table>
+</metal:block>
+</html>
Index: /waeup_product/trunk/skins/waeup_student/student_view.py
===================================================================
--- /waeup_product/trunk/skins/waeup_student/student_view.py	(revision 19)
+++ /waeup_product/trunk/skins/waeup_student/student_view.py	(revision 19)
@@ -0,0 +1,8 @@
+##parameters=post_id=None, REQUEST=None
+
+# $Id$
+
+"""Default view for the forum. If post_id is not None, post with id = <post_id>
+will be displayed, otherwise first post will be displayed."""
+
+return context.student_view_main()
Index: /waeup_product/trunk/skins/waeup_student/student_view_main.pt
===================================================================
--- /waeup_product/trunk/skins/waeup_student/student_view_main.pt	(revision 19)
+++ /waeup_product/trunk/skins/waeup_student/student_view_main.pt	(revision 19)
@@ -0,0 +1,34 @@
+<html metal:use-macro="here/content_lib_master/macros/master">
+
+<metal:block fill-slot="head_slot">
+  <tal:block tal:define="student here/getContent">
+  </tal:block>
+</metal:block>
+
+<metal:block fill-slot="css_slot">
+  <link rel="Stylesheet" type="text/css" href=""
+    tal:attributes="href string:${base_url}student.css" />
+</metal:block>
+
+<metal:block fill-slot="main"
+             tal:define="student here/getContent;
+             items here/contentValues">
+<span tal:condition="python: 0" tal:content="items" />
+<table cellspacing="0" cellpadding="0">
+    <tal:block condition="python: len(items)">
+      <tr tal:repeat="item items">
+        <td colspan="1"> 
+          <a href="jamb" 
+             tal:attributes="href item/absolute_url"
+             tal:content="item/title_or_id"></a>
+      </td>
+      </tr>
+    </tal:block>
+    <tr tal:condition="python:not len(items)">
+      <td>
+        no Items yet !
+      </td>
+    </tr>
+  </table>
+</metal:block>
+</html>
