def test_folders_created_with_default_subobjects(self): for i in range(2): folder = getattr(self.portal.info, 'subfolder' + str(i)) fmt = FolderMetaTypes(folder) self.assertFalse(fmt.has_custom_value) self.assertEqual(set(fmt.get_values()), set(self.portal.adt_meta_types))
def _update(self, portal): portal_properties = portal.getPropertiesTool() global_subobjects = set(portal.adt_meta_types) all_nyfolders = ofs_walk(portal, [INyFolder], [IFolder]) patched = 0 customized = 0 for nyfolder in all_nyfolders: if global_subobjects != set(nyfolder.folder_meta_types): # subobjects are different, they were prev. modified # keep the folder_meta_types list as it is customized += 1 else: # same with global, mark it with `Uses default` (None) fmt = FolderMetaTypes(nyfolder) fmt.set_values(None) patched += 1 self.log.info(("%d folders now use default subobjects setting, " "%d folders have subobject customizations") % (patched, customized)) if not add_admin_entry(self, portal, ("""<li tal:condition="canPublish"><a """ """tal:attributes="href string:${site_url}/""" """admin_folder_subobjects_html" title""" """="Portal comments" i18n:attributes="title" """ """i18n:translate="">Folder subobjects</a></li>"""), '${site_url}/admin_maintopics_html"'): self.log.error("MANUAL action: Insert link html in admin portlet") return False else: return True return True
def test_setting_default_subobjects(self): self.portal_properties.manageSubobjects(['ZopeType0', 'ZopeType1'], ['NyType0', 'NyType1']) fmt = FolderMetaTypes(self.portal.info) self.assertEqual(set(fmt.get_values()), set(['ZopeType0', 'ZopeType1', 'NyType0', 'NyType1'])) self.assertEqual(set(fmt.get_values()), set(self.portal.adt_meta_types))
def create_month_folder(self, contributor, schema_raw_data): #Creating archive folder news_date = self.utConvertStringToDateTimeObj( schema_raw_data.get('news_date', None)) news_date_year = str(news_date.year()) news_date_month = news_date.mm() year_folder = self._getOb(news_date_year, None) if year_folder is None: year_folder = self._getOb( addNyFolder(self, news_date_year, contributor=contributor, title="News for %s" % news_date_year)) month_folder = year_folder._getOb(news_date_month, None) if month_folder is None: month_folder = year_folder._getOb( addNyFolder(year_folder, news_date_month, contributor=contributor, title="News for %s/%s" % (news_date_year, news_date_month))) FolderMetaTypes(month_folder).add(config['meta_type']) return month_folder
def setUp(self): super(BlobFileTest, self).setUp() # "Naaya Blob File" is not installed by default self.portal.manage_uninstall_pluggableitem("Naaya File") self.portal.manage_install_pluggableitem("Naaya Blob File") FolderMetaTypes(self.portal.info).add("Naaya Blob File") transaction.commit()
def export_this_tag_custom(self): meta_types = FolderMetaTypes(self).get_values() return 'custom_index="%s" maintainer_email="%s" folder_meta_types="%s" themes="%s" criteria_date="%s"' % \ (self.utXmlEncode(self.compute_custom_index_value()), self.utXmlEncode(self.maintainer_email), self.utXmlEncode(','.join(meta_types)), self.utXmlEncode(self.themes), self.utXmlEncode(self.criteria_date))
def _update(self, portal): to_add = "Naaya Forum" filter_out_folders = ["news", "events", "stories"] filter_out_folders_cap = [f.capitalize() for f in filter_out_folders] filter_out_folders.extend(filter_out_folders_cap) self.log.debug("Filtering out folders: %s", filter_out_folders) prop_tool = portal.getPropertiesTool() ny_subobjects = [item for item in prop_tool.getProductsMetaTypes() if item in prop_tool.adt_meta_types] subobjects = [item for item in prop_tool.get_meta_types(1) if item in prop_tool.adt_meta_types] self.log.debug("Found ny_subobjects: %s and subobjects: %s" % (ny_subobjects, subobjects)) if to_add not in ny_subobjects: self.log.debug("Adding %s to ny_subobjects" % to_add) ny_subobjects.append(to_add) prop_tool.manageSubobjects(subobjects, ny_subobjects) ny_folders = [folder for folder in portal.getCatalogedObjectsCheckView(meta_type="Naaya Folder")] filtered_folders = [] for folder in ny_folders: f_splits = folder.absolute_url(1).split("/") for fs in f_splits: if fs in filter_out_folders: break else: filtered_folders.append(folder) ny_folders = filtered_folders i, j = 0, 0 for folder in ny_folders: meta_types = FolderMetaTypes(folder) f_mt = meta_types.get_values() if to_add not in f_mt: meta_types.add(to_add) i += 1 self.log.debug("Updated folder %s" % folder.absolute_url(1)) else: j += 1 self.log.debug("Skipped folder %s" % folder.absolute_url(1)) self.log.debug("Updated %s folders | Skipped %s folders | Total %s folders" % (i, j, i + j)) return True
def _update(self, portal): to_add = "Naaya Forum" filter_out_folders = ['news', 'events', 'stories'] filter_out_folders_cap = [f.capitalize() for f in filter_out_folders] filter_out_folders.extend(filter_out_folders_cap) self.log.debug('Filtering out folders: %s', filter_out_folders) prop_tool = portal.getPropertiesTool() ny_subobjects = [item for item in prop_tool.getProductsMetaTypes() if item in prop_tool.adt_meta_types] subobjects = [item for item in prop_tool.get_meta_types(1) if item in prop_tool.adt_meta_types] self.log.debug('Found ny_subobjects: %s and subobjects: %s' % (ny_subobjects, subobjects)) if to_add not in ny_subobjects: self.log.debug('Adding %s to ny_subobjects' % to_add) ny_subobjects.append(to_add) prop_tool.manageSubobjects(subobjects, ny_subobjects) ny_folders = [folder for folder in portal.getCatalogedObjectsCheckView(meta_type="Naaya Folder")] filtered_folders = [] for folder in ny_folders: f_splits = folder.absolute_url(1).split('/') for fs in f_splits: if fs in filter_out_folders: break else: filtered_folders.append(folder) ny_folders = filtered_folders i, j = 0, 0 for folder in ny_folders: meta_types = FolderMetaTypes(folder) f_mt = meta_types.get_values() if to_add not in f_mt: meta_types.add(to_add) i+=1 self.log.debug('Updated folder %s' % folder.absolute_url(1)) else: j+=1 self.log.debug('Skipped folder %s' % folder.absolute_url(1)) self.log.debug('Updated %s folders | Skipped %s folders | Total %s folders' % (i, j, i+j)) return True
def update_subobjects(self, portal): """ Update allowed subobject in Naaya Folders if Naaya Extended File is present in this list Required arguments: portal -- Naaya Site instance """ # Subobjects meta_types = portal.adt_meta_types[:] changed = False if 'Naaya Extended File' in meta_types: meta_types.remove('Naaya Extended File') changed = True if 'Naaya Blob File' not in meta_types: meta_types.append('Naaya Blob File') changed = True if changed: self.log.debug('Updating portal %s subobjects = %s', portal.absolute_url(1), meta_types) portal.portal_properties.manageSubobjects(subobjects=meta_types) brains = portal.portal_catalog(meta_type='Naaya Folder') for brain in brains: doc = brain.getObject() if not doc: continue self.log.debug("Replacing object %s", doc.absolute_url()) folder_meta_types = FolderMetaTypes(doc) meta_types = folder_meta_types.get_values() changed = False if 'Naaya Extended File' in meta_types: meta_types.remove('Naaya Extended File') changed = True if 'Naaya Blob File' not in meta_types: meta_types.append('Naaya Blob File') changed = True if changed: self.log.debug('Updating folder %s subobjects = %s', doc.absolute_url(1), meta_types) folder_meta_types.set_values(meta_types)
def update_subobjects(self, portal): # Subobjects meta_types = portal.adt_meta_types[:] if 'Naaya File' in meta_types: meta_types.remove('Naaya File') meta_types.append('Naaya Blob File') self.log.debug('Updating portal %s subobjects = %s', portal.absolute_url(1), meta_types) portal.portal_properties.manageSubobjects(subobjects=meta_types) brains = portal.portal_catalog(meta_type='Naaya Folder') for brain in brains: doc = brain.getObject() if not doc: continue folder_meta_types = FolderMetaTypes(doc) meta_types = folder_meta_types.get_values() if 'Naaya File' in meta_types: meta_types.remove('Naaya File') meta_types.append('Naaya Blob File') self.log.debug('Updating folder %s subobjects = %s', doc.absolute_url(1), meta_types) doc.manageSubobjects(subobjects=meta_types)
def _update(self, portal): portal_properties = portal.getPropertiesTool() global_subobjects = set(portal.adt_meta_types) all_nyfolders = ofs_walk(portal, [INyFolder], [IFolder]) patched = 0 customized = 0 for nyfolder in all_nyfolders: if global_subobjects != set(nyfolder.folder_meta_types): # subobjects are different, they were prev. modified # keep the folder_meta_types list as it is customized += 1 else: # same with global, mark it with `Uses default` (None) fmt = FolderMetaTypes(nyfolder) fmt.set_values(None) patched += 1 self.log.info( ("%d folders now use default subobjects setting, " "%d folders have subobject customizations") % (patched, customized) ) if not add_admin_entry( self, portal, ( """<li tal:condition="canPublish"><a """ """tal:attributes="href string:${site_url}/""" """admin_folder_subobjects_html" title""" """="Portal comments" i18n:attributes="title" """ """i18n:translate="">Folder subobjects</a></li>""" ), '${site_url}/admin_maintopics_html"', ): self.log.error("MANUAL action: Insert link html in admin portlet") return False else: return True return True
def saveProperties(self, REQUEST=None, **kwargs): """ """ if not self.checkPermissionEditObject(): raise EXCEPTION_NOTAUTHORIZED, EXCEPTION_NOTAUTHORIZED_MSG if self.hasVersion(): obj = self.version if self.checkout_user != self.REQUEST.AUTHENTICATED_USER.getUserName( ): raise EXCEPTION_NOTAUTHORIZED, EXCEPTION_NOTAUTHORIZED_MSG else: obj = self if REQUEST is not None: schema_raw_data = dict(REQUEST.form) else: schema_raw_data = kwargs _lang = schema_raw_data.pop('_lang', schema_raw_data.pop('lang', None)) info_type = schema_raw_data.pop('info_type', None) self.info_type = info_type FolderMetaTypes(self).set_values(self.get_meta_types()) self.set_categories() form_errors = self.process_submitted_form(schema_raw_data, _lang) if not form_errors: if self.discussion: self.open_for_comments() else: self.close_for_comments() self._p_changed = 1 self.recatalogNyObject(self) #log date contributor = self.REQUEST.AUTHENTICATED_USER.getUserName() auth_tool = self.getAuthenticationTool() auth_tool.changeLastPost(contributor) notify(NyContentObjectEditEvent(self, contributor)) if REQUEST: self.setSessionInfoTrans(MESSAGE_SAVEDCHANGES, date=self.utGetTodayDate()) REQUEST.RESPONSE.redirect('%s/edit_html?lang=%s' % (self.absolute_url(), _lang)) else: if REQUEST is not None: self._prepare_error_response(REQUEST, form_errors, schema_raw_data) REQUEST.RESPONSE.redirect('%s/edit_html?lang=%s' % (self.absolute_url(), _lang)) else: raise ValueError( form_errors.popitem()[1]) # pick a random error
def setUp(self): super(TestFolderMetaTypesAdapter, self).setUp() addNyFolder(self.portal.info, 'subfolder0', contributor='contributor', submission=1) addNyFolder(self.portal.info, 'subfolder1', contributor='contributor', submission=1) self.wrapped = [ FolderMetaTypes(x) for x in [ self.portal.info, self.portal.info.subfolder0, self.portal.info.subfolder1 ] ] self.defaults = self.portal.adt_meta_types
def afterSetUp(self): self.portal.manage_install_pluggableitem('Naaya GeoPoint') from Products.Naaya.NyFolder import addNyFolder from naaya.content.geopoint.geopoint_item import addNyGeoPoint addNyFolder(self.portal, 'myfolder', contributor='contributor', submitted=1) FolderMetaTypes(self.portal.myfolder).add('Naaya GeoPoint') addNyGeoPoint(self.portal.myfolder, id='mygeopoint', title='My geopoint', submitted=1, contributor='contributor', geo_location=Geo('13', '13')) import transaction transaction.commit()
def process_submissions(self): """Returns info meta_types and their constructors views that can be added inside a folder. [(FUNC_NAME, LABEL), (...), ...] """ folder_meta_types = FolderMetaTypes(self).get_values() r = [] ra = r.append # check for adding folders if METATYPE_FOLDER in folder_meta_types: if self.checkPermission(PERMISSION_ADD_FOLDER): ra(('folder_add_html', LABEL_NYFOLDER)) # check for adding dynamic registered content types for dynamic_key, dynamic_value in self._dynamic_content_types.items(): if dynamic_key in folder_meta_types: if self.checkPermission(dynamic_value[2]): ra(dynamic_value[:2]) # check pluggable content pc = self.get_pluggable_content() schema_tool = self.getSchemaTool() for k in self.get_pluggable_installed_meta_types(): if k not in folder_meta_types: continue if k not in pc: continue if not self.checkPermission(pc[k]['permission']): continue schema = schema_tool.getSchemaForMetatype(k) if schema is not None: meta_label = schema.title_or_id() else: meta_label = pc[k]['label'] ra((pc[k]['add_form'], meta_label)) return r
def test_subobjects_customization(self): # customize one subfolder self.portal.info.subfolder1.manageSubobjects(subobjects=[], ny_subobjects=['Naaya Document']) # change global setting portal_properties = self.portal.getPropertiesTool() portal_properties.manageSubobjects([], ['Naaya Calendar']) fmt0 = FolderMetaTypes(self.portal.info.subfolder0) fmt1 = FolderMetaTypes(self.portal.info.subfolder1) # check self.assertEqual(set(fmt0.get_values()), set(['Naaya Calendar'])) self.assertFalse(fmt0.has_custom_value) self.assertEqual(set(fmt1.get_values()), set(['Naaya Document'])) self.assertTrue(fmt1.has_custom_value)
def addNyInfoFolder(self, id='', REQUEST=None, contributor=None, **kwargs): """ Create an infofolder type of object. """ #process parameters if REQUEST is not None: schema_raw_data = dict(REQUEST.form) else: schema_raw_data = kwargs _lang = schema_raw_data.pop('_lang', schema_raw_data.pop('lang', None)) _folder_meta_types = schema_raw_data.pop('folder_meta_types', '') id = make_id(self, id=id, title=schema_raw_data.get('title', ''), prefix='infofolder') if contributor is None: contributor = self.REQUEST.AUTHENTICATED_USER.getUserName() ob = _create_NyInfoFolder_object(self, id, contributor) ob.info_type = 'enterprises' ob.set_categories() _releasedate = DateTime() form_errors = ob.process_submitted_form(schema_raw_data, _lang, _override_releasedate=_releasedate) if form_errors: if REQUEST is None: raise ValueError(form_errors.popitem()[1]) # pick a random error else: import transaction transaction.abort( ) # because we already called _crete_NyZzz_object ob._prepare_error_response(REQUEST, form_errors, schema_raw_data) return REQUEST.RESPONSE.redirect('%s/infofolder_add_html' % self.absolute_url()) return site = self.getSite() #extra settings ob_meta_types = FolderMetaTypes(ob) parent_meta_types = FolderMetaTypes(self) if _folder_meta_types == '': #inherit allowd meta types from the parent if self.meta_type == site.meta_type: ob_meta_types.set_values(site.adt_meta_types) else: if not parent_meta_types.has_custom_value: # if parent uses defaults, so should `ob` ob_meta_types.set_values(None) else: ob_meta_types.set_values(parent_meta_types.get_values()) else: ob_meta_types.set_values(self.utConvertToList(_folder_meta_types)) if self.glCheckPermissionPublishObjects(): approved, approved_by = 1, self.REQUEST.AUTHENTICATED_USER.getUserName( ) else: approved, approved_by = 0, None ob.approveThis(approved, approved_by) ob.submitThis() #Process extra fields (categories, extra_properties) if ob.discussion: ob.open_for_comments() self.recatalogNyObject(ob) notify(NyContentObjectAddEvent(ob, contributor, schema_raw_data)) #log post date auth_tool = self.getAuthenticationTool() auth_tool.changeLastPost(contributor) #redirect if case if REQUEST is not None: #l_referer = REQUEST['HTTP_REFERER'].split('/')[-1] #if l_referer == 'infofolder_manage_add' or l_referer.find('infofolder_manage_add') != -1: #return self.manage_main(self, REQUEST, update_menu=1) #elif l_referer == 'infofolder_add_html': #self.setSession('referer', self.absolute_url()) #return ob.object_submitted_message(REQUEST) #REQUEST.RESPONSE.redirect('%s/messages_html' % self.absolute_url()) REQUEST.RESPONSE.redirect('%s/%s/edit_html' % (self.absolute_url(), id)) return ob.getId()
def addNyInfoFolder(self, id='', REQUEST=None, contributor=None, **kwargs): """ Create an infofolder type of object. """ #process parameters if REQUEST is not None: schema_raw_data = dict(REQUEST.form) else: schema_raw_data = kwargs _lang = schema_raw_data.pop('_lang', schema_raw_data.pop('lang', None)) _folder_meta_types = schema_raw_data.pop('folder_meta_types', '') id = make_id(self, id=id, title=schema_raw_data.get('title', ''), prefix='infofolder') if contributor is None: contributor = self.REQUEST.AUTHENTICATED_USER.getUserName() ob = _create_NyInfoFolder_object(self, id, contributor) ob.info_type = 'enterprises' ob.set_categories() _releasedate = DateTime() form_errors = ob.process_submitted_form(schema_raw_data, _lang, _override_releasedate=_releasedate) if form_errors: if REQUEST is None: raise ValueError(form_errors.popitem()[1]) # pick a random error else: import transaction; transaction.abort() # because we already called _crete_NyZzz_object ob._prepare_error_response(REQUEST, form_errors, schema_raw_data) return REQUEST.RESPONSE.redirect('%s/infofolder_add_html' % self.absolute_url()) return site = self.getSite() #extra settings ob_meta_types = FolderMetaTypes(ob) parent_meta_types = FolderMetaTypes(self) if _folder_meta_types == '': #inherit allowd meta types from the parent if self.meta_type == site.meta_type: ob_meta_types.set_values(site.adt_meta_types) else: if not parent_meta_types.has_custom_value: # if parent uses defaults, so should `ob` ob_meta_types.set_values(None) else: ob_meta_types.set_values(parent_meta_types.get_values()) else: ob_meta_types.set_values(self.utConvertToList(_folder_meta_types)) if self.glCheckPermissionPublishObjects(): approved, approved_by = 1, self.REQUEST.AUTHENTICATED_USER.getUserName() else: approved, approved_by = 0, None ob.approveThis(approved, approved_by) ob.submitThis() #Process extra fields (categories, extra_properties) if ob.discussion: ob.open_for_comments() self.recatalogNyObject(ob) notify(NyContentObjectAddEvent(ob, contributor, schema_raw_data)) #log post date auth_tool = self.getAuthenticationTool() auth_tool.changeLastPost(contributor) #redirect if case if REQUEST is not None: #l_referer = REQUEST['HTTP_REFERER'].split('/')[-1] #if l_referer == 'infofolder_manage_add' or l_referer.find('infofolder_manage_add') != -1: #return self.manage_main(self, REQUEST, update_menu=1) #elif l_referer == 'infofolder_add_html': #self.setSession('referer', self.absolute_url()) #return ob.object_submitted_message(REQUEST) #REQUEST.RESPONSE.redirect('%s/messages_html' % self.absolute_url()) REQUEST.RESPONSE.redirect('%s/%s/edit_html' % (self.absolute_url(), id)) return ob.getId()
def loadDefaultData(self): """ """ #set default 'Naaya' configuration NySite.__dict__['createPortalTools'](self) NySite.__dict__['loadDefaultData'](self) #remove Naaya default content layout_tool = self.getLayoutTool() naaya_skins = [skin.getId() for skin in layout_tool.objectValues('Naaya Skin')] logos = [image.getId() for image in layout_tool.objectValues('Image')] layout_tool.manage_delObjects(naaya_skins + logos) self.manage_delObjects('info') #load site skeleton - configuration self.loadSkeleton(ENVIROWINDOWS_PRODUCT_PATH) #custom indexes try: self.getCatalogTool().manage_addIndex('resource_area', 'TextIndexNG2', extra={'default_encoding': 'utf-8', 'splitter_single_chars': 1}) except: pass try: self.getCatalogTool().manage_addIndex('resource_focus', 'TextIndexNG2', extra={'default_encoding': 'utf-8', 'splitter_single_chars': 1}) except: pass try: self.getCatalogTool().manage_addIndex('resource_area_exp', 'TextIndexNG2', extra={'default_encoding': 'utf-8', 'splitter_single_chars': 1}) except: pass try: self.getCatalogTool().manage_addIndex('resource_focus_exp', 'TextIndexNG2', extra={'default_encoding': 'utf-8', 'splitter_single_chars': 1}) except: pass try: self.getCatalogTool().manage_addIndex('resource_country', 'TextIndexNG2', extra={'default_encoding': 'utf-8', 'splitter_single_chars': 1}) except: pass #default RDF Calendar settings manage_addRDFCalendar(self, id=ID_RDFCALENDAR, title=TITLE_RDFCALENDAR, week_day_len=1) rdfcalendar_ob = self._getOb(ID_RDFCALENDAR) #adding local_events Script (Python) manage_addPythonScript(rdfcalendar_ob, 'local_events') local_events_ob = rdfcalendar_ob._getOb('local_events') local_events_ob._params = 'year=None, month=None, day=None' local_events_ob.write(open(os.path.dirname(__file__) + '/skel/others/local_events.py', 'r').read()) #Adding custom SchemaTool properties schema_tool = self.getSchemaTool() naaya_folder_schema = schema_tool.getSchemaForMetatype(METATYPE_FOLDER) widget_args = dict( label='Allow users enrolment here?', data_type='bool', widget_type='Checkbox', localized=True, ) naaya_folder_schema.addWidget('show_contributor_request_role', **widget_args) naaya_consultation_schema = schema_tool.getSchemaForMetatype( 'Naaya Consultation') if naaya_consultation_schema: naaya_consultation_schema.addWidget('show_contributor_request_role', **widget_args) naaya_simple_consultation_schema = schema_tool.getSchemaForMetatype( 'Naaya Simple Consultation') if naaya_simple_consultation_schema: naaya_simple_consultation_schema.addWidget( 'show_contributor_request_role', **widget_args) #add survey tool try: from Products.NaayaSurvey.SurveyTool import manage_addSurveyTool manage_addSurveyTool(self) except: pass self._install_link_checker() addNyFolder(self, id='events', title='Events', publicinterface=1) folder_meta_types = FolderMetaTypes(self._getOb('events')) folder_meta_types.set_values(['Naaya Event']) event_folder_custom_index = ( "<metal:block use-macro=\"python:here.getFormsTool()." "getForm('event_folder_index').macros['page']\" />") self['events']['index'].pt_edit(text=event_folder_custom_index, content_type='')