Changeset 632
- Timestamp:
- 12/23/09 06:06:58 (2 years ago)
- Location:
- enpraxis.educommons/trunk/enpraxis/educommons
- Files:
-
- 7 added
- 18 modified
-
browser/configure.zcml (modified) (1 diff)
-
browser/controlpanel.py (modified) (5 diffs)
-
browser/coursestopic.py (modified) (2 diffs)
-
browser/divisioncourses.pt (modified) (1 diff)
-
browser/__init__.py (modified) (1 diff)
-
browser/school_division_listing.pt (added)
-
browser/templates/configure.zcml (modified) (1 diff)
-
browser/templates/school_view.pt (added)
-
configure.zcml (modified) (9 diffs)
-
content/division.py (modified) (1 diff)
-
content/__init__.py (modified) (1 diff)
-
content/school.py (added)
-
eventHandlers.py (modified) (2 diffs)
-
events.py (modified) (2 diffs)
-
interfaces.py (modified) (2 diffs)
-
portlet/configure.zcml (modified) (1 diff)
-
portlet/coursebuilderform.py (modified) (7 diffs)
-
portlet/simplenavportlet.py (modified) (3 diffs)
-
profiles/default/propertiestool.xml (modified) (1 diff)
-
profiles/default/types/School.xml (added)
-
profiles/default/types.xml (modified) (1 diff)
-
profiles/default/workflows.xml (modified) (1 diff)
-
skins/eduCommons/school_listing.pt (added)
-
skins/eduCommons/school_listing.pt.metadata (added)
-
upgrades/v3_2_1_to_v3_2_2.py (added)
Legend:
- Unmodified
- Added
- Removed
-
enpraxis.educommons/trunk/enpraxis/educommons/browser/configure.zcml
r239 r632 288 288 permission="zope2.View" 289 289 /> 290 291 <browser:page 292 name="school_division_listing" 293 for="..interfaces.ISchool" 294 class=".DivisionListingView" 295 template="school_division_listing.pt" 296 allowed_attributes="getDivisions" 297 permission="zope2.View" 298 /> 299 290 300 291 301 <browser:page -
enpraxis.educommons/trunk/enpraxis/educommons/browser/controlpanel.py
r506 r632 24 24 from zope.component import adapts, getUtility 25 25 from zope.formlib.form import FormFields 26 from zope.schema import TextLine, Bool26 from zope.schema import TextLine, List, Bool 27 27 from Products.CMFDefault.formlib.schema import SchemaAdapterBase 28 28 from Products.CMFPlone.interfaces import IPloneSiteRoot … … 32 32 33 33 class IeduCommonsSchema(Interface): 34 35 school_descriptor = TextLine(title=_(u'School Descriptor'), 36 description=_(u"A descriptor that describes how your " 37 "institutions are divided. Typically " 38 "this will be 'Schools' or 'Universities.'"), 39 required=True) 40 34 41 35 42 division_descriptor = TextLine(title=_(u'Division Descriptor'), … … 58 65 description=_(u'The URL to the eduCommons instance utilized by the Reuse Course portlet.'), 59 66 required=True) 67 68 workflow_order = List(title=_(u'Worflow Order'), 69 description=_(u"This setting is utilized in the Course Summary Portlet, allowing the portlet to render workflow states " 70 "in the proper procedural order. If you utilize a non-standard workflow for content objects, you will need " 71 "to modify this setting in order for the portlet to render the non-standard states."), 72 required=True, 73 value_type=TextLine(),) 74 60 75 61 76 … … 70 85 self.props = getUtility(IPropertiesTool) 71 86 self.ecprops = self.props.educommons_properties 87 88 def get_school_descriptor(self): 89 return self.ecprops.getProperty('school_descriptor') 90 91 def set_school_descriptor(self, descriptor): 92 self.ecprops.manage_changeProperties(school_descriptor=descriptor) 72 93 73 94 def get_division_descriptor(self): … … 101 122 self.ecprops.manage_changeProperties(reusecourse_instance=reusecourse) 102 123 124 def get_workflow_order(self): 125 return self.ecprops.workflow_order 103 126 127 def set_workflow_order(self, wf_order): 128 self.ecprops.workflow_order = wf_order 104 129 130 school_descriptor = property(get_school_descriptor, set_school_descriptor) 131 division_descriptor = property(get_division_descriptor, set_division_descriptor) 105 132 course_descriptor = property(get_course_descriptor, set_course_descriptor) 106 division_descriptor = property(get_division_descriptor, set_division_descriptor)107 133 oerrecommender_enabled = property(get_oerrecommender_enabled, set_oerrecommender_enabled) 108 134 reusecourse_enabled = property(get_reusecourse_enabled, set_reusecourse_enabled) 109 135 reusecourse_instance = property(get_reusecourse_instance, set_reusecourse_instance) 136 workflow_order = property(get_workflow_order, set_workflow_order) 110 137 111 138 class eduCommonsControlPanel(ControlPanelForm): -
enpraxis.educommons/trunk/enpraxis/educommons/browser/coursestopic.py
r506 r632 51 51 full_title = self.ecutil.getFullCourseTitle(brain) 52 52 return full_title 53 54 def getSchoolInfo(self): 55 """ Return URL and title for a School """ 56 if self.context.aq_inner.aq_parent.portal_type == 'School': 57 return self.context.aq_inner.aq_parent 53 58 54 59 … … 117 122 def isOpenOCW(self): 118 123 return IOpenOCWSite.providedBy(self.context.portal_url.getPortalObject()) 119 124 125 class SchoolPageView(BrowserView): 126 """ A default school page view """ 127 128 __call__ = ViewPageTemplateFile('templates/school_view.pt') 129 120 130 121 131 class CoursePageView(BrowserView): -
enpraxis.educommons/trunk/enpraxis/educommons/browser/divisioncourses.pt
r8 r632 1 <style> 1 <div class="division-listing"> 2 <p class="division-title"> 3 <span tal:define="item view/getSchoolInfo" 4 tal:condition="item"> 5 <a href="" 6 tal:attributes="href item/absolute_url" 7 tal:content="item/Title">Division Title</a> | 8 </span> 2 9 3 </style> 4 5 <div class="division-listing"> 6 <p class="division-title"> 7 <a href="" 8 tal:attributes="href context/absolute_url" 9 tal:content="context/Title">Division Title</a> 10 </p> 10 <a href="" 11 tal:attributes="href context/absolute_url" 12 tal:content="context/Title">Division Title</a> 13 </p> 11 14 12 15 <tal:block tal:repeat="item view/getCourses"> -
enpraxis.educommons/trunk/enpraxis/educommons/browser/__init__.py
r546 r632 95 95 96 96 return title, content 97 98 class DivisionListingView(BrowserView): 99 """ Return Division in the School """ 100 101 def getDivisions(self): 102 """ Get Sorted Divisions """ 103 104 portal_catalog = self.context.portal_catalog 105 brains = portal_catalog(path= {'query':'/'.join(self.context.getPhysicalPath())+'/', 'depth':2}, portal_type='Division') 106 107 #brains = list(brains) 108 #brains.sort(lambda x, y : cmp(self.ecutil.getFullCourseTitle(x),self.ecutil.getFullCourseTitle(y))) 109 110 return brains 111 97 112 98 113 class SortedCourseListingView(BrowserView): -
enpraxis.educommons/trunk/enpraxis/educommons/browser/templates/configure.zcml
r8 r632 3 3 i18n_domain="eduCommons"> 4 4 5 6 <browser:page 7 name="school_view" 8 for="...interfaces.ISchool" 9 class="..coursestopic.SchoolPageView" 10 permission="zope2.View" 11 /> 5 12 6 13 <browser:page -
enpraxis.educommons/trunk/enpraxis/educommons/configure.zcml
r514 r632 68 68 <i18n:registerTranslations directory="locales" /> 69 69 70 <class class=".content.school.School"> 71 <implements interface=".interfaces.IClearCopyrightable 72 .interfaces.IAccessibilityCompliantable 73 .interfaces.ICourseOrderable 74 zope.annotation.interfaces.IAttributeAnnotatable" 75 /> 76 </class> 77 70 78 <class class=".content.division.Division"> 71 79 <implements interface=".interfaces.IClearCopyrightable 72 80 .interfaces.IAccessibilityCompliantable 73 81 .interfaces.ICourseOrderable 74 zope.annotation.interfaces.IAttributeAnnotatable"82 zope.annotation.interfaces.IAttributeAnnotatable" 75 83 /> 76 84 </class> … … 80 88 .interfaces.IAccessibilityCompliantable 81 89 .interfaces.ICourseOrderable 82 zope.annotation.interfaces.IAttributeAnnotatable"90 zope.annotation.interfaces.IAttributeAnnotatable" 83 91 /> 84 92 </class> … … 88 96 .interfaces.IAccessibilityCompliantable 89 97 .interfaces.ICourseOrderable 90 zope.annotation.interfaces.IAttributeAnnotatable"98 zope.annotation.interfaces.IAttributeAnnotatable" 91 99 /> 92 100 </class> … … 96 104 .interfaces.IAccessibilityCompliantable 97 105 .interfaces.ICourseOrderable 98 zope.annotation.interfaces.IAttributeAnnotatable"106 zope.annotation.interfaces.IAttributeAnnotatable" 99 107 /> 100 108 </class> … … 104 112 .interfaces.IAccessibilityCompliantable 105 113 .interfaces.ICourseOrderable 106 zope.annotation.interfaces.IAttributeAnnotatable"114 zope.annotation.interfaces.IAttributeAnnotatable" 107 115 /> 108 116 </class> … … 112 120 .interfaces.IAccessibilityCompliantable 113 121 .interfaces.ICourseOrderable 114 zope.annotation.interfaces.IAttributeAnnotatable"122 zope.annotation.interfaces.IAttributeAnnotatable" 115 123 /> 116 124 </class> … … 120 128 .interfaces.IAccessibilityCompliantable 121 129 .interfaces.ICourseOrderable 122 zope.annotation.interfaces.IAttributeAnnotatable"130 zope.annotation.interfaces.IAttributeAnnotatable" 123 131 /> 124 132 </class> … … 128 136 .interfaces.IAccessibilityCompliantable 129 137 .interfaces.ICourseOrderable 130 zope.annotation.interfaces.IAttributeAnnotatable"138 zope.annotation.interfaces.IAttributeAnnotatable" 131 139 /> 132 140 </class> … … 216 224 /> 217 225 218 <!-- 219 <subscriber 220 for="enpraxis.educommons.interfaces.ICourse 221 zope.lifecycleevent.interfaces.IObjectModifiedEvent" 222 handler=".eventHandlers.updateZipDownload" 223 /> 224 225 <subscriber 226 for="Products.ATContentTypes.content.document.ATDocument 227 zope.lifecycleevent.interfaces.IObjectModifiedEvent" 228 handler=".eventHandlers.updateZipDownload" 229 /> 230 231 <subscriber 232 for="Products.ATContentTypes.content.file.ATFile 233 zope.lifecycleevent.interfaces.IObjectModifiedEvent" 234 handler=".eventHandlers.updateZipDownload" 235 /> 236 237 <subscriber 238 for="Products.ATContentTypes.content.image.ATImage 239 zope.lifecycleevent.interfaces.IObjectModifiedEvent" 240 handler=".eventHandlers.updateZipDownload" 241 /> 242 243 <subscriber 244 for="Products.ATContentTypes.content.folder.ATFolder 245 zope.lifecycleevent.interfaces.IObjectModifiedEvent" 246 handler=".eventHandlers.updateZipDownload" 247 /> 248 249 <subscriber 250 for="Products.ATContentTypes.content.link.ATLink 251 zope.lifecycleevent.interfaces.IObjectModifiedEvent" 252 handler=".eventHandlers.updateZipDownload" 253 /> 254 255 256 <subscriber 257 for=".interfaces.ICourseUpdateEvent" 258 handler=".eventHandlers.ZipFileMaker" 259 /> 260 261 <subscriber 262 for=".interfaces.IDeleteCourseObjectEvent" 263 handler=".eventHandlers.deleteObjectHandler" 264 /> 265 --> 226 <subscriber 227 for="enpraxis.educommons.interfaces.ISchool 228 zope.app.container.interfaces.IObjectAddedEvent" 229 handler=".eventHandlers.syndicateFolderishObject" 230 /> 231 266 232 267 233 <subscriber -
enpraxis.educommons/trunk/enpraxis/educommons/content/division.py
r506 r632 27 27 from Products.ATContentTypes.configuration import zconf 28 28 from Products.ATContentTypes.atct import ATFolder, ATFolderSchema 29 from Products.ATContentTypes.lib.historyaware import HistoryAwareMixin30 29 from Products.ATContentTypes.content.base import registerATCT 31 30 from Products.ATContentTypes.content.schemata import finalizeATCTSchema 32 from zope.interface import implements33 31 from AccessControl import ClassSecurityInfo 34 from Products.CMFCore.permissions import AddPortalContent35 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile36 32 from enpraxis.educommons.interfaces import IDivision 37 33 from enpraxis.educommons.config import PROJECTNAME 38 39 34 from enpraxis.educommons import eduCommonsMessageFactory as _ 40 35 36 from zope.interface import implements 41 37 42 38 DivisionSchema = ATFolderSchema.copy() + Schema(( -
enpraxis.educommons/trunk/enpraxis/educommons/content/__init__.py
r506 r632 24 24 from division import Division 25 25 from course import Course 26 from school import School 26 27 from feedback import Feedback 27 28 from fssfile import FSSFile -
enpraxis.educommons/trunk/enpraxis/educommons/eventHandlers.py
r506 r632 22 22 23 23 # eventHandlers.py 24 25 26 from enpraxis.educommons.interfaces import ICourse, IDivision27 from Products.CMFDefault.SyndicationTool import SyndicationTool28 24 from Products.CMFDefault.SyndicationInfo import SyndicationInformation 29 from collective.contentlicensing.utilities.interfaces import IContentLicensingUtility30 25 from collective.zipfiletransport.utilities.interfaces import IZipFileTransportUtility 31 26 from zope.annotation.interfaces import IAnnotations 32 27 from zope.app.container.interfaces import IContainerModifiedEvent 33 28 34 from zope.schema.interfaces import IVocabularyFactory35 from zope.formlib.form import action36 29 from utilities.interfaces import IECUtility 37 30 from zope.component import getUtility, queryUtility 38 import transaction39 from xml.dom import minidom40 import mimetypes41 31 import re 42 from App.config import getConfiguration43 import os44 32 45 33 … … 139 127 140 128 141 142 143 129 ## Deprecated for 3.1.0, as auto generated Course packages have been disabled 144 130 ## Replaced by Package Course functionality :: browser/packagecourseview.py -
enpraxis.educommons/trunk/enpraxis/educommons/events.py
r506 r632 25 25 from zope.annotation.interfaces import IAnnotations 26 26 from plone.portlets.interfaces import IPortletManager, IPortletAssignmentMapping 27 from Products.CMFPlone.utils import _createObjectByType28 from Products.CMFCore.utils import getToolByName29 27 from enpraxis.educommons import portlet 30 28 from enpraxis.educommons.utilities.interfaces import IECUtility 31 from enpraxis.educommons.interfaces import IClearCopyrightable, IC learCopyright, ICourseUpdateEvent, IDeleteCourseObjectEvent, IAccessibilityCompliantable, IAccessibilityCompliant29 from enpraxis.educommons.interfaces import IClearCopyrightable, ICourseUpdateEvent, IDeleteCourseObjectEvent, IAccessibilityCompliantable 32 30 from zope.component.interfaces import ObjectEvent 33 31 from zope.interface import implements … … 101 99 102 100 103 104 101 class CourseUpdate(ObjectEvent): 105 102 """ Set namespace information in manifest. """ -
enpraxis.educommons/trunk/enpraxis/educommons/interfaces.py
r506 r632 22 22 23 23 from zope.interface import Interface 24 from zope.viewlet.interfaces import IViewletManager25 24 from zope.annotation.interfaces import IAnnotatable 26 25 from zope.app.event.interfaces import IObjectEvent … … 43 42 class IFeedback(Interface): 44 43 """ Marker interface for Feedback object type. """ 44 45 class ISchool(Interface): 46 """ Marker interface for School object type. """ 47 45 48 46 49 class IClearCopyrightable(IAnnotatable): -
enpraxis.educommons/trunk/enpraxis/educommons/portlet/configure.zcml
r8 r632 71 71 /> 72 72 73 <!-- 74 <utility 75 provides="zope.schema.interfaces.IVocabularyFactory" 76 component=".coursebuilderform.schoolsvocab" 77 name="eduCommons.schoolsvocab" 78 /> 79 --> 80 73 81 <utility 74 82 provides="zope.schema.interfaces.IVocabularyFactory" -
enpraxis.educommons/trunk/enpraxis/educommons/portlet/coursebuilderform.py
r506 r632 25 25 from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm 26 26 from plone.app.form.base import AddForm 27 from plone.app.form.validators import null_validator28 27 from plone.app.controlpanel.widgets import MultiCheckBoxVocabularyWidget 29 from zope.formlib.form import FormFields, action , applyChanges28 from zope.formlib.form import FormFields, action 30 29 from zope.app.form.browser import DropdownWidget, FileWidget, RadioWidget 31 30 from zope.app.form.browser.widget import renderElement 32 31 from zope.app.form.interfaces import WidgetInputError 33 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile34 32 from Products.CMFPlone import PloneMessageFactory 35 33 from enpraxis.educommons import eduCommonsMessageFactory as _ 36 from zope.app.i18n import ZopeMessageFactory as __37 34 from Products.CMFCore.utils import getToolByName 38 35 from collective.imstransport.browser.importform import ZipFileLine … … 51 48 return widget 52 49 50 #def schoolsvocab(context): 51 # """ Get the list of current divisions and return it as a vocabulary. """ 52 # path = {'query':('/'), } 53 # brains = context.portal_catalog.searchResults(path=path, Type='School', sort_on='sortable_title') 54 # terms = [SimpleTerm(x.getId, title=x.Title.decode('utf-8') ) for x in brains] 55 56 # return SimpleVocabulary(terms) 57 53 58 def divisionsvocab(context): 54 59 """ Get the list of current divisions and return it as a vocabulary. """ 55 60 path = {'query':('/'), } 56 61 brains = context.portal_catalog.searchResults(path=path, Type='Division', sort_on='sortable_title') 57 terms = [SimpleTerm(x.getId, title=x.Title.decode('utf-8') ) for x in brains] 62 terms = [] 63 for brain in brains: 64 if brain.getObject().aq_parent.portal_type == 'School': 65 title = '%s : %s' % (brain.getObject().aq_parent.Title().decode('utf-8'), brain.Title.decode('utf-8')) 66 else: 67 title = brain.Title.decode('utf-8') 68 terms += [SimpleTerm(brain.getId, title=title),] 69 #terms = [SimpleTerm(x.getId, title=x.Title.decode('utf-8') ) for x in brains] 70 58 71 return SimpleVocabulary(terms) 59 72 … … 122 135 value = '' 123 136 contents = [] 124 have_results = False125 137 126 138 # Render the Drop Down … … 133 145 contents.append(self._div('value', renderElement('input', 134 146 type='text', 135 name=' form.newdivision',136 id=' form.division.textfield')))147 name='.new'.join(self.name.split(',')), 148 id='%s.textfield' % self.name))) 137 149 138 150 contents.append(self._emptyMarker()) … … 148 160 vocabulary='eduCommons.divisionsvocab') 149 161 150 coursename = TextLine(title=PloneMessageFactory(u'Title') ) 162 # school = Choice(title=_(u'School'), 163 # required=False, 164 # vocabulary='eduCommons.schoolsvocab') 165 166 167 coursename = TextLine(title=PloneMessageFactory(u'Course Title') ) 151 168 152 169 courseid = TextLine(title=_(u'Course ID'), … … 181 198 form_fields = FormFields(ICourseBuilderForm) 182 199 form_fields['division'].custom_widget = EitherOrWidget 200 # form_fields['school'].custom_widget = EitherOrWidget 183 201 form_fields['templates'].custom_widget = MultiPreSelectCheckBoxVocabularyWidget 184 202 form_fields['filename'].custom_widget = FileWidget … … 220 238 divname = self.request.form['form.division'] 221 239 newdivision = self.request.form['form.newdivision'] 240 222 241 if newdivision: 223 242 portal = self.context.portal_url -
enpraxis.educommons/trunk/enpraxis/educommons/portlet/simplenavportlet.py
r506 r632 58 58 'getExcludeFromNav':False, 59 59 'sort_on':'getObjPositionInCourse'} 60 61 60 brains = self.context.portal_catalog.searchResults(path) 62 61 62 elif self.isDivisionObject(): 63 parent = self.getDivisionParent() 64 path = {'path':{'query':'/'.join(parent.getPhysicalPath())+'/'}, 65 'getExcludeFromNav':False, 66 'portal_type':'Division', 67 'sort_on':'sortable_title'} 68 brains = self.context.portal_catalog.searchResults(path) 69 63 70 else: 64 brains = self.context.portal_catalog.searchResults(Type='Division', 65 sort_on='sortable_title') 71 brains = self.context.portal_catalog.searchResults(Type='School', 72 sort_on='sortable_title') 73 if len(brains) == 0: 74 brains = self.context.portal_catalog.searchResults(Type='Division', 75 sort_on='sortable_title') 76 77 66 78 return [obj for obj in brains if not getattr(obj.aq_explicit, 'exclude_from_nav', True)] 67 79 … … 70 82 return 'Course' == self.ecparent.Type() 71 83 84 def isDivisionObject(self): 85 """ Check if this object is in a Division. """ 86 return 'Division' == self.ecparent.Type() 87 88 def getDivisionParent(self): 89 """ Check if parent is Division of Portal. """ 90 if self.aq_parent.aq_inner.aq_parent.portal_type == 'School': 91 return self.aq_parent.aq_inner.aq_parent 92 else: 93 return self.context.portal_url.getPortalObject() 94 72 95 def isSelected(self, item): 73 """ Check if the naviga ion item is the one being displayed. """96 """ Check if the navigation item is the one being displayed. """ 74 97 if '/'.join(item.getPath().split('/')[1:]) == self.context.virtual_url_path(): 75 98 return 'portletItem portletItemSelected' … … 82 105 if self.isCourseObject(): 83 106 return ts.translate(ecprops.course_descriptor) 107 elif self.isDivisionObject(): 108 return ecprops.division_descriptor 84 109 else: 85 return ecprops.division_descriptor 110 brains = self.context.portal_catalog.searchResults(Type='School', 111 sort_on='sortable_title') 112 if len(brains) == 0: 113 return ecprops.division_descriptor 114 return ecprops.school_descriptor 86 115 87 116 def get_view_url(self, item): -
enpraxis.educommons/trunk/enpraxis/educommons/profiles/default/propertiestool.xml
r538 r632 26 26 <object name="educommons_properties" meta_type="Plone Property Sheet"> 27 27 <property name="title">eduCommons properties</property> 28 <property name="school_descriptor" type="string">Schools</property> 28 29 <property name="division_descriptor" type="string">Divisions</property> 29 30 <property name="course_descriptor" type="string" i18n:translate="">Course Contents</property> -
enpraxis.educommons/trunk/enpraxis/educommons/profiles/default/types.xml
r8 r632 3 3 <object name="CoursesTopic" 4 4 meta_type="Factory-based Type Information with dynamic views"/> 5 <object name="School" 6 meta_type="Factory-based Type Information with dynamic views"/> 5 7 <object name="Division" 6 8 meta_type="Factory-based Type Information with dynamic views"/> -
enpraxis.educommons/trunk/enpraxis/educommons/profiles/default/workflows.xml
r8 r632 5 5 <object name="content_workflow" meta_type="Workflow"/> 6 6 <bindings> 7 7 <type type_id="School"> 8 <bound-workflow workflow_id="content_workflow"/> 9 </type> 8 10 <type type_id="Course"> 9 11 <bound-workflow workflow_id="content_workflow"/>
